summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-10-21 21:01:57 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-10-22 09:06:33 +0200
commitff79f6fa9b09f0b501e8096999b7a16c57070388 (patch)
tree9d5556d493afa1dc0dd230dfdc8c48da1b1d906c /vcl
parent3935a0bd3bcf747aa9bede59b045d23ab598f2d4 (diff)
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@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/filter/ipdf/pdfread.cxx45
-rw-r--r--vcl/source/pdf/PDFiumLibrary.cxx36
2 files changed, 50 insertions, 31 deletions
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)