sd/source/filter/pdf/sdpdffilter.cxx |   88 +++++++++++++++++++++++++++++++++++
 vcl/workben/fftester.cxx             |   10 +++
 2 files changed, 98 insertions(+)

New commits:
commit 246da0c3cc1183840744fba5613b29d4bb214e8a
Author:     Caolán McNamara <[email protected]>
AuthorDate: Thu Oct 9 20:05:27 2025 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Fri Oct 10 09:29:31 2025 +0200

    add pdf2fodg fuzzer entry point
    
    Change-Id: If698320def5fe90140f63f9a0b4b73a57c8fa791
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192133
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/sd/source/filter/pdf/sdpdffilter.cxx 
b/sd/source/filter/pdf/sdpdffilter.cxx
index 4a426f1206f8..7973057ddfd1 100644
--- a/sd/source/filter/pdf/sdpdffilter.cxx
+++ b/sd/source/filter/pdf/sdpdffilter.cxx
@@ -19,6 +19,7 @@
 
 #include <sal/config.h>
 
+#include <osl/process.h>
 #include <sfx2/docfile.hxx>
 #include <svx/svdograf.hxx>
 #include <o3tl/safeint.hxx>
@@ -31,11 +32,23 @@
 #include <vcl/pdfread.hxx>
 
 #include <Annotation.hxx>
+#include <DrawDocShell.hxx>
+#include <unomodel.hxx>
 
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/office/XAnnotation.hpp>
 #include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
 
 #include <basegfx/polygon/b2dpolygontools.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <unotools/streamwrap.hxx>
+#include <unotools/tempfile.hxx>
 #include <unotools/ucbstreamhelper.hxx>
 
 using namespace css;
@@ -245,4 +258,79 @@ bool SdPdfFilter::Import()
 
 bool SdPdfFilter::Export() { return false; }
 
+extern "C" SAL_DLLPUBLIC_EXPORT bool TestFODGExportPDF(SvStream& rStream)
+{
+    bool bResetEnvVar = false;
+    if (getenv("LO_IMPORT_USE_PDFIUM") == nullptr)
+    {
+        bResetEnvVar = true;
+        osl_setEnvironment(OUString("LO_IMPORT_USE_PDFIUM").pData, 
OUString("1").pData);
+    }
+    comphelper::ScopeGuard aPDFiumEnvVarGuard([&]() {
+        if (bResetEnvVar)
+            osl_clearEnvironment(OUString("LO_IMPORT_USE_PDFIUM").pData);
+    });
+
+    const uno::Reference<uno::XComponentContext>& xContext(
+        comphelper::getProcessComponentContext());
+    uno::Reference<css::frame::XModel2> xModel(
+        xContext->getServiceManager()->createInstanceWithContext(
+            u"com.sun.star.drawing.DrawingDocument"_ustr, xContext),
+        uno::UNO_QUERY_THROW);
+
+    uno::Reference<css::frame::XLoadable> xModelLoad(xModel, 
uno::UNO_QUERY_THROW);
+    xModelLoad->initNew();
+
+    SdXImpressDocument* pDrawDoc = 
dynamic_cast<SdXImpressDocument*>(xModel.get());
+
+    bool ret = ImportPDF(rStream, *pDrawDoc->GetDoc());
+
+    if (ret)
+    {
+        utl::TempFileFast aTempFile;
+
+        SvFileStream aOutputStream("/tmp/outputthing.fodg", 
StreamMode::READWRITE);
+
+        uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(
+            comphelper::getProcessServiceFactory());
+        uno::Reference<uno::XInterface> xInterface(
+            
xMultiServiceFactory->createInstance(u"com.sun.star.comp.Writer.XmlFilterAdaptor"_ustr),
+            uno::UNO_QUERY);
+
+        css::uno::Sequence<OUString> aUserData{ 
u"com.sun.star.comp.filter.OdfFlatXml"_ustr,
+                                                u""_ustr,
+                                                
u"com.sun.star.comp.Draw.XMLOasisImporter"_ustr,
+                                                
u"com.sun.star.comp.Draw.XMLOasisExporter"_ustr,
+                                                u""_ustr,
+                                                u""_ustr,
+                                                u"true"_ustr };
+        uno::Sequence<beans::PropertyValue> 
aAdaptorArgs(comphelper::InitPropertySequence({
+            { "UserData", uno::Any(aUserData) },
+        }));
+        css::uno::Sequence<uno::Any> aOuterArgs{ uno::Any(aAdaptorArgs) };
+
+        uno::Reference<lang::XInitialization> xInit(xInterface, 
uno::UNO_QUERY_THROW);
+        xInit->initialize(aOuterArgs);
+
+        uno::Reference<document::XFilter> xFODGFilter(xInterface, 
uno::UNO_QUERY);
+        uno::Reference<document::XExporter> xExporter(xFODGFilter, 
uno::UNO_QUERY);
+        xExporter->setSourceDocument(xModel);
+
+        uno::Reference<io::XOutputStream> xOutputStream(new 
utl::OStreamWrapper(aOutputStream));
+
+        uno::Sequence<beans::PropertyValue> 
aDescriptor(comphelper::InitPropertySequence(
+            { { "FilterName", uno::Any(u"OpenDocument Drawing Flat XML"_ustr) 
},
+              { "OutputStream", uno::Any(xOutputStream) },
+              { "FilterOptions",
+                uno::Any(
+                    
u"{\"DecomposePDF\":{\"type\":\"boolean\",\"value\":\"true\"}}"_ustr) } }));
+        xFODGFilter->filter(aDescriptor);
+    }
+
+    css::uno::Reference<css::util::XCloseable> xClose(xModel, 
css::uno::UNO_QUERY);
+    xClose->close(false);
+
+    return ret;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx
index 8a38132e97a6..08f4605d8023 100644
--- a/vcl/workben/fftester.cxx
+++ b/vcl/workben/fftester.cxx
@@ -475,6 +475,16 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
             SvFileStream aFileStream(out, StreamMode::READ);
             ret = static_cast<int>((*pfnImport)(aFileStream));
         }
+        else if (strcmp(argv[2], "pdf2fodg") == 0)
+        {
+            static FFilterCall pfnImport(nullptr);
+            if (!pfnImport)
+            {
+                pfnImport = load(u"libsdlo.so", "TestFODGExportPDF");
+            }
+            SvFileStream aFileStream(out, StreamMode::READ);
+            ret = static_cast<int>((*pfnImport)(aFileStream));
+        }
         else if (strcmp(argv[2], "qpw") == 0)
         {
             static FFilterCall pfnImport(nullptr);

Reply via email to