diff --git a/Pdf4QtEditorPlugins/EditorPlugin/editorplugin.cpp b/Pdf4QtEditorPlugins/EditorPlugin/editorplugin.cpp index fad3dff..b739319 100644 --- a/Pdf4QtEditorPlugins/EditorPlugin/editorplugin.cpp +++ b/Pdf4QtEditorPlugins/EditorPlugin/editorplugin.cpp @@ -193,7 +193,12 @@ bool EditorPlugin::save() { pdf::PDFDocumentModifier modifier(m_document); - std::set pageIndices = m_scene.getPageIndices(); + std::set pageIndices; + for (const auto& item : m_editedPageContent) + { + pageIndices.insert(item.first); + } + auto elementsByPage = m_scene.getElementsByPage(); for (pdf::PDFInteger pageIndex : pageIndices) { @@ -221,6 +226,8 @@ bool EditorPlugin::save() const pdf::PDFPageContentImageElement* elementImage = element->asElementImage(); const pdf::PDFPageContentElementTextBox* elementTextBox = element->asElementTextBox(); + // TODO: Impelement all things + if (editedElement) { contentStreamBuilder.writeEditedElement(editedElement->getElement()); diff --git a/Pdf4QtLibCore/sources/pdfpagecontenteditorcontentstreambuilder.cpp b/Pdf4QtLibCore/sources/pdfpagecontenteditorcontentstreambuilder.cpp index 2479c12..1e18137 100644 --- a/Pdf4QtLibCore/sources/pdfpagecontenteditorcontentstreambuilder.cpp +++ b/Pdf4QtLibCore/sources/pdfpagecontenteditorcontentstreambuilder.cpp @@ -357,15 +357,37 @@ void PDFPageContentEditorContentStreamBuilder::writePainterPath(QTextStream& str case QPainterPath::MoveToElement: stream << element.x << " " << element.y << " m" << Qt::endl; break; + case QPainterPath::LineToElement: stream << element.x << " " << element.y << " l" << Qt::endl; break; + case QPainterPath::CurveToElement: - stream << element.x << " " << element.y << " c" << Qt::endl; + stream << element.x << " " << element.y << " "; + ++i; + + while (i < elementCount) + { + QPainterPath::Element currentElement = path.elementAt(i); + + if (currentElement.type == QPainterPath::CurveToDataElement) + { + ++i; + stream << currentElement.x << " " << currentElement.y << " "; + } + else + { + --i; + break; + } + } + stream << " c" << Qt::endl; break; + case QPainterPath::CurveToDataElement: stream << element.x << " " << element.y << " "; break; + default: break; } diff --git a/Pdf4QtLibCore/sources/pdfpagecontenteditorprocessor.cpp b/Pdf4QtLibCore/sources/pdfpagecontenteditorprocessor.cpp index 31c03f5..7121d6c 100644 --- a/Pdf4QtLibCore/sources/pdfpagecontenteditorprocessor.cpp +++ b/Pdf4QtLibCore/sources/pdfpagecontenteditorprocessor.cpp @@ -789,5 +789,4 @@ void PDFEditedPageContentElementText::optimize() } } - } // namespace pdf diff --git a/Pdf4QtLibWidgets/sources/pdfpagecontenteditortools.cpp b/Pdf4QtLibWidgets/sources/pdfpagecontenteditortools.cpp index 79539c2..f2b9535 100644 --- a/Pdf4QtLibWidgets/sources/pdfpagecontenteditortools.cpp +++ b/Pdf4QtLibWidgets/sources/pdfpagecontenteditortools.cpp @@ -166,7 +166,7 @@ void PDFCreatePCElementRectangleTool::drawPage(QPainter* painter, m_element->setPageIndex(pageIndex); m_element->setRectangle(rectangle); - m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } const PDFPageContentElement* PDFCreatePCElementRectangleTool::getElement() const @@ -262,7 +262,7 @@ void PDFCreatePCElementLineTool::drawPage(QPainter* painter, m_element->setLine(line); } - m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } const PDFPageContentElement* PDFCreatePCElementLineTool::getElement() const @@ -366,7 +366,7 @@ void PDFCreatePCElementImageTool::drawPage(QPainter* painter, painter->drawRect(rectangle); } - m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } const PDFPageContentElement* PDFCreatePCElementImageTool::getElement() const @@ -556,7 +556,7 @@ void PDFCreatePCElementFreehandCurveTool::drawPage(QPainter* painter, return; } - m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } const PDFPageContentElement* PDFCreatePCElementFreehandCurveTool::getElement() const diff --git a/Pdf4QtLibWidgets/sources/pdfpagecontentelements.cpp b/Pdf4QtLibWidgets/sources/pdfpagecontentelements.cpp index 31395d5..0d68b38 100644 --- a/Pdf4QtLibWidgets/sources/pdfpagecontentelements.cpp +++ b/Pdf4QtLibWidgets/sources/pdfpagecontentelements.cpp @@ -270,6 +270,7 @@ void PDFPageContentElementRectangle::setRectangle(const QRectF& newRectangle) } void PDFPageContentElementRectangle::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -279,6 +280,7 @@ void PDFPageContentElementRectangle::drawPage(QPainter* painter, Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex()) { @@ -663,7 +665,7 @@ void PDFPageContentScene::drawElements(QPainter* painter, continue; } - element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + element->drawPage(painter, this, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } } @@ -977,6 +979,7 @@ PDFPageContentElementLine* PDFPageContentElementLine::clone() const } void PDFPageContentElementLine::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -986,6 +989,7 @@ void PDFPageContentElementLine::drawPage(QPainter* painter, Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex()) { @@ -1159,15 +1163,17 @@ PDFPageContentImageElement* PDFPageContentImageElement::clone() const } void PDFPageContentImageElement::drawPage(QPainter* painter, - PDFInteger pageIndex, - const PDFPrecompiledPage* compiledPage, - PDFTextLayoutGetter& layoutGetter, - const QTransform& pagePointToDevicePointMatrix, - QList& errors) const + const pdf::PDFPageContentScene* scene, + PDFInteger pageIndex, + const PDFPrecompiledPage* compiledPage, + PDFTextLayoutGetter& layoutGetter, + const QTransform& pagePointToDevicePointMatrix, + QList& errors) const { Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex() || !getRectangle().isValid()) { @@ -1286,6 +1292,7 @@ PDFPageContentElementDot* PDFPageContentElementDot::clone() const } void PDFPageContentElementDot::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -1295,6 +1302,7 @@ void PDFPageContentElementDot::drawPage(QPainter* painter, Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex()) { @@ -1374,6 +1382,7 @@ PDFPageContentElementFreehandCurve* PDFPageContentElementFreehandCurve::clone() } void PDFPageContentElementFreehandCurve::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -1383,6 +1392,7 @@ void PDFPageContentElementFreehandCurve::drawPage(QPainter* painter, Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex()) { @@ -2334,7 +2344,7 @@ void PDFPageContentElementManipulator::drawPage(QPainter* painter, for (const auto& manipulatedElement : m_manipulatedElements) { - manipulatedElement->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); + manipulatedElement->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); } } } @@ -2399,6 +2409,7 @@ PDFPageContentElementTextBox* PDFPageContentElementTextBox::clone() const } void PDFPageContentElementTextBox::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -2408,6 +2419,7 @@ void PDFPageContentElementTextBox::drawPage(QPainter* painter, Q_UNUSED(compiledPage); Q_UNUSED(layoutGetter); Q_UNUSED(errors); + Q_UNUSED(scene); if (pageIndex != getPageIndex()) { @@ -2580,6 +2592,7 @@ PDFPageContentElementEdited* PDFPageContentElementEdited::clone() const } void PDFPageContentElementEdited::drawPage(QPainter* painter, + const pdf::PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -2593,13 +2606,22 @@ void PDFPageContentElementEdited::drawPage(QPainter* painter, Q_UNUSED(layoutGetter); Q_UNUSED(errors); - QRectF clipRect = m_element->getBoundingBox(); painter->setWorldTransform(QTransform(pagePointToDevicePointMatrix), true); painter->setPen(Qt::SolidLine); painter->setBrush(Qt::NoBrush); painter->setFont(QApplication::font()); painter->setRenderHint(QPainter::Antialiasing); - painter->setClipRect(clipRect, Qt::IntersectClip); + + const pdf::PDFPage* page = scene->getDocument()->getCatalog()->getPage(pageIndex); + QRectF mediaBox = page->getMediaBox(); + if (mediaBox.isValid()) + { + QPainterPath path; + path.addPolygon(mediaBox); + + painter->setClipPath(path, Qt::IntersectClip); + } + painter->setTransform(m_element->getTransform(), true); if (const PDFEditedPageContentElementImage* imageElement = m_element->asImage()) diff --git a/Pdf4QtLibWidgets/sources/pdfpagecontentelements.h b/Pdf4QtLibWidgets/sources/pdfpagecontentelements.h index a6f48af..3d4d139 100644 --- a/Pdf4QtLibWidgets/sources/pdfpagecontentelements.h +++ b/Pdf4QtLibWidgets/sources/pdfpagecontentelements.h @@ -55,6 +55,7 @@ public: virtual PDFPageContentElement* clone() const = 0; virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -167,6 +168,7 @@ public: void setRectangle(const QRectF& newRectangle); virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -202,6 +204,7 @@ public: }; virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -236,6 +239,7 @@ public: virtual PDFPageContentElementDot* clone() const override; virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -266,6 +270,7 @@ public: virtual PDFPageContentElementFreehandCurve* clone() const override; virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -302,6 +307,7 @@ public: virtual PDFPageContentImageElement* clone() const override; virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -341,6 +347,7 @@ public: void setRectangle(const QRectF& newRectangle) { m_rectangle = newRectangle; } virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, @@ -383,7 +390,13 @@ public: virtual ~PDFPageContentElementEdited(); virtual PDFPageContentElementEdited* clone() const override; - virtual void drawPage(QPainter* painter, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, const QTransform& pagePointToDevicePointMatrix, QList& errors) const override; + virtual void drawPage(QPainter* painter, + const PDFPageContentScene* scene, + PDFInteger pageIndex, + const PDFPrecompiledPage* compiledPage, + PDFTextLayoutGetter& layoutGetter, + const QTransform& pagePointToDevicePointMatrix, + QList& errors) const override; virtual uint getManipulationMode(const QPointF& point, PDFReal snapPointDistanceThreshold) const override; virtual void performManipulation(uint mode, const QPointF& offset) override; virtual QRectF getBoundingBox() const override;