0

質問298829は、PDFを線形化することで、PDFをページごとにユーザーのブラウザーにストリーミングできるため、ユーザーはドキュメント全体がダウンロードされるのを待ってから表示を開始する必要がないことを説明しています。このようなPDFの使用は成功していますが、新しい問題があります。ページごとのストリーミングを維持したいが、PDFドキュメントを提供するたびに新しい表紙をPDFドキュメントの先頭に挿入したい。 。(表紙には日付などの時間に敏感な情報が含まれるため、ディスク上のPDFに表紙を含めることは実用的ではありません。)

これを支援するために、事前に線形化されたPDFに表紙をすばやく追加して、ストリーミング可能で線形化されたPDFを出力として生成できるPDFライブラリはありますか?最も懸念されるのは、PDFをマージする合計時間ではなく、マージされたドキュメントの一部をユーザーにストリーミングし始めるまでの時間です。

itextsharpでこれを実行しようとしましたが、ライブラリが線形化されたPDFを出力できないことがわかりました。(http://itext.ugent.be/library/question.php?id=21を参照してください)それでも、次のASP.NET/itextsharpスクラッチコードは、私たちが考えている種類のAPIを示しています。特に、itextsharpが常に線形化されたPDFを出力する場合は、次のようなものがすでに解決策になっている可能性があります。

public class StreamPdf : IHttpHandler
{
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/pdf";
            RandomAccessFileOrArray ramFile = new RandomAccessFileOrArray(@"C:\bigpdf.pdf");
            PdfReader reader1 = new PdfReader(ramFile, null);

            Document doc = new Document();

            // We'll stream the PDF to the ASP.NET output
            // stream, i.e. to the browser: 
            PdfWriter writer = PdfWriter.GetInstance(doc, context.Response.OutputStream);

            writer.Open();
            doc.Open();

            PdfContentByte cb = writer.DirectContent;

            // output cover page:
            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            Font font = new Font(bf, 11, Font.NORMAL);
            ColumnText ct = new ColumnText(cb);
            ct.SetSimpleColumn(60, 300, 600, 300 + 28 * 15, 15, Element.ALIGN_CENTER);
            ct.AddText(new Phrase(15, "This is a cover page information\n", font));
            ct.AddText(new Phrase(15, "Date: " + DateTime.Now.ToShortDateString() + "\n", font));
            ct.Go();

            // output src document: 
            int i = 0;
            while (i < reader1.NumberOfPages)
            {
                i++;

                // add next page from source PDF:
                doc.NewPage();
                PdfImportedPage page = writer.GetImportedPage(reader1, i);
                cb.AddTemplate(page, 0, 0);

                // use something like this to flush the current page to the
                // browser:
                writer.Flush();
                s.Flush();
                context.Response.Flush();


            }
            doc.Close();
            writer.Close();
            s.Close();
        }
    }
}

理想的には.NETライブラリを探していますが、他のオプションについても聞く価値があります。

4

1 に答える 1

0

GhostScript を試すことができます。PDF をつなぎ合わせることは可能だと思いますが、PDF の線形化については知りません。GhostScript dll で直接使用できる C# GhostScript ラッパーがあります。これを変更して PDF をマージできると確信しています。連絡先の詳細: redmanscave.blogspot.com

于 2009-08-04T06:41:30.120 に答える