快速将封面添加到预先线性化的PDF以便流式传输到浏览器?

时间:2009-08-03 22:08:27

标签: c# pdf merge streaming linearization

Question 298829描述了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库,但是也值得了解其他任何选项。

1 个答案:

答案 0 :(得分:0)

你可以尝试使用GhostScript,我认为可以将PDF拼接在一起,但在PDF方面不了解线性化。我有一个可以直接与GhostScript DLL一起使用的C#GhostScript Wrapper,我相信这可以修改为合并PDF。联系方式:redmanscave.blogspot.com