Я действительно могу что-то упустить, но я сделал что-то намного проще. Я допускаю, что это решение, вероятно, не будет обновлять закладки (как в лучшем ответе здесь пока), но оно работает для меня безупречно. Поскольку я объединял документы с заполняемыми формами, я использовал PdfCopyFields вместо PdfCopy.
Вот код (я удалил всю обработку ошибок, чтобы сделать реальный код более заметным, добавьте попытку .. окончательно закрыть открытые ресурсы, если вы планируете использовать код):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
Вы можете передавать любой поток, будь то FileStream, MemoryStream (полезно при чтении PDF из баз данных, не требуются временные файлы и т. Д.)
Пример использования:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
new FileStream("template1.pdf", FileMode.Open),
new FileStream("template2.pdf", FileMode.Open),
new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"])
};
MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create));
}