28 #include <com/sun/star/container/XNamed.hpp>
29 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
30 #include <com/sun/star/drawing/XDrawPages.hpp>
31 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
32 #include <com/sun/star/drawing/XMasterPageTarget.hpp>
33 #include <com/sun/star/frame/XModel.hpp>
34 #include <com/sun/star/io/XInputStream.hpp>
35 #include <com/sun/star/text/XTextField.hpp>
36 #include <com/sun/star/xml/dom/XDocument.hpp>
37 #include <com/sun/star/xml/sax/XFastSAXSerializable.hpp>
38 #include <com/sun/star/presentation/XPresentationPage.hpp>
39 #include <com/sun/star/task/XStatusIndicator.hpp>
40 #include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
41 #include <com/sun/star/container/XIndexContainer.hpp>
42 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
44 #include <com/sun/star/container/XNameContainer.hpp>
58 #include <oox/token/namespaces.hxx>
59 #include <oox/token/tokens.hxx>
61 #include <com/sun/star/office/XAnnotation.hpp>
62 #include <com/sun/star/office/XAnnotationAccess.hpp>
92 : FragmentHandler2( rFilter, rFragmentPath )
94 , mbCommentAuthorsRead(
false)
97 for (
auto & elem : rParagraphDefaultsVector)
101 elem.getParaBottomMargin() = TextSpacing( 0 );
112 if ( rTextFields.empty() )
116 for (
auto const& textField : rTextFields)
118 static const OUStringLiteral sURL =
u"URL";
119 Reference< drawing::XDrawPagesSupplier > xDPS(
xModel, uno::UNO_QUERY_THROW );
120 Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_SET_THROW );
124 Reference< XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
125 if ( xPropSetInfo->hasPropertyByName( sURL ) )
128 if ( xPropSet->getPropertyValue( sURL ) >>= aURL )
130 static const OUStringLiteral sSlide =
u"#Slide ";
131 static const OUStringLiteral sNotes =
u"#Notes ";
133 sal_Int32 nPageNumber = 0;
134 if ( aURL.match( sSlide ) )
135 nPageNumber =
o3tl::toInt32(aURL.subView( sSlide.getLength() ));
136 else if ( aURL.match( sNotes ) )
138 nPageNumber =
o3tl::toInt32(aURL.subView( sNotes.getLength() ));
145 Reference< XDrawPage > xDrawPage;
146 xDrawPages->getByIndex( nPageNumber - 1 ) >>= xDrawPage;
149 Reference< css::presentation::XPresentationPage > xPresentationPage( xDrawPage, UNO_QUERY_THROW );
150 xDrawPage = xPresentationPage->getNotesPage();
152 Reference< container::XNamed > xNamed( xDrawPage, UNO_QUERY_THROW );
153 aURL =
"#" + xNamed->getName();
154 xPropSet->setPropertyValue( sURL,
Any( aURL ) );
155 Reference< text::XTextContent >
xContent( rTextField.xTextField);
156 Reference< text::XTextRange > xTextRange = rTextField.xTextCursor;
157 rTextField.xText->insertTextContent( xTextRange, xContent,
true );
159 catch( uno::Exception& )
172 Reference<XDrawPagesSupplier> xDrawPagesSupplier(
xModel, UNO_QUERY_THROW);
173 Reference<XDrawPages> xDrawPages(xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW);
175 Reference<css::lang::XSingleServiceFactory> mxShowFactory;
176 Reference<css::container::XNameContainer> mxShows;
177 Reference<XCustomPresentationSupplier> xShowsSupplier(
xModel, UNO_QUERY);
178 if (xShowsSupplier.is())
180 mxShows = xShowsSupplier->getCustomPresentations();
181 mxShowFactory.set(mxShows, UNO_QUERY);
184 for (
size_t i = 0;
i < rCustomShowList.size(); ++
i)
186 Reference<com::sun::star::container::XIndexContainer> xShow(mxShowFactory->createInstance(),
190 static const OUStringLiteral sSlide =
u"slides/slide";
191 for (
size_t j = 0; j < rCustomShowList[
i].maSldLst.size(); ++j)
193 OUString sCustomSlide = rCustomShowList[
i].maSldLst[j];
194 sal_Int32 nPageNumber = 0;
195 if (sCustomSlide.match(sSlide))
196 nPageNumber =
o3tl::toInt32(sCustomSlide.subView(sSlide.getLength()));
198 Reference<XDrawPage> xPage;
199 xDrawPages->getByIndex(nPageNumber - 1) >>= xPage;
201 xShow->insertByIndex(xShow->getCount(),
Any(xPage));
206 mxShows->insertByName(rCustomShowList[
i].maCustomShowName, aAny);
219 uno::Reference<beans::XPropertySet> xDocProps(getFilter().getModel(), uno::UNO_QUERY);
222 uno::Reference<beans::XPropertySetInfo> xPropsInfo = xDocProps->getPropertySetInfo();
224 static const OUStringLiteral aGrabBagPropName =
u"InteropGrabBag";
225 if (xPropsInfo.is() && xPropsInfo->hasPropertyByName(aGrabBagPropName))
234 auto pCurrentTheme = aCurrentTheme.getArray();
236 ClrScheme rClrScheme = pThemePtr->getClrScheme();
243 rClrScheme.getColor(nToken, nColor);
247 pCurrentTheme[
nId].Value = rColor;
251 uno::Sequence<beans::PropertyValue> aTheme{
256 "ppt/theme/theme" + OUString::number(nThemeIdx) +
".xml", aCurrentTheme),
261 aThemesHashMap << aTheme;
264 aGrabBag.update(aThemesHashMap);
267 xDocProps->setPropertyValue(aGrabBagPropName,
uno::Any(aGrabBag.getAsConstPropertyValueList()));
271 catch (
const uno::Exception&)
273 SAL_WARN(
"oox",
"oox::ppt::PresentationFragmentHandler::saveThemeToGrabBag, Failed to save grab bag");
285 Reference< drawing::XDrawPagesSupplier > xDPS(
xModel, uno::UNO_QUERY_THROW );
286 Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_SET_THROW );
291 xDrawPages->getByIndex( 0 ) >>= xSlide;
293 xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() );
295 OUString aSlideFragmentPath = getFragmentPathFromRelId(
maSlidesVector[ nSlide ] );
296 if( !aSlideFragmentPath.isEmpty() )
299 SlidePersistPtr pSlidePersistPtr = std::make_shared<SlidePersist>( rFilter,
false,
false, xSlide,
305 OUString aLayoutFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"slideLayout" );
306 OUString aCommentFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"comments" );
307 if ( !aLayoutFragmentPath.isEmpty() )
310 RelationsRef xLayoutRelations = rFilter.importRelations( aLayoutFragmentPath );
311 OUString aMasterFragmentPath = xLayoutRelations->getFragmentPathFromFirstTypeFromOfficeDoc(
u"slideMaster" );
312 if( !aMasterFragmentPath.isEmpty() )
315 std::vector< SlidePersistPtr >& rMasterPages( rFilter.getMasterPages() );
316 for (
auto const& masterPage : rMasterPages)
318 if ( ( masterPage->getPath() == aMasterFragmentPath ) && ( masterPage->getLayoutPath() == aLayoutFragmentPath ) )
320 pMasterPersistPtr = masterPage;
325 if ( !pMasterPersistPtr )
328 Reference< drawing::XMasterPagesSupplier > xMPS(
xModel, uno::UNO_QUERY_THROW );
329 Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW );
332 if( rFilter.getMasterPages().empty() )
335 xMasterPages->getByIndex( nIndex ) >>= xMasterPage;
339 nIndex = xMasterPages->getCount();
340 xMasterPage = xMasterPages->insertNewByIndex( nIndex );
343 pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter,
true,
false, xMasterPage,
345 pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
346 rFilter.getMasterPages().push_back( pMasterPersistPtr );
347 rFilter.setActualSlidePersist( pMasterPersistPtr );
351 OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"theme" );
352 if( !aThemeFragmentPath.isEmpty() )
354 std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
355 std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
356 if( aIter2 == rThemes.end() )
359 pMasterPersistPtr->setTheme( pThemePtr );
360 Reference<xml::dom::XDocument> xDoc=
361 rFilter.importFragment(aThemeFragmentPath);
363 rFilter.importFragment(
364 new ThemeFragmentHandler(
365 rFilter, aThemeFragmentPath, *pThemePtr ),
366 Reference<xml::sax::XFastSAXSerializable>(
369 rThemes[ aThemeFragmentPath ] = pThemePtr;
370 pThemePtr->setFragment(xDoc);
375 pMasterPersistPtr->setTheme( (*aIter2).second );
378 importSlide( xMasterFragmentHandler, pMasterPersistPtr );
379 rFilter.importFragment(
new LayoutFragmentHandler( rFilter, aLayoutFragmentPath, pMasterPersistPtr ) );
380 pMasterPersistPtr->createBackground( rFilter );
381 pMasterPersistPtr->createXShapes( rFilter );
386 pTheme->addTheme(pMasterPersistPtr->getPage());
393 if (pMasterPersistPtr) {
394 pSlidePersistPtr->setMasterPersist( pMasterPersistPtr );
395 pSlidePersistPtr->setTheme( pMasterPersistPtr->getTheme() );
396 Reference< drawing::XMasterPageTarget > xMasterPageTarget( pSlidePersistPtr->getPage(), UNO_QUERY );
397 if( xMasterPageTarget.is() )
398 xMasterPageTarget->setMasterPage( pMasterPersistPtr->getPage() );
400 rFilter.getDrawPages().push_back( pSlidePersistPtr );
401 rFilter.setActualSlidePersist( pSlidePersistPtr );
402 importSlide( xSlideFragmentHandler, pSlidePersistPtr );
403 pSlidePersistPtr->createBackground( rFilter );
404 pSlidePersistPtr->createXShapes( rFilter );
406 if(bImportNotesPage) {
409 OUString aNotesFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(
u"notesSlide" );
410 if( !aNotesFragmentPath.isEmpty() )
412 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
413 if ( xPresentationPage.is() )
415 Reference< XDrawPage > xNotesPage( xPresentationPage->getNotesPage() );
416 if ( xNotesPage.is() )
418 SlidePersistPtr pNotesPersistPtr = std::make_shared<SlidePersist>( rFilter,
false,
true, xNotesPage,
421 rFilter.getNotesPages().push_back( pNotesPersistPtr );
422 rFilter.setActualSlidePersist( pNotesPersistPtr );
423 importSlide( xNotesFragmentHandler, pNotesPersistPtr );
424 pNotesPersistPtr->createBackground( rFilter );
425 pNotesPersistPtr->createXShapes( rFilter );
435 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
436 Reference< XDrawPage > xCommentAuthorsPage( xPresentationPage->getNotesPage() );
438 std::make_shared<SlidePersist>( rFilter,
false,
true, xCommentAuthorsPage,
439 std::make_shared<PPTShape>(
440 Slide,
"com.sun.star.drawing.GroupShape" ),
444 "ppt/commentAuthors.xml",
445 pCommentAuthorsPersistPtr,
448 getFilter().importFragment( xCommentAuthorsFragmentHandler );
451 if( !aCommentFragmentPath.isEmpty() )
453 Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
454 Reference< XDrawPage > xCommentsPage( xPresentationPage->getNotesPage() );
456 std::make_shared<SlidePersist>(
457 rFilter,
false,
true, xCommentsPage,
458 std::make_shared<PPTShape>(
459 Slide,
"com.sun.star.drawing.GroupShape" ),
465 aCommentFragmentPath,
468 pCommentsPersistPtr->getCommentsList().cmLst.clear();
469 getFilter().importFragment( xCommentsFragmentHandler );
471 if (!pCommentsPersistPtr->getCommentsList().cmLst.empty())
476 assert(comment_handler);
480 pCommentsPersistPtr->getCommentsList().cmLst.back().setText(
484 pCommentsPersistPtr->getCommentAuthors().setValues(
maAuthorList);
487 for(
int i=0;
i<pCommentsPersistPtr->getCommentsList().getSize();
i++)
490 Comment aComment = pCommentsPersistPtr->getCommentsList().getCommentAtIndex(
i);
491 uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xSlide, UNO_QUERY_THROW );
492 uno::Reference< office::XAnnotation > xAnnotation( xAnnotationAccess->createAndInsertAnnotation() );
493 int nPosX = aComment.
getIntX();
494 int nPosY = aComment.
getIntY();
495 xAnnotation->setPosition(
496 geometry::RealPoint2D(
500 xAnnotation->setDateTime( aComment.
getDateTime() );
501 uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
502 xText->setString( aComment.
get_text());
503 }
catch( css::lang::IllegalArgumentException& ) {}
508 catch( uno::Exception& )
525 rFilterData[
"OriginalPageCount"] <<= nPageCount;
529 if( !aPageRange.getLength() )
531 aPageRange =
"1-" + OUString::number( nPageCount );
535 if (aRangeEnumerator.
size())
538 const Reference< task::XStatusIndicator >& rxStatusIndicator( getFilter().getStatusIndicator() );
539 if ( rxStatusIndicator.is() )
540 rxStatusIndicator->start( OUString(), 10000 );
544 int nPagesImported = 0;
545 for (sal_Int32 elem : aRangeEnumerator)
547 if ( rxStatusIndicator.is() )
548 rxStatusIndicator->setValue((nPagesImported * 10000) / aRangeEnumerator.size());
550 importSlide(elem, !nPagesImported, bImportNotesPages);
557 catch( uno::Exception& )
562 if ( rxStatusIndicator.is() )
563 rxStatusIndicator->end();
568 if (!aVbaFragmentPath.isEmpty())
570 uno::Reference<io::XInputStream> xInStrm = getFilter().openInputStream(aVbaFragmentPath);
573 StorageRef xPrjStrg = std::make_shared<oox::ole::OleStorage>(getFilter().getComponentContext(), xInStrm,
false);
574 getFilter().getVbaProject().importVbaProject(*xPrjStrg);
582 switch( aElementToken )
585 case PPT_TOKEN( sldMasterIdLst ):
586 case PPT_TOKEN( notesMasterIdLst ):
587 case PPT_TOKEN( sldIdLst ):
589 case PPT_TOKEN( sldMasterId ):
592 case PPT_TOKEN( sldId ):
595 case PPT_TOKEN( notesMasterId ):
598 case PPT_TOKEN( sldSz ):
601 case PPT_TOKEN( notesSz ):
604 case PPT_TOKEN( custShowLst ):
606 case PPT_TOKEN( defaultTextStyle ):
608 case PPT_TOKEN( modifyVerifier ):
609 OUString sAlgorithmClass = rAttribs.
getString(XML_cryptAlgorithmClass, OUString());
610 OUString sAlgorithmType = rAttribs.
getString(XML_cryptAlgorithmType, OUString());
611 sal_Int32 nAlgorithmSid = rAttribs.
getInteger(XML_cryptAlgorithmSid, 0);
612 sal_Int32 nSpinCount = rAttribs.
getInteger(XML_spinCount, 0);
613 OUString sSalt = rAttribs.
getString(XML_saltData, OUString());
615 if (sAlgorithmClass ==
"hash" && sAlgorithmType ==
"typeAny" && nAlgorithmSid != 0
616 && !sSalt.isEmpty() && !sHash.isEmpty())
618 OUString sAlgorithmName;
619 switch (nAlgorithmSid)
622 sAlgorithmName =
"MD2";
625 sAlgorithmName =
"MD4";
628 sAlgorithmName =
"MD5";
631 sAlgorithmName =
"SHA-1";
634 sAlgorithmName =
"MAC";
637 sAlgorithmName =
"RIPEMD";
640 sAlgorithmName =
"RIPEMD-160";
643 sAlgorithmName =
"HMAC";
646 sAlgorithmName =
"SHA-256";
649 sAlgorithmName =
"SHA-384";
652 sAlgorithmName =
"SHA-512";
657 if (!sAlgorithmName.isEmpty())
659 uno::Sequence<beans::PropertyValue> aResult{
667 uno::Reference<beans::XPropertySet> xDocSettings(
669 "com.sun.star.document.Settings"),
671 xDocSettings->setPropertyValue(
"ModifyPasswordInfo",
uno::Any(aResult));
673 catch (
const uno::Exception&)
687 SlidePersistPtr pMasterPersistPtr( rSlidePersistPtr->getMasterPersist() );
688 if ( pMasterPersistPtr )
692 const int nCount = xMasterSlide->getCount();
694 uno::Reference< beans::XPropertySet > xSet( xSlide, uno::UNO_QUERY_THROW );
695 xSet->setPropertyValue(
"Layout",
Any( pMasterPersistPtr->getLayoutFromValueToken() ) );
697 while( nCount < xMasterSlide->getCount())
699 Reference< drawing::XShape > xShape;
700 xMasterSlide->getByIndex(xMasterSlide->getCount()-1) >>= xShape;
701 xMasterSlide->remove(xShape);
704 while( xSlide->getCount() )
706 Reference< drawing::XShape > xShape;
707 xSlide->getByIndex(0) >>= xShape;
708 xSlide->remove( xShape );
712 if ( xPropertySet.is() )
715 xPropertySet->setPropertyValue(
"Width",
Any( rPageSize.Width ) );
716 xPropertySet->setPropertyValue(
"Height",
Any( rPageSize.Height ) );
719 if ( !rSlidePersistPtr->isMasterPage() )
720 aHeaderFooter.
mbSlideNumber = aHeaderFooter.mbHeader = aHeaderFooter.mbFooter = aHeaderFooter.mbDateTime =
false;
723 if ( rSlidePersistPtr->isNotesPage() )
724 xPropertySet->setPropertyValue(
"IsHeaderVisible",
Any( aHeaderFooter.mbHeader ) );
725 xPropertySet->setPropertyValue(
"IsFooterVisible",
Any( aHeaderFooter.mbFooter ) );
726 xPropertySet->setPropertyValue(
"IsDateTimeVisible",
Any( aHeaderFooter.mbDateTime ) );
727 xPropertySet->setPropertyValue(
"IsPageNumberVisible",
Any( aHeaderFooter.mbSlideNumber ) );
729 catch( uno::Exception& )
733 rSlidePersistPtr->setPath( rxSlideFragmentHandler->getFragmentPath() );
734 getFilter().importFragment( rxSlideFragmentHandler );
CommentAuthorList maAuthorList
std::shared_ptr< Relations > RelationsRef
sal_Int32 convertEmuToHmm(sal_Int64 nValue)
Converts the passed 64-bit integer value from EMUs to 1/100 mm.
static std::map< PredefinedClrSchemeId, OUString > PredefinedClrNames
css::awt::Size maNotesSize
OptValue< sal_Int32 > getInteger(sal_Int32 nAttrToken) const
Returns the 32-bit signed integer value of the specified attribute (decimal).
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
OptValue< OUString > getString(sal_Int32 nAttrToken) const
Returns the string value of the specified attribute.
std::shared_ptr< T > make_shared(Args &&...args)
std::shared_ptr< StorageBase > StorageRef
virtual ~PresentationFragmentHandler() noexcept override
std::array< TextParagraphProperties, NUM_TEXT_LIST_STYLE_ENTRIES > TextParagraphPropertiesArray
void saveThemeToGrabBag(const oox::drawingml::ThemePtr &pThemePtr, sal_Int32 nThemeIdx)
void importCustomSlideShow(std::vector< CustomShow > &rCustomShowList)
virtual void finalizeImport() override
::comphelper::SequenceAsHashMap & getFilterData() const
Returns the FilterData.
std::vector< CustomShow > maCustomShowList
TValueType getUnpackedValueOrDefault(const OUString &sKey, const TValueType &aDefault) const
std::vector< OUString > maNotesMasterVector
#define TOOLS_WARN_EXCEPTION(area, stream)
awt::Size GetSize2D(const Reference< XFastAttributeList > &xAttribs)
converts the attributes from a CT_Size2D into an awt Size with 1/100thmm
const ::std::vector< OUString > & getCharVector() const
std::vector< TextField > TextFieldStack
#define CREATE_MSOFFICE_RELATION_TYPE(ascii)
Expands to an OUString containing an MS Office specific relation type created from the passed literal...
HRESULT createInstance(REFIID iid, Ifc **ppIfc)
::oox::drawingml::TextListStylePtr mpTextListStyle
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
Provides access to attribute values of an element.
bool mbCommentAuthorsRead
const css::uno::Reference< css::frame::XModel > & getModel() const
Returns the document model (always existing).
std::vector< OUString > maSlidesVector
css::awt::Size maSlideSize
exports com.sun.star. presentation
std::vector< OUString > maSlideMasterVector
if(aStr!=aBuf) UpdateName_Impl(m_xFollowLb.get()
virtual ::oox::core::ContextHandlerRef onCreateContext(sal_Int32 aElementToken, const AttributeList &rAttribs) override
Will be called to create a context handler for the passed element.
::rtl::Reference< FragmentHandler > FragmentHandlerRef
const css::uno::Reference< css::xml::sax::XFastAttributeList > & getFastAttributeList() const
Returns the wrapped com.sun.star.xml.sax.XFastAttributeList object.
std::shared_ptr< SlidePersist > SlidePersistPtr
void importSlide(const ::oox::core::FragmentHandlerRef &rSlideFragmentHandler, const oox::ppt::SlidePersistPtr &rPersist)
::rtl::Reference< OContentHelper > xContent
#define SAL_WARN(area, stream)
Reference< XModel > xModel
PresentationFragmentHandler(::oox::core::XmlFilterBase &rFilter, const OUString &rFragmentPath)
static std::map< PredefinedClrSchemeId, sal_Int32 > PredefinedClrTokens
std::shared_ptr< Theme > ThemePtr
bool m_bDetectedRangeSegmentation false
static void ResolveTextFields(XmlFilterBase const &rFilter)