Простой вопрос, как объединить два объекта PdfDocument с помощью библиотеки itext7 .net?
вот как я пытаюсь, но это не работает
PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));
PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
также этот код вызывает такое же исключение
Merger.Merge(InitialPdfDoc,1,InitialPdfDoc.GetNumberOfPages());
Cannot copy indirect object from the document that is being written
пытался также записать вложенный pdf на диск ---> читать -> другое исключение
Любые идеи !!
"использовать поток памяти" это именно то, что я делаю, параметры multipdfcontent, memStreamOfAddressAndBarcode - это объекты потока памяти
Таким образом, вам нужно закончить этот InitialPdfDoc и загрузить его снова.
Заканчивать? Вы имеете в виду записать его на диск и перезагрузить?
Если вы не хотите, чтобы он записывался в файл, просто используйте поток памяти. Вы также можете перезагрузить его оттуда.
Я не хочу, чтобы это было написано, что вы имеете в виду под завершением документа и загрузкой его снова, какие-либо примеры?
Я создал ответ, иллюстрирующий то, что я описал здесь в комментариях.





Прежде всего: ваш код
PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));
PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
работает! Он не генерирует никаких исключений, а вместо этого ничего не копирует на GlobalPdfDocument. Это правильно, потому что InitialPdfDoc только что создан и еще не содержит никаких страниц.
Но предположим, что вы просто не предоставили достаточно кода для воспроизведения проблемы, предположим, что ваш фактический код добавляет некоторый контент в InitialPdfDoc перед вызовом этого метода CopyPagesTo, например
PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));
PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.AddNewPage();
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
Теперь действительно есть заявленное исключение:
iText.Kernel.PdfException : Cannot copy indirect object from the document that is being written.
В исключении четко указано, что не так с кодом: ваш документ InitialPdfDoc записан (т. Е. Имеет связанный PdfWriter), и поэтому страницы из него нельзя скопировать.
Это ограничение, заключающееся в том, что страницы не могут быть скопированы из документов, в которые записываются, связано с архитектурой iText: когда документ записывается, iText пытается как можно скорее протолкнуть этот новый контент в выходной поток PdfWriter, а затем забывает об этом. Это позволяет iText легко создавать большие PDF-файлы с результатами, не требуя большого количества памяти. Обратной стороной является ограничение, с которым вы сталкиваетесь.
Таким образом, очевидным решением является завершение создания PDF-файла для копирования, его считывание в объект документа без записи и копирование оттуда:
PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));
PdfWriter Writer = new PdfWriter(memStreamOfAddressAndBarcode);
Writer.SetCloseStream(false); // Prevent the Writer from closing the MemoryStream
PdfDocument InitialPdfDoc = new PdfDocument(Writer);
InitialPdfDoc.AddNewPage();
InitialPdfDoc.Close(); // Closing the document finishes the result PDF
memStreamOfAddressAndBarcode.Position = 0; // Re-position the stream to the start of the PDF
InitialPdfDoc = new PdfDocument(new PdfReader(memStreamOfAddressAndBarcode)); // Create r/o document
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
это отличный ответ спасибо
Сообщение об ошибке сообщает вам, что вы не можете копировать страницы из документа, который находится в процессе написания. Таким образом, вам нужно закончить этот
InitialPdfDocи загрузить его снова. Если вы не хотите, чтобы он записывался в файл, просто используйте поток памяти. Таким образом, вам следует сконцентрироваться на решении «прочитать -> другое исключение».