bool UBImportPDF::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) { QString documentName = QFileInfo(pFile.fileName()).completeBaseName(); QUuid uuid = QUuid::createUuid(); QString filepath = UBPersistenceManager::persistenceManager()->addPdfFileToDocument(pDocument, pFile.fileName(), uuid); PDFRenderer *pdfRenderer = PDFRenderer::rendererForUuid(uuid, pDocument->persistencePath() + "/" + filepath); // renderer is automatically deleted when not used anymore if (!pdfRenderer->isValid()) { UBApplication::showMessage(tr("PDF import failed.")); return false; } int documentPageCount = pDocument->pageCount(); if (documentPageCount == 1 && UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocument, 0)->isEmpty()) { documentPageCount = 0; } int pdfPageCount = pdfRenderer->pageCount(); for(int pdfPageNumber = 1; pdfPageNumber <= pdfPageCount; pdfPageNumber++) { int pageIndex = documentPageCount + (pdfPageNumber - 1); UBApplication::showMessage(tr("Importing page %1 of %2").arg(pdfPageNumber).arg(pdfPageCount), true); UBGraphicsScene* scene = 0; if (pageIndex == 0) { scene = UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocument, pageIndex); } else { scene = UBPersistenceManager::persistenceManager()->createDocumentSceneAt(pDocument, pageIndex); } scene->setBackground(false, false); UBGraphicsPDFItem *pdfItem = new UBGraphicsPDFItem(pdfRenderer, pdfPageNumber); // deleted by the scene scene->addItem(pdfItem); pdfItem->setPos(-pdfItem->boundingRect().width() / 2, -pdfItem->boundingRect().height() / 2); scene->setAsBackgroundObject(pdfItem, false, false); scene->setNominalSize(pdfItem->boundingRect().width(), pdfItem->boundingRect().height()); UBPersistenceManager::persistenceManager()->persistDocumentScene(pDocument, scene, pageIndex); } UBApplication::showMessage(tr("PDF import successful.")); return true; }
void UBImportPDF::placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item) { UBGraphicsPDFItem *pdfItem = (UBGraphicsPDFItem*)item; pdfItem->setPos(-pdfItem->boundingRect().width() / 2, -pdfItem->boundingRect().height() / 2); scene->setAsBackgroundObject(pdfItem, false, false); scene->setNominalSize(pdfItem->boundingRect().width(), pdfItem->boundingRect().height()); }
void UBExportFullPDF::persistsDocument(UBDocumentProxy* pDocumentProxy, const QString& filename) { QFile file(filename); if (file.exists()) file.remove(); QString overlayName = filename; overlayName.replace(".pdf", "_overlay.pdf"); QFile previousOverlay(overlayName); if (previousOverlay.exists()) previousOverlay.remove(); mHasPDFBackgrounds = false; saveOverlayPdf(pDocumentProxy, overlayName); if (!mHasPDFBackgrounds) { QFile f(overlayName); f.rename(filename); } else { Merger merger; try { merger.addOverlayDocument(QFile::encodeName(overlayName).constData()); MergeDescription mergeInfo; int existingPageCount = pDocumentProxy->pageCount(); for(int pageIndex = 0 ; pageIndex < existingPageCount; pageIndex++) { UBGraphicsScene* scene = UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocumentProxy, pageIndex); UBGraphicsPDFItem *pdfItem = qgraphicsitem_cast<UBGraphicsPDFItem*>(scene->backgroundObject()); QSize pageSize = scene->nominalSize(); if (pdfItem) { QString pdfName = UBPersistenceManager::objectDirectory + "/" + pdfItem->fileUuid().toString() + ".pdf"; QString backgroundPath = pDocumentProxy->persistencePath() + "/" + pdfName; qDebug() << "scene->itemsBoundingRect()" << scene->itemsBoundingRect(); qDebug() << "pdfItem->boundingRect()" << pdfItem->boundingRect(); qDebug() << "pdfItem->sceneBoundingRect()" << pdfItem->sceneBoundingRect(); MergePageDescription pageDescription(pageSize.width() * mScaleFactor, pageSize.height() * mScaleFactor, pdfItem->pageNumber(), QFile::encodeName(backgroundPath).constData(), TransformationDescription(), pageIndex + 1, TransformationDescription(), false, false); mergeInfo.push_back(pageDescription); merger.addBaseDocument(QFile::encodeName(backgroundPath).constData()); } else { MergePageDescription pageDescription(pageSize.width() * mScaleFactor, pageSize.height() * mScaleFactor, 0, "", TransformationDescription(), pageIndex + 1, TransformationDescription(), false, true); mergeInfo.push_back(pageDescription); } } merger.merge(QFile::encodeName(overlayName).constData(), mergeInfo); merger.saveMergedDocumentsAs(QFile::encodeName(filename).constData()); } catch(Exception e) { qDebug() << "PdfMerger failed to merge documents to " << filename << " - Exception : " << e.what(); // default to raster export UBExportPDF::persistsDocument(pDocumentProxy, filename); } if (!UBApplication::app()->isVerbose()) { QFile::remove(overlayName); } } }