Kaydet (Commit) ff2f55d6 authored tarafından Ravindra Vidhate's avatar Ravindra Vidhate Kaydeden (comit) Miklos Vajna

fdo#35324: Text and picture water are not imported and not preserved in RT.

Problem : Open docx file which has Text/Picture as water mark.
1. The text is not imported properly also picture water mark is also considered as shape.
2. It writes the watermarks in Document.xml, while it should write in only Header.xml.

Conflicts:
	sw/qa/extras/ooxmlexport/ooxmlexport.cxx

Reviewed on:
	https://gerrit.libreoffice.org/8457

Change-Id: Ic988858da25a4cba3ae16e614d920e2e16053a5f
üst e895da04
...@@ -90,7 +90,7 @@ public: ...@@ -90,7 +90,7 @@ public:
sal_Int16 eVOri = -1, sal_Int16 eHRel = -1, sal_Int16 eVOri = -1, sal_Int16 eHRel = -1,
sal_Int16 eVRel = -1, const Point* pNdTopLeft = 0, const sal_Bool bOOxmlExport = false ); sal_Int16 eVRel = -1, const Point* pNdTopLeft = 0, const sal_Bool bOOxmlExport = false );
virtual void AddSdrObjectVMLObject( const SdrObject& rObj); virtual void AddSdrObjectVMLObject( const SdrObject& rObj);
static bool IsWaterMarkShape(const OUString& rStr);
protected: protected:
/// Add an attribute to the generated <v:shape/> element. /// Add an attribute to the generated <v:shape/> element.
/// ///
......
...@@ -175,7 +175,28 @@ void VMLExport::AddShape( sal_uInt32 nShapeType, sal_uInt32 nShapeFlags, sal_uIn ...@@ -175,7 +175,28 @@ void VMLExport::AddShape( sal_uInt32 nShapeType, sal_uInt32 nShapeFlags, sal_uIn
{ {
m_nShapeType = nShapeType; m_nShapeType = nShapeType;
m_nShapeFlags = nShapeFlags; m_nShapeFlags = nShapeFlags;
m_pShapeAttrList->add( XML_id, ShapeIdString( nShapeId ) ); // If shape is a watermark object - should keep the original shape's name
// because Microsoft detects if it is a watermark by the actual name
if (!IsWaterMarkShape(m_pSdrObject->GetName()))
{
// Not a watermark object
m_pShapeAttrList->add( XML_id, ShapeIdString( nShapeId ) );
}
else
{
// A watermark object - store the optional shape ID also ('o:spid')
m_pShapeAttrList->add( XML_id, OUStringToOString(m_pSdrObject->GetName(), RTL_TEXTENCODING_UTF8) );
}
}
bool VMLExport::IsWaterMarkShape(const OUString& rStr)
{
if (rStr.isEmpty() ) return false;
if (rStr.match(OUString("PowerPlusWaterMarkObject")) || rStr.match(OUString("WordPictureWatermark")))
return true;
else
return false;
} }
static void impl_AddArrowHead( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue ) static void impl_AddArrowHead( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue )
...@@ -787,7 +808,9 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect ...@@ -787,7 +808,9 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect
aStream.Seek(0); aStream.Seek(0);
OUString idStr = SvxMSDffManager::MSDFFReadZString(aStream, it->nPropSize, true); OUString idStr = SvxMSDffManager::MSDFFReadZString(aStream, it->nPropSize, true);
aStream.Seek(0); aStream.Seek(0);
m_pShapeAttrList->add(XML_ID, OUStringToOString(idStr, RTL_TEXTENCODING_UTF8)); if (!IsWaterMarkShape(m_pSdrObject->GetName()))
m_pShapeAttrList->add(XML_ID, OUStringToOString(idStr, RTL_TEXTENCODING_UTF8));
bAlreadyWritten[ESCHER_Prop_wzName] = true; bAlreadyWritten[ESCHER_Prop_wzName] = true;
} }
break; break;
......
...@@ -911,6 +911,32 @@ DECLARE_OOXMLEXPORT_TEST(testDkVert, "dkvert.docx") ...@@ -911,6 +911,32 @@ DECLARE_OOXMLEXPORT_TEST(testDkVert, "dkvert.docx")
CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty<drawing::Hatch>(xShape, "FillHatch").Distance); CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty<drawing::Hatch>(xShape, "FillHatch").Distance);
} }
DECLARE_OOXMLEXPORT_TEST(testTextWatermark, "textWatermark.docx")
{
//The problem was that the watermark ID was not preserved,
//and Word uses the object ID to identify if it is a watermark.
//It has to have the 'PowerPlusWaterMarkObject' string in it
xmlDocPtr pXmlHeader1 = parseExport("word/header1.xml");
if (!pXmlHeader1)
return;
assertXPath(pXmlHeader1, "/w:hdr[1]/w:p[1]/w:r[1]/w:pict[1]/v:shape[1]","id","PowerPlusWaterMarkObject93701316");
}
DECLARE_OOXMLEXPORT_TEST(testPictureWatermark, "pictureWatermark.docx")
{
//The problem was that the watermark ID was not preserved,
//and Word uses the object ID to identify if it is a watermark.
//It has to have the 'WordPictureWaterMarkObject' string in it
xmlDocPtr pXmlHeader1 = parseExport("word/header1.xml");
if (!pXmlHeader1)
return;
// Check the watermark ID
assertXPath(pXmlHeader1, "/w:hdr[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Fallback[1]/w:pict[1]/v:rect[1]","id","WordPictureWatermark11962361");
}
#endif #endif
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
#include <fmtrowsplt.hxx> #include <fmtrowsplt.hxx>
#include <com/sun/star/i18n/ScriptType.hpp> #include <com/sun/star/i18n/ScriptType.hpp>
#include <com/sun/star/i18n/WordType.hpp> #include <com/sun/star/i18n/WordType.hpp>
#include <oox/export/vmlexport.hxx>
#include <filter/msfilter/sprmids.hxx> #include <filter/msfilter/sprmids.hxx>
...@@ -103,6 +104,7 @@ using namespace sw::util; ...@@ -103,6 +104,7 @@ using namespace sw::util;
using namespace sw::types; using namespace sw::types;
using namespace sw::mark; using namespace sw::mark;
using namespace nsFieldFlags; using namespace nsFieldFlags;
using namespace ::oox::vml;
static OUString lcl_getFieldCode( const IFieldmark* pFieldmark ) static OUString lcl_getFieldCode( const IFieldmark* pFieldmark )
{ {
...@@ -518,6 +520,26 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby ) ...@@ -518,6 +520,26 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby )
m_rExport.AttrOutput().OutputItem( *pGrabBag ); m_rExport.AttrOutput().OutputItem( *pGrabBag );
} }
bool SwWW8AttrIter::IsWatermarkFrame()
{
if (maFlyFrms.size() != 1)
return false;
while ( maFlyIter != maFlyFrms.end() )
{
const SdrObject* pSdrObj = maFlyIter->GetFrmFmt().FindRealSdrObject();
if (pSdrObj)
{
if (VMLExport::IsWaterMarkShape(pSdrObj->GetName()))
return true;
}
++maFlyIter;
}
return false;
}
void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos) void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos)
{ {
/* /*
...@@ -533,7 +555,34 @@ void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos) ...@@ -533,7 +555,34 @@ void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos)
if ( nPos != nSwPos ) if ( nPos != nSwPos )
break; break;
m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter ); const SdrObject* pSdrObj = maFlyIter->GetFrmFmt().FindRealSdrObject();
if (pSdrObj)
{
if (VMLExport::IsWaterMarkShape(pSdrObj->GetName()))
{
// This is a watermark object. Should be written ONLY in the header
if(m_rExport.nTxtTyp == TXT_HDFT)
{
// Should write a watermark in the header
m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
}
else
{
// Should not write watermark object in the main body text
}
}
else
{
// This is not a watermark object - write normally
m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
}
}
else
{
// This is not a watermark object - write normally
m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
}
++maFlyIter; ++maFlyIter;
} }
} }
...@@ -1904,6 +1953,13 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode ) ...@@ -1904,6 +1953,13 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
bLastCR = true; bLastCR = true;
} }
// In order to make sure watermark is stored in 'header.xml', check nTxtTyp.
// if it is document.xml, don't write the tags (watermark should be only in the 'header')
SwWW8AttrIter aWatermarkAttrIter( *this, rNode );
if (( TXT_HDFT != nTxtTyp) && aWatermarkAttrIter.IsWatermarkFrame())
{
return;
}
bool bFlyInTable = mpParentFrame && IsInTable(); bool bFlyInTable = mpParentFrame && IsInTable();
......
...@@ -1539,6 +1539,8 @@ public: ...@@ -1539,6 +1539,8 @@ public:
OUString GetSnippet(const OUString &rStr, sal_Int32 nAktPos, OUString GetSnippet(const OUString &rStr, sal_Int32 nAktPos,
sal_Int32 nLen) const; sal_Int32 nLen) const;
const SwFmtDrop& GetSwFmtDrop() const { return mrSwFmtDrop; } const SwFmtDrop& GetSwFmtDrop() const { return mrSwFmtDrop; }
bool IsWatermarkFrame();
}; };
/// Class to collect and output the styles table. /// Class to collect and output the styles table.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment