Я использую библиотеку C ++ PoDoFo (http://podofo.sourceforge.net/) и чего я пытаюсь добиться — это вставить PDF-страницу в новый пустой PDF-документ.
Документация для конструктора, который я использую, находится здесь: http://podofo.sourceforge.net/doc/html/classPoDoFo_1_1PdfXObject.html#ad60d2bcfa51676961ce09ad274a6a6df
Вот как выглядит мой код:
PoDoFo::PdfMemDocument existingDocument(filename);
PoDoFo::PdfStreamedDocument *newDocument = new PoDoFo::PdfStreamedDocument("new_document.pdf");
PoDoFo::PdfPage *newPage = newDocument->CreatePage(PoDoFo::PdfRect(0.0,0.0,300.0,300.0));
PoDoFo::PdfXObject *XObjectFromPage;
XObjectFromPage = new PoDoFo::PdfXObject(existingDocument, 1, newDocument);
PoDoFo::PdfPainter *painter = new PoDoFo::PdfPainter();
painter->SetPage(newPage);
painter->DrawXObject (50, 50, XObjectFromPage,1);
painter->FinishPage();
newDocument->Close();
При создании PdfXObject из существующего документа PDF выбрасывается PdfError, возможно, я допустил ошибку, потому что я новичок в C ++ или потенциально есть ошибка в PoDoFo.
Возникшая ошибка имеет следующее сообщение:
PoDoFo encounter an error. Error: 48 ePdfError_ChangeOnImmutable
Error Description: Changing values on immutable objects is not allowed.
Callstack:
Как правильно построить объект PdfXObject из существующей страницы PDF и вставить его в новый документ PDF?
Чтобы загрузить существующую страницу в XObject, используйте что-то вроде этого (srcDoc и g_outputdoc — это PdfMemDocuments):
PdfPage* srcPage(srcDoc->GetPage(pageNumber));
//create XObject owned by outputDoc with size of srcPage
PdfXObject* xobject = new PdfXObject(srcPage->GetCropBox(), g_outputDoc)));
//fill the xObject with the content of the page + all references and ressources used on this page
g_outputDoc->FillXObjectFromDocumentPage(xobject , *srcDoc, pageNumber, false);
Ваша встраиваемая часть верна. Просто нарисуйте объект, используя pdfPainter 🙂
Хорошей частью этого метода является то, что все ссылки и ресурсы тоже копируются. Плохая часть этого заключается в том, что все ссылки и все ресурсы копируются каждый раз;) даже если вы встраиваете те же ресурсы на другие страницы …
Других решений пока нет …