Вопрос 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, но стоило бы услышать и о других возможностях.