[Libreoffice-commits] core.git: include/vcl vcl/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Thu Oct 22 07:07:20 UTC 2020


 include/vcl/filter/PDFiumLibrary.hxx |    3 ++
 vcl/source/filter/ipdf/pdfread.cxx   |   45 ++++++++++-------------------------
 vcl/source/pdf/PDFiumLibrary.cxx     |   36 ++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 31 deletions(-)

New commits:
commit ff79f6fa9b09f0b501e8096999b7a16c57070388
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Wed Oct 21 21:01:57 2020 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Thu Oct 22 09:06:33 2020 +0200

    pdfium: add a wrapper for FPDF_SaveWithVersion()
    
    And use it in getCompatibleStream().
    
    Change-Id: I48ab2a17c0780b78c6af6dbff50dba81f8041f43
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104642
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>

diff --git a/include/vcl/filter/PDFiumLibrary.hxx b/include/vcl/filter/PDFiumLibrary.hxx
index 96f258127693..1900c07d8e8c 100644
--- a/include/vcl/filter/PDFiumLibrary.hxx
+++ b/include/vcl/filter/PDFiumLibrary.hxx
@@ -30,6 +30,8 @@
 
 #include <fpdf_doc.h>
 
+class SvMemoryStream;
+
 namespace vcl::pdf
 {
 constexpr char constDictionaryKeyTitle[] = "T";
@@ -236,6 +238,7 @@ public:
     basegfx::B2DSize getPageSize(int nIndex);
     int getPageCount();
     int getFileVersion();
+    bool saveWithVersion(SvMemoryStream& rStream, int nFileVersion);
 
     std::unique_ptr<PDFiumPage> openPage(int nIndex);
 };
diff --git a/vcl/source/filter/ipdf/pdfread.cxx b/vcl/source/filter/ipdf/pdfread.cxx
index 43cb80d50cee..f4ed0acf5b43 100644
--- a/vcl/source/filter/ipdf/pdfread.cxx
+++ b/vcl/source/filter/ipdf/pdfread.cxx
@@ -14,7 +14,6 @@
 #if HAVE_FEATURE_PDFIUM
 #include <fpdfview.h>
 #include <fpdf_edit.h>
-#include <fpdf_save.h>
 #include <tools/UnitConversion.hxx>
 #endif
 
@@ -32,19 +31,6 @@ namespace
 {
 #if HAVE_FEATURE_PDFIUM
 
-/// Callback class to be used with FPDF_SaveWithVersion().
-struct CompatibleWriter : public FPDF_FILEWRITE
-{
-    SvMemoryStream m_aStream;
-};
-
-int CompatibleWriterCallback(FPDF_FILEWRITE* pFileWrite, const void* pData, unsigned long nSize)
-{
-    auto pImpl = static_cast<CompatibleWriter*>(pFileWrite);
-    pImpl->m_aStream.WriteBytes(pData, nSize);
-    return 1;
-}
-
 /// Convert to inch, then assume 96 DPI.
 inline double pointToPixel(const double fPoint, const double fResolutionDPI)
 {
@@ -93,24 +79,21 @@ bool getCompatibleStream(SvStream& rInStream, SvStream& rOutStream)
         SvMemoryStream aInBuffer;
         aInBuffer.WriteStream(rInStream, nSize);
 
-        // Load the buffer using pdfium.
-        FPDF_DOCUMENT pPdfDocument
-            = FPDF_LoadMemDocument(aInBuffer.GetData(), aInBuffer.GetSize(), /*password=*/nullptr);
-        if (!pPdfDocument)
-            return false;
-
-        CompatibleWriter aWriter;
-        aWriter.version = 1;
-        aWriter.WriteBlock = &CompatibleWriterCallback;
-
-        // 16 means PDF-1.6.
-        if (!FPDF_SaveWithVersion(pPdfDocument, &aWriter, 0, 16))
-            return false;
-
-        FPDF_CloseDocument(pPdfDocument);
+        SvMemoryStream aSaved;
+        {
+            // Load the buffer using pdfium.
+            std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument
+                = pPdfium->openDocument(aInBuffer.GetData(), aInBuffer.GetSize());
+            if (!pPdfDocument)
+                return false;
+
+            // 16 means PDF-1.6.
+            if (!pPdfDocument->saveWithVersion(aSaved, 16))
+                return false;
+        }
 
-        aWriter.m_aStream.Seek(STREAM_SEEK_TO_BEGIN);
-        rOutStream.WriteStream(aWriter.m_aStream);
+        aSaved.Seek(STREAM_SEEK_TO_BEGIN);
+        rOutStream.WriteStream(aSaved);
     }
 
     return rOutStream.good();
diff --git a/vcl/source/pdf/PDFiumLibrary.cxx b/vcl/source/pdf/PDFiumLibrary.cxx
index 41e061bb1f6c..10fa42f143cf 100644
--- a/vcl/source/pdf/PDFiumLibrary.cxx
+++ b/vcl/source/pdf/PDFiumLibrary.cxx
@@ -18,12 +18,35 @@
 #include <fpdf_annot.h>
 #include <fpdf_edit.h>
 #include <fpdf_text.h>
+#include <fpdf_save.h>
 
 #include <osl/endian.h>
 #include <vcl/bitmap.hxx>
+#include <tools/stream.hxx>
 
 #include <bitmapwriteaccess.hxx>
 
+namespace
+{
+/// Callback class to be used with FPDF_SaveWithVersion().
+struct CompatibleWriter : public FPDF_FILEWRITE
+{
+    CompatibleWriter(SvMemoryStream& rStream)
+        : m_rStream(rStream)
+    {
+    }
+
+    SvMemoryStream& m_rStream;
+};
+
+int CompatibleWriterCallback(FPDF_FILEWRITE* pFileWrite, const void* pData, unsigned long nSize)
+{
+    auto pImpl = static_cast<CompatibleWriter*>(pFileWrite);
+    pImpl->m_rStream.WriteBytes(pData, nSize);
+    return 1;
+}
+}
+
 namespace vcl::pdf
 {
 OUString convertPdfDateToISO8601(OUString const& rInput)
@@ -196,6 +219,19 @@ int PDFiumDocument::getFileVersion()
     return nFileVersion;
 }
 
+bool PDFiumDocument::saveWithVersion(SvMemoryStream& rStream, int nFileVersion)
+{
+    CompatibleWriter aWriter(rStream);
+    aWriter.version = 1;
+    aWriter.WriteBlock = &CompatibleWriterCallback;
+    if (!FPDF_SaveWithVersion(mpPdfDocument, &aWriter, 0, nFileVersion))
+    {
+        return false;
+    }
+
+    return true;
+}
+
 int PDFiumPage::getObjectCount() { return FPDFPage_CountObjects(mpPage); }
 
 std::unique_ptr<PDFiumPageObject> PDFiumPage::getObject(int nIndex)


More information about the Libreoffice-commits mailing list