Handle SinglePageSheets option for pdf export
When the single page sheets option is selected
on the pdf export dialog of Calc, a pdf for general
preview of the document is created, which is not
meant for printing.
Each sheet is exported as a single page, thus causing
the resulting pdf to have pages with different sizes.
This is a follow-up to commit 079cd016408d54d91
Change-Id: I038761f06bbf4b0425df89bcda4ee111a61be1d5
Reviewed-on: https://gerrit.libreoffice.org/79895
Tested-by: Jenkins CollaboraOffice <[email protected]>
Reviewed-by: Muhammet Kara <[email protected]>
Reviewed-on: https://gerrit.libreoffice.org/80635
Tested-by: Jenkins
diff --git a/filter/source/pdf/pdfexport.cxx b/filter/source/pdf/pdfexport.cxx
index b0a91ac..2cf302b 100644
--- a/filter/source/pdf/pdfexport.cxx
+++ b/filter/source/pdf/pdfexport.cxx
@@ -860,7 +860,7 @@
pPDFExtOutDevData->SetIsReduceImageResolution( mbReduceImageResolution );
pPDFExtOutDevData->SetIsExportNamedDestinations( mbExportBmkToDest );
Sequence< PropertyValue > aRenderOptions( 7 );
Sequence< PropertyValue > aRenderOptions( 8 );
aRenderOptions[ 0 ].Name = "RenderDevice";
aRenderOptions[ 0 ].Value <<= uno::Reference<awt::XDevice>(xDevice.get());
aRenderOptions[ 1 ].Name = "ExportNotesPages";
@@ -876,6 +876,8 @@
aRenderOptions[ 5 ].Value <<= aPageRange;
aRenderOptions[ 6 ].Name = "ExportPlaceholders";
aRenderOptions[ 6 ].Value <<= mbExportPlaceholders;
aRenderOptions[ 7 ].Name = "SinglePageSheets";
aRenderOptions[ 7 ].Value <<= mbSinglePageSheets;
if( !aPageRange.isEmpty() || !aSelection.hasValue() )
{
@@ -925,7 +927,7 @@
}
const bool bExportPages = !bExportNotesPages || !mbExportOnlyNotesPages;
if( aPageRange.isEmpty() )
if( aPageRange.isEmpty() || mbSinglePageSheets)
{
aPageRange = OUString::number( 1 ) + "-" + OUString::number(nPageCount );
}
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 58fdad8..e312f9e 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -1594,13 +1594,22 @@
maValidPages.clear();
sal_Int32 nContent = 0;
bool bSinglePageSheets = false;
for ( const auto& rValue : rOptions)
{
if ( rValue.Name == "PrintRange" )
{
rValue.Value >>= nContent;
break;
}
else if ( rValue.Name == "SinglePageSheets" )
{
rValue.Value >>= bSinglePageSheets;
}
}
if (bSinglePageSheets)
{
return pDocShell->GetDocument().GetTableCount();
}
bool bIsPrintEvenPages = nContent != 3;
@@ -1660,6 +1669,7 @@
// #i115266# if FillRenderMarkData fails, keep nTotalPages at 0, but still handle getRenderer(0) below
long nTotalPages = 0;
bool bRenderToGraphic = false;
bool bSinglePageSheets = false;
if ( FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr, bRenderToGraphic ) )
{
if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) )
@@ -1668,7 +1678,21 @@
}
nTotalPages = pPrintFuncCache->GetPageCount();
}
for ( const auto& rValue : rOptions)
{
if ( rValue.Name == "SinglePageSheets" )
{
rValue.Value >>= bSinglePageSheets;
break;
}
}
if (bSinglePageSheets)
nTotalPages = pDocShell->GetDocument().GetTableCount();
sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages );
if ( nRenderer < 0 )
{
if ( nSelRenderer != 0 )
@@ -1713,7 +1737,9 @@
// printer is used as device (just for page layout), draw view is not needed
SCTAB nTab;
if ( !maValidPages.empty() )
if (bSinglePageSheets)
nTab = nSelRenderer;
else if ( !maValidPages.empty() )
nTab = pPrintFuncCache->GetTabForPage( maValidPages.at( nRenderer )-1 );
else
nTab = pPrintFuncCache->GetTabForPage( nRenderer );
@@ -1721,7 +1747,56 @@
ScRange aRange;
const ScRange* pSelRange = nullptr;
if ( aMark.IsMarked() )
if ( bSinglePageSheets )
{
awt::Size aPageSize;
SCCOL nStartCol;
SCROW nStartRow;
const ScDocument* pDocument = &pDocShell->GetDocument();
pDocument->GetDataStart( nTab, nStartCol, nStartRow );
SCCOL nEndCol;
SCROW nEndRow;
pDocument->GetPrintArea( nTab, nEndCol, nEndRow );
aRange.aStart = ScAddress(nStartCol, nStartRow, nTab);
aRange.aEnd = ScAddress(nEndCol, nEndRow, nTab);
pSelRange = &aRange;
table::CellRangeAddress aRangeAddress( nTab,
aRange.aStart.Col(), aRange.aStart.Row(),
aRange.aEnd.Col(), aRange.aEnd.Row() );
tools::Rectangle aMMRect( pDocShell->GetDocument().GetMMRect(
aRange.aStart.Col(), aRange.aStart.Row(),
aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab()));
aPageSize.Width = aMMRect.GetWidth();
aPageSize.Height = aMMRect.GetHeight();
awt::Size aCalcPageSize ( aMMRect.GetSize().Width(), aMMRect.GetSize().Height() );
awt::Point aCalcPagePos( aMMRect.getX(), aMMRect.getY() );
uno::Sequence<beans::PropertyValue> aSequence(5);
beans::PropertyValue* pArray = aSequence.getArray();
pArray[0].Name = SC_UNONAME_PAGESIZE;
pArray[0].Value <<= aPageSize;
// #i111158# all positions are relative to the whole page, including non-printable area
pArray[1].Name = SC_UNONAME_INC_NP_AREA;
pArray[1].Value <<= true;
pArray[2].Name = SC_UNONAME_SOURCERANGE;
pArray[2].Value <<= aRangeAddress;
pArray[3].Name = SC_UNONAME_CALCPAGESIZE;
pArray[3].Value <<= aCalcPageSize;
pArray[4].Name = SC_UNONAME_CALCPAGEPOS;
pArray[4].Value <<= aCalcPagePos;
if( ! pPrinterOptions )
pPrinterOptions.reset(new ScPrintUIOptions);
else
pPrinterOptions->SetDefaults();
pPrinterOptions->appendPrintUIOptions( aSequence );
return aSequence;
}
else if ( aMark.IsMarked() )
{
aMark.GetMarkArea( aRange );
pSelRange = &aRange;
@@ -1840,6 +1915,7 @@
ScPrintSelectionStatus aStatus;
OUString aPagesStr;
bool bRenderToGraphic = false;
bool bSinglePageSheets = false;
if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr, bRenderToGraphic ) )
throw lang::IllegalArgumentException();
@@ -1848,6 +1924,19 @@
pPrintFuncCache.reset(new ScPrintFuncCache( pDocShell, aMark, aStatus ));
}
long nTotalPages = pPrintFuncCache->GetPageCount();
for ( const auto& rValue : rOptions)
{
if ( rValue.Name == "SinglePageSheets" )
{
rValue.Value >>= bSinglePageSheets;
break;
}
}
if (bSinglePageSheets)
nTotalPages = pDocShell->GetDocument().GetTableCount();
sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages );
if ( nRenderer < 0 )
throw lang::IllegalArgumentException();
@@ -1860,7 +1949,39 @@
ScRange aRange;
const ScRange* pSelRange = nullptr;
if ( aMark.IsMarked() )
if ( bSinglePageSheets )
{
awt::Size aPageSize;
SCCOL nStartCol;
SCROW nStartRow;
rDoc.GetDataStart( nSelRenderer, nStartCol, nStartRow );
SCCOL nEndCol;
SCROW nEndRow;
rDoc.GetPrintArea( nSelRenderer, nEndCol, nEndRow );
aRange.aStart = ScAddress(nStartCol, nStartRow, nSelRenderer);
aRange.aEnd = ScAddress(nEndCol, nEndRow, nSelRenderer);
tools::Rectangle aMMRect( pDocShell->GetDocument().GetMMRect(
aRange.aStart.Col(), aRange.aStart.Row(),
aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab()));
aPageSize.Width = aMMRect.GetWidth();
aPageSize.Height = aMMRect.GetHeight();
//Set visible tab
SCTAB nVisTab = rDoc.GetVisibleTab();
if (nVisTab != nSelRenderer)
{
nVisTab = nSelRenderer;
rDoc.SetVisibleTab(nVisTab);
}
pDocShell->DoDraw(pDev, Point(0,0), Size(aPageSize.Width, aPageSize.Height), JobSetup());
return;
}
else if ( aMark.IsMarked() )
{
aMark.GetMarkArea( aRange );
pSelRange = &aRange;
@@ -1902,6 +2023,8 @@
} aDrawViewKeeper;
SCTAB nTab;
if (bSinglePageSheets)
nTab = nSelRenderer;
if ( !maValidPages.empty() )
nTab = pPrintFuncCache->GetTabForPage( maValidPages.at( nRenderer )-1 );
else