Построение PdfXObject с использованием PoDoFo
Я использую библиотеку C++ PoDoFo ( http://podofo.sourceforge.net/) и пытаюсь добиться встраивания страницы PDF в новый пустой документ PDF.
Документация для конструктора, который я использую, находится здесь: http://podofo.sourceforge.net/doc/html/classPoDoFo_1_1PdfXObject.html
Вот как выглядит мой код:
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?
1 ответ
Чтобы загрузить существующую страницу в 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:-)
Хорошая часть этого метода заключается в том, что все ссылки и ресурсы также копируются. Плохая часть этого заключается в том, что все ссылки и все ресурсы копируются каждый раз;) даже если вы встраиваете те же ресурсы на другие страницы...