Мне нужно объединить N файлов PDF в один. Я создаю пустой файл первыйОбъединение файлов N PDF, созданных из html с использованием ITextSharp, в другой пустой файл pdf
byte[] pdfBytes = null;
var ms = new MemoryStream();
var doc = new iTextSharp.text.Document();
var cWriter = new PdfCopy(doc, ms);
Позже я цикл через HTML строк массива
foreach (NBElement htmlString in someElement.Children())
{
byte[] msTempDoc = getPdfDocFrom(htmlString.GetString(), cssString.GetString());
addPagesToPdf(cWriter, msTempDoc);
}
В getPdfDocFrom создать PDF-файл с помощью XMLWorkerHelper и вернуть его как массив байт
private byte[] getPdfDocFrom(string htmlString, string cssString)
{
var tempMs = new MemoryStream();
byte[] tempMsBytes;
var tempDoc = new iTextSharp.text.Document();
var tempWriter = PdfWriter.GetInstance(tempDoc, tempMs);
tempDoc.Open();
using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssString)))
{
using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(htmlString)))
{
//Parse the HTML
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(tempWriter, tempDoc, msHtml, msCss);
tempMsBytes = tempMs.ToArray();
}
}
tempDoc.Close();
return tempMsBytes;
}
Позже Я пытаюсь добавить страницы из этого файла PDF в пустой.
private static void addPagesToPdf(PdfCopy mainDocWriter, byte[] sourceDocBytes)
{
using (var msOut = new MemoryStream())
{
PdfReader reader = new PdfReader(new MemoryStream(sourceDocBytes));
int n = reader.NumberOfPages;
PdfImportedPage page;
for (int i = 1; i <= n; i++)
{
page = mainDocWriter.GetImportedPage(reader, i);
mainDocWriter.AddPage(page);
}
}}
Он ломается, когда пытается создать PdfReader из массива байтов. Я перехожу к функции. «Не удалось восстановить: трейлер не найден. Исходное сообщение: PDF startxref не найден».
Раньше я использовал другую библиотеку для работы с PDF. Я передал 2 PdfDocuments как объекты и просто добавил страницы из одного в другое в цикле. Однако он не поддерживал Css, поэтому мне пришлось переключиться на ITextSharp.
Я не совсем понимаю разницу между PdfWriter и PdfCopy.
Но MemoryStream становится пустым после закрытия документа. Я не могу создать массив байтов из него –
Вероятно, поэтому люди используют 'mainDocWriter.CloseStream = false;' Я разработчик Java, и мне сложно понять, почему C# освобождает поток памяти после его закрытия. У C# есть некоторые странные загадки, которые я не смог полностью понять. Например, это работает: http: // stackoverflow.ком/вопросы/2815761/создать-PDF-в-памяти-вместо-о-физико-файл –