30 #include <rtl/ref.hxx>
33 #include <com/sun/star/lang/IllegalArgumentException.hpp>
34 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
35 #include <com/sun/star/io/XSeekable.hpp>
46 PDFIHybridAdaptor::PDFIHybridAdaptor(
const uno::Reference< uno::XComponentContext >& xContext ) :
58 uno::Reference< io::XStream > xSubStream;
60 const beans::PropertyValue* pAttribs = rFilterData.getConstArray();
61 sal_Int32 nAttribs = rFilterData.getLength();
62 sal_Int32 nPwPos = -1;
63 for( sal_Int32
i = 0;
i < nAttribs;
i++ )
65 SAL_INFO(
"sdext.pdfimport",
"filter: Attrib: " << pAttribs[
i].
Name
66 <<
" = " << (pAttribs[
i].
Value.has<OUString>()
67 ? pAttribs[
i].Value.get<OUString>()
68 : OUString(
"<no string>"))
70 if ( pAttribs[
i].
Name ==
"EmbeddedSubstream" )
71 pAttribs[
i].Value >>= xSubStream;
72 else if ( pAttribs[
i].
Name ==
"Password" )
75 pAttribs[
i].Value >>= aPwd;
78 bool bAddPwdProp =
false;
79 if( ! xSubStream.is() )
81 uno::Reference< io::XInputStream > xInput;
82 auto pAttr = std::find_if(rFilterData.begin(), rFilterData.end(),
83 [](
const beans::PropertyValue& rAttr) {
return rAttr.Name ==
"InputStream"; });
84 if (pAttr != rFilterData.end())
85 pAttr->Value >>= xInput;
89 uno::Reference< io::XSeekable > xSeek( xInput, uno::UNO_QUERY );
92 oslFileHandle aFile =
nullptr;
93 sal_uInt64 nWritten = 0;
95 if( osl_createTempFile(
nullptr, &aFile, &aURL.pData ) == osl_File_E_None )
97 SAL_INFO(
"sdext.pdfimport",
"created temp file " << aURL);
98 const sal_Int32 nBufSize = 4096;
99 uno::Sequence<sal_Int8>
aBuf(nBufSize);
104 nBytes = xInput->readBytes( aBuf, nBufSize );
107 osl_writeFile( aFile, aBuf.getConstArray(), nBytes, &nWritten );
108 if( static_cast<sal_Int32>(nWritten) != nBytes )
114 }
while( nBytes == nBufSize );
115 osl_closeFile( aFile );
118 OUString aEmbedMimetype;
119 OUString aOrgPwd( aPwd );
121 if( aOrgPwd != aPwd )
124 osl_removeFile( aURL.pData );
130 if( xSubStream.is() )
134 SAL_INFO(
"sdext.pdfimport",
"try to instantiate subfilter" );
135 uno::Reference< document::XFilter > xSubFilter;
138 m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
139 "com.sun.star.document.OwnSubFilter",
144 catch(
const uno::Exception&)
149 SAL_INFO(
"sdext.pdfimport",
"subfilter: " << xSubFilter.get() );
150 if( xSubFilter.is() )
154 uno::Sequence<beans::PropertyValue> aFilterData( rFilterData );
157 nPwPos = aFilterData.getLength();
158 aFilterData.realloc( nPwPos+1 );
159 aFilterData.getArray()[nPwPos].Name =
"Password";
161 aFilterData.getArray()[nPwPos].Value <<= aPwd;
162 bRet = xSubFilter->filter( aFilterData );
165 bRet = xSubFilter->filter( rFilterData );
169 SAL_INFO(
"sdext.pdfimport",
"PDFIAdaptor::filter: no embedded substream set" );
172 SAL_INFO(
"sdext.pdfimport",
"PDFIAdaptor::filter: no model set" );
184 SAL_INFO(
"sdext.pdfimport",
"PDFIAdaptor::setTargetDocument" );
185 m_xModel.set( xDocument, uno::UNO_QUERY );
186 if( xDocument.is() && !
m_xModel.is() )
187 throw lang::IllegalArgumentException();
192 return "org.libreoffice.comp.documents.HybridPDFImport";
202 return {
"com.sun.star.document.ImportFilter"};
207 m_implementationName(implementationName),
218 const uno::Reference<task::XInteractionHandler>& xIHdl,
219 const OUString& rPwd,
220 const uno::Reference<task::XStatusIndicator>& xStatus,
222 const OUString& rURL,
223 const OUString& rFilterOptions )
226 auto pSink = std::make_shared<PDFIProcessor>(xStatus,
m_xContext);
244 const uno::Reference<io::XOutputStream>& xOutput,
245 const uno::Reference<task::XStatusIndicator>& xStatus )
248 const bool bSuccess =
parse(uno::Reference<io::XInputStream>(),
249 uno::Reference<task::XInteractionHandler>(),
251 xStatus,pEmitter,rURL,
"");
254 xOutput->closeOutput();
261 const uno::Reference< xml::sax::XDocumentHandler >& rHdl,
262 const uno::Sequence< OUString >& )
265 uno::Reference< io::XInputStream > xInput;
266 uno::Reference< task::XStatusIndicator > xStatus;
267 uno::Reference< task::XInteractionHandler > xInteractionHandler;
270 OUString aFilterOptions;
271 for(
const beans::PropertyValue& rAttrib : rSourceData )
273 SAL_INFO(
"sdext.pdfimport",
"importer Attrib: " << rAttrib.Name );
274 if ( rAttrib.Name ==
"InputStream" )
275 rAttrib.Value >>= xInput;
276 else if ( rAttrib.Name ==
"URL" )
277 rAttrib.Value >>= aURL;
278 else if ( rAttrib.Name ==
"StatusIndicator" )
279 rAttrib.Value >>= xStatus;
280 else if ( rAttrib.Name ==
"InteractionHandler" )
281 rAttrib.Value >>= xInteractionHandler;
282 else if ( rAttrib.Name ==
"Password" )
283 rAttrib.Value >>= aPwd;
284 else if ( rAttrib.Name ==
"FilterOptions" )
285 rAttrib.Value >>= aFilterOptions;
291 const bool bSuccess =
parse(xInput, xInteractionHandler,
292 aPwd, xStatus, pEmitter, aURL, aFilterOptions);
295 xInput->closeInput();
304 SAL_INFO(
"sdext.pdfimport",
"PDFIAdaptor::setTargetDocument" );
305 m_xModel.set( xDocument, uno::UNO_QUERY );
306 if( xDocument.is() && !
m_xModel.is() )
307 throw lang::IllegalArgumentException();
322 return {
"com.sun.star.document.ImportFilter"};
327 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
329 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
337 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
339 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
347 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
349 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
357 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
359 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
css::uno::Reference< css::uno::XComponentContext > m_xContext
virtual sal_Bool SAL_CALL importer(const css::uno::Sequence< css::beans::PropertyValue > &rSourceData, const css::uno::Reference< css::xml::sax::XDocumentHandler > &rHdl, const css::uno::Sequence< OUString > &rUserData) override
sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * sdext_PDFIRawAdaptor_Draw_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
::cppu::WeakComponentImplHelper< css::document::XFilter, css::document::XImporter, css::lang::XServiceInfo > PDFIHybridAdaptorBase
std::shared_ptr< TreeVisitorFactory > TreeVisitorFactorySharedPtr
css::uno::Reference< css::frame::XModel > m_xModel
css::uno::Reference< css::uno::XComponentContext > m_xContext
OUString SAL_CALL getImplementationName() override
bool xpdf_ImportFromFile(const OUString &rURL, const ContentSinkSharedPtr &rSink, const css::uno::Reference< css::task::XInteractionHandler > &xIHdl, const OUString &rPwd, const css::uno::Reference< css::uno::XComponentContext > &xContext, const OUString &rFilterOptions)
uno::Reference< io::XStream > getAdditionalStream(const OUString &rInPDFFileURL, OUString &rOutMimetype, OUString &io_rPwd, const uno::Reference< uno::XComponentContext > &xContext, const uno::Sequence< beans::PropertyValue > &rFilterData, bool bMayUseUI)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
Adapts raw pdf import to XImportFilter interface.
XmlEmitterSharedPtr createOdfEmitter(const css::uno::Reference< css::io::XOutputStream > &xOut)
bool parse(const css::uno::Reference< css::io::XInputStream > &xInput, const css::uno::Reference< css::task::XInteractionHandler > &xIHdl, const OUString &rPwd, const css::uno::Reference< css::task::XStatusIndicator > &xStatus, const XmlEmitterSharedPtr &rEmitter, const OUString &rURL, const OUString &rFilterOptions)
std::shared_ptr< XmlEmitter > XmlEmitterSharedPtr
PDFIRawAdaptor(OUString const &implementationName, const css::uno::Reference< css::uno::XComponentContext > &xContext)
TreeVisitorFactorySharedPtr createWriterTreeVisitorFactory()
OUString const m_implementationName
TreeVisitorFactorySharedPtr createImpressTreeVisitorFactory()
XmlEmitterSharedPtr createSaxEmitter(const css::uno::Reference< css::xml::sax::XDocumentHandler > &xDocHdl)
css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * sdext_PDFIRawAdaptor_Writer_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
#define TOOLS_INFO_EXCEPTION(area, stream)
OUString SAL_CALL getImplementationName() override
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * sdext_PDFIRawAdaptor_Impress_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
TreeVisitorFactorySharedPtr m_pVisitorFactory
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * sdext_PDFIHybridAdaptor_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
#define SAL_INFO(area, stream)
virtual void SAL_CALL setTargetDocument(const css::uno::Reference< css::lang::XComponent > &xDocument) override
::cppu::WeakComponentImplHelper< css::xml::XImportFilter, css::document::XImporter, css::lang::XServiceInfo > PDFIAdaptorBase
void setTreeVisitorFactory(const TreeVisitorFactorySharedPtr &rVisitorFactory)
Set factory object used to create the tree visitors.
bool odfConvert(const OUString &rURL, const css::uno::Reference< css::io::XOutputStream > &xOutput, const css::uno::Reference< css::task::XStatusIndicator > &xStatus)
Export pdf document to ODG.
sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
virtual sal_Bool SAL_CALL filter(const css::uno::Sequence< css::beans::PropertyValue > &rFilterData) override
css::uno::Reference< css::frame::XModel > m_xModel
virtual void SAL_CALL cancel() override
TreeVisitorFactorySharedPtr createDrawTreeVisitorFactory()
virtual void SAL_CALL setTargetDocument(const css::uno::Reference< css::lang::XComponent > &xDocument) override
const uno::Reference< uno::XComponentContext > m_xContext
bool xpdf_ImportFromStream(const css::uno::Reference< css::io::XInputStream > &xInput, const ContentSinkSharedPtr &rSink, const css::uno::Reference< css::task::XInteractionHandler > &xIHdl, const OUString &rPwd, const css::uno::Reference< css::uno::XComponentContext > &xContext, const OUString &rFilterOptions)