Kaydet (Commit) b38065ea authored tarafından Aron Budea's avatar Aron Budea Kaydeden (comit) Mike Kaganski

tdf#108691, tdf#119639 Don't print hidden objects in XLS(X)

In Excel hidden drawing objects aren't printed. When not
hidden, printing is controlled by a separate 'Print object'
setting.

Only rely visibility setting for now, but properly:
visible means also printed, hidden means not printed.
Ie. import visible property also as printable, and only
output visible property in XLS(X) formats.

For the future, in XLSX format printability is controlled by
attribute 'fPrintsWithSheet' of element 'clientData', don't
know about XLS, there fUsefPrint/fPrint bits don't appear to
be used anymore (see note in tdf#119639).

Change-Id: I728107b30056f7bf073f2fefddece1bef1eb2e7a
Reviewed-on: https://gerrit.libreoffice.org/59915
Tested-by: Jenkins
Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst ce4245a7
......@@ -1255,17 +1255,20 @@ void EscherPropertyContainer::CreateShapeProperties( const uno::Reference<drawin
uno::Reference< beans::XPropertySet > aXPropSet( rXShape, uno::UNO_QUERY );
if ( aXPropSet.is() )
{
bool bVal = false;
bool bVisible = false;
bool bPrintable = false;
uno::Any aAny;
sal_uInt32 nShapeAttr = 0;
if (EscherPropertyValueHelper::GetPropertyValue(aAny, aXPropSet, "Visible", true) && (aAny >>= bVal))
if (EscherPropertyValueHelper::GetPropertyValue(aAny, aXPropSet, "Visible", true) && (aAny >>= bVisible))
{
if ( !bVal )
if ( !bVisible )
nShapeAttr |= 0x20002; // set fHidden = true
}
if (EscherPropertyValueHelper::GetPropertyValue(aAny, aXPropSet, "Printable", true) && (aAny >>= bVal))
// This property (fPrint) isn't used in Excel anymore, leaving it for legacy reasons
// one change, based on XLSX: hidden implies not printed, let's not export the fPrint property in that case
if (bVisible && EscherPropertyValueHelper::GetPropertyValue(aAny, aXPropSet, "Printable", true) && (aAny >>= bPrintable))
{
if ( !bVal )
if ( !bPrintable )
nShapeAttr |= 0x10000; // set fPrint = false;
}
if ( nShapeAttr )
......
......@@ -4864,8 +4864,18 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
if ( pRet )
{
sal_Int32 nGroupProperties( GetPropertyValue( DFF_Prop_fPrint, 0 ) );
pRet->SetVisible( ( nGroupProperties & 2 ) == 0 );
pRet->SetPrintable( ( nGroupProperties & 1 ) != 0 );
const bool bVisible = ( ( nGroupProperties & 2 ) == 0 );
pRet->SetVisible( bVisible );
// In Excel hidden means not printed
if ( !bVisible )
{
pRet->SetPrintable( false );
}
else
{
// This property isn't used in Excel anymore, leaving it for legacy reasons
pRet->SetPrintable( ( nGroupProperties & 1 ) != 0 );
}
}
//Import alt text as description
......
......@@ -842,6 +842,9 @@ Reference< XShape > const & Shape::createAndInsert(
SAL_INFO("oox.drawingml", "Shape::createAndInsert: invisible shape with id='" << msId << "'");
const OUString sVisible( "Visible" );
xSet->setPropertyValue( sVisible, Any( false ) );
// In Excel hidden means not printed, let's use visibility for now until that's handled separately
const OUString sPrintable( "Printable" );
xSet->setPropertyValue( sPrintable, Any( false ) );
}
ActionLockGuard const alg(mxShape);
......
......@@ -188,6 +188,7 @@ public:
void testSheetCondensedCharacterSpaceXLSX();
void testTextUnderlineColorXLSX();
void testSheetRunParagraphPropertyXLSX();
void testHiddenShapeXLS();
void testHiddenShapeXLSX();
void testShapeAutofitXLSX();
void testHyperlinkXLSX();
......@@ -302,6 +303,7 @@ public:
CPPUNIT_TEST(testSheetCondensedCharacterSpaceXLSX);
CPPUNIT_TEST(testTextUnderlineColorXLSX);
CPPUNIT_TEST(testSheetRunParagraphPropertyXLSX);
CPPUNIT_TEST(testHiddenShapeXLS);
CPPUNIT_TEST(testHiddenShapeXLSX);
CPPUNIT_TEST(testShapeAutofitXLSX);
CPPUNIT_TEST(testHyperlinkXLSX);
......@@ -3576,14 +3578,42 @@ void ScExportTest::testPreserveTextWhitespace2XLSX()
xDocSh->DoClose();
}
void ScExportTest::testHiddenShapeXLS()
{
ScDocShellRef xDocSh = loadDoc("hiddenShape.", FORMAT_XLS);
CPPUNIT_ASSERT(xDocSh.is());
ScDocument& rDoc = xDocSh->GetDocument();
CPPUNIT_ASSERT(rDoc.GetTableCount() > 0);
ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
SdrPage* pPage = pDrawLayer->GetPage(0);
CPPUNIT_ASSERT(pPage);
SdrObject* pObj = pPage->GetObj(0);
CPPUNIT_ASSERT(pObj);
CPPUNIT_ASSERT_MESSAGE("Drawing object should not be visible.", !pObj->IsVisible());
CPPUNIT_ASSERT_MESSAGE("Drawing object should not be printable.", !pObj->IsPrintable());
xDocSh->DoClose();
}
void ScExportTest::testHiddenShapeXLSX()
{
ScDocShellRef xDocSh = loadDoc("hiddenShape.", FORMAT_XLSX);
CPPUNIT_ASSERT(xDocSh.is());
ScDocument& rDoc = xDocSh->GetDocument();
CPPUNIT_ASSERT(rDoc.GetTableCount() > 0);
ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
SdrPage* pPage = pDrawLayer->GetPage(0);
CPPUNIT_ASSERT(pPage);
SdrObject* pObj = pPage->GetObj(0);
CPPUNIT_ASSERT(pObj);
CPPUNIT_ASSERT_MESSAGE("Drawing object should not be visible.", !pObj->IsVisible());
CPPUNIT_ASSERT_MESSAGE("Drawing object should not be printable.", !pObj->IsPrintable());
xmlDocPtr pDoc = XPathHelper::parseExport2(*this, *xDocSh, m_xSFactory, "xl/drawings/drawing1.xml", FORMAT_XLSX);
CPPUNIT_ASSERT(pDoc);
assertXPath(pDoc, "/xdr:wsDr/xdr:twoCellAnchor/xdr:sp[1]/xdr:nvSpPr/xdr:cNvPr", "hidden", "1");
xDocSh->DoClose();
}
void ScExportTest::testShapeAutofitXLSX()
......
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