Быстрое добавление титульной страницы в предварительно линеаризованный PDF для потоковой передачи в браузер? - PullRequest
0 голосов
/ 04 августа 2009

Вопрос 298829 описывает, как линеаризация ваших 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 голосов
/ 04 августа 2009

Вы можете попробовать GhostScript, я думаю, что можно сшивать PDF вместе, но не знаю о линеаризации, когда дело доходит до PDF. У меня есть C # GhostScript Wrapper, который можно использовать с DLL GhostScript напрямую, я уверен, что это можно изменить для слияния PDF-файлов. контактные данные по адресу: redmanscave.blogspot.com

...