[Libreoffice-commits] core.git: wizards/source

Jean-Pierre Ledure (via logerrit) logerrit at kemper.freedesktop.org
Thu Aug 19 15:17:36 UTC 2021


 wizards/source/scriptforge/SF_Session.xba        |  113 +++++++++++++++++++++++
 wizards/source/scriptforge/python/scriptforge.py |    3 
 wizards/source/sfdocuments/SF_Calc.xba           |   15 ++-
 wizards/source/sfdocuments/SF_Chart.xba          |    2 
 wizards/source/sfdocuments/SF_Document.xba       |  101 ++++++++++++++++++++
 wizards/source/sfdocuments/SF_Writer.xba         |   11 ++
 6 files changed, 240 insertions(+), 5 deletions(-)

New commits:
commit 407b53dd2246e727d19fe94c82cb357af2e4f8ed
Author:     Jean-Pierre Ledure <jp at ledure.be>
AuthorDate: Thu Aug 19 15:58:22 2021 +0200
Commit:     Jean-Pierre Ledure <jp at ledure.be>
CommitDate: Thu Aug 19 17:16:59 2021 +0200

    ScriptForge - (PDF Export) get/set options, export as PDF file
    
    Next methods are introduced in SF_Session:
      - GetPDFExportOptions to extract a dictionary of the
        40+ existing options for PDF export
      - SetPDFExportOptions to update the existing options
        When applied the options are permanent also for user manual exports
    Those methods are not available in Python.
    
    Next method to export a document to PDF:
      - ExportAsPDF: it uses the options set above and/or takes
        next specific and transitional options:
          pages, password, watermark
    This method is implemented for use from Basic and Python
    
    Change-Id: Ic5c4190cff579e62137930f422638aad98e61a16
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120740
    Tested-by: Jean-Pierre Ledure <jp at ledure.be>
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp at ledure.be>

diff --git a/wizards/source/scriptforge/SF_Session.xba b/wizards/source/scriptforge/SF_Session.xba
index 63fd4c57bf0a..db3cb9449889 100644
--- a/wizards/source/scriptforge/SF_Session.xba
+++ b/wizards/source/scriptforge/SF_Session.xba
@@ -318,6 +318,61 @@ Catch:
 	GoTo Finally
 End Function	'	ScriptForge.SF_Session.ExecutePythonScript
 
+REM -----------------------------------------------------------------------------
+Public Function GetPDFExportOptions() As Variant
+'''	Return the actual values of the PDF export options
+'''	The PDF options are described on https://wiki.openoffice.org/wiki/API/Tutorials/PDF_export
+'''	PDF options are set at each use of the Export as ... PDF command by the user and kept
+'''	permanently until their reset by script or by a new export 
+'''	Args:
+'''	Returns:
+'''		A ScriptForge dictionary instance listing the 40+ properties and their value
+'''	Examples:
+'''		Dim dict As Object
+'''		Set dict = session.GetPDFExportOptions()
+'''		MsgBox dict.Item("Quality")
+
+Dim vDict As Variant				'	Returned value
+Dim oConfig As Object				'	com.sun.star.configuration.ConfigurationProvider
+Dim oNodePath As Object				'	com.sun.star.beans.PropertyValue
+Dim oOptions As Object				'	configmgr.RootAccess
+Dim vOptionNames As Variant			'	Array of PDF options names
+Dim vOptionValues As Variant		'	Array of PDF options values
+Dim i As Long
+
+Const cstThisSub = "Session.GetPDFExportOptions"
+Const cstSubArgs = ""
+
+	If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+	Set vDict = Nothing
+
+Check:
+	SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
+
+Try:
+	'	Get the (read-only) internal PDF options
+	Set oConfig = SF_Utils._GetUNOService("ConfigurationProvider")
+	Set oNodePath = SF_Utils._MakePropertyValue("nodepath", "/org.openoffice.Office.Common/Filter/PDF/Export/")
+	Set oOptions = oConfig.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", Array(oNodePath))
+
+	'	Copy the options into a ScriptForge dictionary
+	Set vDict = CreateScriptService("dictionary")
+	vOptionNames = oOptions.getElementNames()
+	vOptionValues = oOptions.getPropertyValues(vOptionNames)
+	'
+	For i = 0 To UBound(vOptionNames)
+		vDict.Add(vOptionNames(i), vOptionValues(i))
+	Next i
+
+
+Finally:
+	GetPDFExportOptions = vDict
+	SF_Utils._ExitFunction(cstThisSub)
+	Exit Function
+Catch:
+	GoTo Finally
+End Function	'	ScriptForge.SF_Session.GetPDFExportOptions
+
 REM -----------------------------------------------------------------------------
 Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
 '''	Return the actual value of the given property
@@ -665,6 +720,64 @@ CatchMail:
 	GoTo Finally
 End Sub			'	ScriptForge.SF_Session.SendMail
 
+REM -----------------------------------------------------------------------------
+Public Function SetPDFExportOptions(Optional ByRef PDFOptions As Variant) As Boolean
+'''	Modify the actual values of the PDF export options from an options dictionary
+'''	The PDF options are described on https://wiki.openoffice.org/wiki/API/Tutorials/PDF_export
+'''	PDF options are set at each use of the Export as ... PDF command by the user and kept
+'''	permanently until their reset by script (like this one) or by a new export
+'''	The changed options are applicable on any subsequent ExportToPDF user command or to any SaveAsPDF script execution
+'''	Args:
+'''		PDFOptions: a ScriptForge dictionary object
+'''	Returns:
+'''		True when successful
+'''	Examples:
+'''		Dim dict As Object
+'''		Set dict = session.GetPDFExportOptions()
+'''		dict.ReplaceItem("Quality", 50)
+'''		session.SetPDFExportOptions(dict)
+
+Dim bSetPDF As Boolean				'	Returned value
+Dim oConfig As Object				'	com.sun.star.configuration.ConfigurationProvider
+Dim oNodePath As Object				'	com.sun.star.beans.PropertyValue
+Dim oOptions As Object				'	configmgr.RootAccess
+Dim vOptionNames As Variant			'	Array of PDF options names
+Dim vOptionValues As Variant		'	Array of PDF options values
+Dim oDict As Object					'	Alias of PDFOptions
+Dim i As Long
+
+Const cstThisSub = "Session.SetPDFExportOptions"
+Const cstSubArgs = "PDFOptions"
+
+	If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+	bSetPDF = False
+
+Check:
+	If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+		If Not SF_Utils._Validate(PDFOptions, "PDFOptions", V_OBJECT, , , "DICTIONARY") Then GoTo Finally
+	End If
+
+Try:
+	'	Get the (updatable) internal PDF options
+	Set oConfig = SF_Utils._GetUNOService("ConfigurationProvider")
+	Set oNodePath = SF_Utils._MakePropertyValue("nodepath", "/org.openoffice.Office.Common/Filter/PDF/Export/")
+	Set oOptions = oConfig.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", Array(oNodePath))
+
+	'	Copy the options from the ScriptForge dictionary in argument to property values
+	Set oDict = PDFOptions
+	oOptions.setPropertyValues(oDict.Keys, oDict.Items)
+	oOptions.commitChanges()
+	
+	bSetPDF = True
+
+Finally:
+	SetPDFExportOptions = bSetPDF
+	SF_Utils._ExitFunction(cstThisSub)
+	Exit Function
+Catch:
+	GoTo Finally
+End Function	'	ScriptForge.SF_Session.SetPDFExportOptions
+
 REM -----------------------------------------------------------------------------
 Public Function SetProperty(Optional ByVal PropertyName As Variant _
 								, Optional ByRef Value As Variant _
diff --git a/wizards/source/scriptforge/python/scriptforge.py b/wizards/source/scriptforge/python/scriptforge.py
index 23b505a36ef7..714418ffd09c 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -1762,6 +1762,9 @@ class SFDocuments:
         def CloseDocument(self, saveask = True):
             return self.ExecMethod(self.vbMethod, 'CloseDocument', saveask)
 
+        def ExportAsPDF(self, filename, overwrite = False, pages = '', password = '', watermark = ''):
+            return self.ExecMethod(self.vbMethod, 'ExportAsPDF', filename, overwrite, pages, password, watermark)
+
         def PrintOut(self, pages = '', copies = 1):
             return self.ExecMethod(self.vbMethod, 'PrintOut', pages, copies)
 
diff --git a/wizards/source/sfdocuments/SF_Calc.xba b/wizards/source/sfdocuments/SF_Calc.xba
index 89afc16fc6ea..390e4b274165 100644
--- a/wizards/source/sfdocuments/SF_Calc.xba
+++ b/wizards/source/sfdocuments/SF_Calc.xba
@@ -928,7 +928,7 @@ Try:
 	'	Initialize sheet and range
 	Set oSheet = _Component.getSheets.getByName(SheetName)
 	Set oRange = _ParseAddress(Range)
-	'	Create the chart and get the corresponding chart instance
+	'	Create the chart and get ihe corresponding chart instance
 	oSheet.getCharts.addNewByName(ChartName, oRectangle, Array(oRange.XCellRange.RangeAddress), ColumnHeader, RowHeader)
 	Set oChart = Charts(SheetName, ChartName)
 	oChart._Shape.Name = ChartName		'	Both used-defined and internal names match ChartName
@@ -1525,6 +1525,7 @@ Public Function Methods() As Variant
 					, "DMax" _
 					, "DMin" _
 					, "DSum" _
+					, "ExportAsPDF" _
 					, "GetColumnName" _
 					, "GetFormula" _
 					, "GetValue" _
@@ -2425,6 +2426,16 @@ Public Function CloseDocument(Optional ByVal SaveAsk As Variant) As Boolean
 	CloseDocument = [_Super].CloseDocument(SaveAsk)
 End Function   '   SFDocuments.SF_Calc.CloseDocument
 
+REM -----------------------------------------------------------------------------
+Public Function ExportAsPDF(Optional ByVal FileName As Variant _
+							, Optional ByVal Overwrite As Variant _
+							, Optional ByVal Pages As Variant _
+							, Optional ByVal Password As Variant _
+							, Optional ByVal Watermark As Variant _
+							) As Boolean
+	ExportAsPDF = [_Super].ExportAsPDF(FileName, Overwrite, Pages, Password, Watermark)
+End Function   '   SFDocuments.SF_Calc.ExportAsPDF
+
 REM -----------------------------------------------------------------------------
 Public Sub RunCommand(Optional ByVal Command As Variant)
 	[_Super].RunCommand(Command)
@@ -3218,4 +3229,4 @@ CatchDuplicate:
 End Function	'	SFDocuments.SF_Calc._ValidateSheet
 
 REM ============================================ END OF SFDOCUMENTS.SF_CALC
-</script:module>
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdocuments/SF_Chart.xba b/wizards/source/sfdocuments/SF_Chart.xba
index 357a2826488b..175fecfccaf8 100644
--- a/wizards/source/sfdocuments/SF_Chart.xba
+++ b/wizards/source/sfdocuments/SF_Chart.xba
@@ -812,4 +812,4 @@ Private Function _Repr() As String
 End Function	'	SFDocuments.SF_Chart._Repr
 
 REM ============================================ END OF SFDOCUMENTS.SF_CHART
-</script:module>
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdocuments/SF_Document.xba b/wizards/source/sfdocuments/SF_Document.xba
index 40c39822d531..00aa22fc08b4 100644
--- a/wizards/source/sfdocuments/SF_Document.xba
+++ b/wizards/source/sfdocuments/SF_Document.xba
@@ -459,6 +459,102 @@ Catch:
 	GoTo Finally
 End Function   '   SFDocuments.SF_Document.CloseDocument
 
+REM -----------------------------------------------------------------------------
+Public Function ExportAsPDF(Optional ByVal FileName As Variant _
+							, Optional ByVal Overwrite As Variant _
+							, Optional ByVal Pages As Variant _
+							, Optional ByVal Password As Variant _
+							, Optional ByVal Watermark As Variant _
+							) As Boolean
+'''	Store the document to the given file location in PDF format
+'''	Args:
+'''		FileName: Identifies the file where to save. It must follow the SF_FileSystem.FileNaming notation
+'''		Overwrite: True if the destination file may be overwritten (default = False)
+'''		Pages: the pages to print as a string, like in the user interface. Example: "1-4;10;15-18". Default = all pages
+'''		Password: password to open the document
+'''		Watermark: the text for a watermark to be drawn on every page of the exported PDF file
+'''	Returns:
+'''		False if the document could not be saved
+'''	Exceptions:
+'''		DOCUMENTSAVEASERROR		The destination has its readonly attribute set or overwriting rejected
+'''	Examples:
+'''		oDoc.ExportAsPDF("C:\Me\myDoc.pdf", Overwrite := True)
+
+Dim bSaved As Boolean				'	return value
+Dim oSfa As Object					'	com.sun.star.ucb.SimpleFileAccess
+Dim sFile As String					'	Alias of FileName
+Dim sFilter As String				'	One of the pdf filter names
+Dim vFilterData As Variant			'	Array of com.sun.star.beans.PropertyValue
+Dim vProperties As Variant			'	Array of com.sun.star.beans.PropertyValue
+Dim FSO As Object					'	SF_FileSystem
+Const cstThisSub = "SFDocuments.Document.ExportAsPDF"
+Const cstSubArgs = "FileName, [Overwrite=False], [Pages=""""], [Password=""""], [Watermark=""""]"
+
+	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo CatchError
+	bSaved = False
+
+Check:
+	If IsMissing(Overwrite) Or IsEmpty(Overwrite) Then Overwrite = False
+	If IsMissing(Pages) Or IsEmpty(Pages) Then Pages = ""
+	If IsMissing(Password) Or IsEmpty(Password) Then Password = ""
+	If IsMissing(Watermark) Or IsEmpty(Watermark) Then Watermark = ""
+
+	If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+		If Not _IsStillAlive() Then GoTo Finally
+		If Not SF_Utils._ValidateFile(FileName, "FileName") Then GoTo Finally
+		If Not SF_Utils._Validate(Overwrite, "Overwrite", V_BOOLEAN) Then GoTo Finally
+		If Not SF_Utils._Validate(Pages, "Pages", V_STRING) Then GoTo Finally
+		If Not SF_Utils._Validate(Password, "Password", V_STRING) Then GoTo Finally
+		If Not SF_Utils._Validate(Watermark, "Watermark", V_STRING) Then GoTo Finally
+	End If
+
+	'	Check destination file overwriting
+	Set FSO = CreateScriptService("FileSystem")
+	sFile = FSO._ConvertToUrl(FileName)
+	If FSO.FileExists(FileName) Then
+		If Overwrite = False Then GoTo CatchError
+		Set oSfa = ScriptForge.SF_Utils._GetUNOService("FileAccess")
+		If oSfa.isReadonly(sFile) Then GoTo CatchError
+	End If
+
+Try:
+	'	Setup arguments
+	sFilter = LCase(_DocumentType) & "_pdf_Export"
+	'	FilterData parameters are added only if they are meaningful
+	vFilterData = Array()
+	If Len(Pages) > 0 Then
+		vFilterData = ScriptForge.SF_Array.Append(vFilterData _
+								, ScriptForge.SF_Utils._MakePropertyValue("PageRange", Pages))
+	End If
+	If Len(Password) > 0 Then
+		vFilterData = ScriptForge.SF_Array.Append(vFilterData _
+								, ScriptForge.SF_Utils._MakePropertyValue("EncryptFile", True) _
+								, ScriptForge.SF_Utils._MakePropertyValue("DocumentOpenPassword", Password))
+	End If
+	If Len(Watermark) > 0 Then
+		vFilterData = ScriptForge.SF_Array.Append(vFilterData _
+								, ScriptForge.SF_Utils._MakePropertyValue("Watermark", Watermark))
+	End If
+
+	'	Finalize properties and export
+	vProperties = Array( _
+						ScriptForge.SF_Utils._MakePropertyValue("FilterName", sFilter) _
+						, ScriptForge.SF_Utils._MakePropertyValue("FilterData", vFilterData))
+	_Component.StoreToURL(sFile, vProperties)
+	bSaved = True
+
+Finally:
+	ExportAsPDF = bSaved
+	ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+	Exit Function
+Catch:
+	GoTo Finally
+CatchError:
+	ScriptForge.SF_Exception.RaiseFatal(DOCUMENTSAVEASERROR, "FileName", FileName, "Overwrite", Overwrite _
+					, "FilterName", "PDF Export")
+	GoTo Finally
+End Function   '   SFDocuments.SF_Document.ExportAsPDF
+
 REM -----------------------------------------------------------------------------
 Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
 '''	Return the actual value of the given property
@@ -500,6 +596,7 @@ Public Function Methods() As Variant
 	Methods = Array( _
 					"Activate" _
 					, "CloseDocument" _
+					, "ExportAsPDF" _
 					, "PrintOut" _
 					, "RunCommand" _
 					, "Save" _
@@ -745,7 +842,7 @@ Try:
 								, ScriptForge.SF_Utils._MakePropertyValue("FilterOptions", FilterOptions) _
 							)
 		If Len(Password) > 0 Then		'	Password is to add only if <> "" !?
-			vProperties = ScriptForge.SF_Array.Append(vproperties _
+			vProperties = ScriptForge.SF_Array.Append(vProperties _
 								, ScriptForge.SF_Utils._MakePropertyValue("Password", Password))
 		End If
 	End If
@@ -844,7 +941,7 @@ Try:
 								, ScriptForge.SF_Utils._MakePropertyValue("FilterOptions", FilterOptions) _
 							)
 		If Len(Password) > 0 Then		'	Password is to add only if <> "" !?
-			vProperties = ScriptForge.SF_Array.Append(vproperties _
+			vProperties = ScriptForge.SF_Array.Append(vProperties _
 								, ScriptForge.SF_Utils._MakePropertyValue("Password", Password))
 		End If
 	End If
diff --git a/wizards/source/sfdocuments/SF_Writer.xba b/wizards/source/sfdocuments/SF_Writer.xba
index 7d839c7b5ba6..4acdd5c750f0 100644
--- a/wizards/source/sfdocuments/SF_Writer.xba
+++ b/wizards/source/sfdocuments/SF_Writer.xba
@@ -219,6 +219,7 @@ Public Function Methods() As Variant
 	Methods = Array( _
 					"Activate" _
 					, "CloseDocument" _
+					, "ExportAsPDF" _
 					, "Forms" _
 					, "PrintOut" _
 					, "RunCommand" _
@@ -491,6 +492,16 @@ Public Function CloseDocument(Optional ByVal SaveAsk As Variant) As Boolean
 	CloseDocument = [_Super].CloseDocument(SaveAsk)
 End Function   '   SFDocuments.SF_Writer.CloseDocument
 
+REM -----------------------------------------------------------------------------
+Public Function ExportAsPDF(Optional ByVal FileName As Variant _
+							, Optional ByVal Overwrite As Variant _
+							, Optional ByVal Pages As Variant _
+							, Optional ByVal Password As Variant _
+							, Optional ByVal Watermark As Variant _
+							) As Boolean
+	ExportAsPDF = [_Super].ExportAsPDF(FileName, Overwrite, Pages, Password, Watermark)
+End Function   '   SFDocuments.SF_Writer.ExportAsPDF
+
 REM -----------------------------------------------------------------------------
 Public Sub RunCommand(Optional ByVal Command As Variant)
 	[_Super].RunCommand(Command)


More information about the Libreoffice-commits mailing list