Der Filter "writer_pdf_Export" ignoriert alle Argumente aus den mitgegebenen FilterData-Properties

Das mit dem Macro-Recorder aufgenommene Macro zum Exportieren als PDF ignoriert alle Argumente des PDFDialogs (hier in args1(2).Value):

args1(0).Name = "URL"
args1(0).Value = "file:///C:/<Pfad zur Datei>/OrigDPI-Vf.pdf"
args1(1).Name = "FilterName"
args1(1).Value = "writer_pdf_Export"
args1(2).Name = "FilterData"
args1(2).Value = Array(Array("UseLosslessCompression",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE), [...55 weitere Optionen...] )
dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args1())

Es werden immer die aktuellen Einstellungen des PDFExportDialogs verwendet, wie es eigendlich nur bei “ExportDirectToPDF” sein sollte.

Was mache ich bzw. der MacroRecorder falsch?
Gibt es einen bekannten Workaround um dennoch automatisiert PDFs mit den gewünschten Optionen zu erzeugen?
(LibreOffice 7.1.5.2 (x64) auf Windows 10)

Es liegt nicht am dispatcher, auch der direkte Aufruf funktioniert nicht:

dim args1(2)  as New com.sun.star.beans.PropertyValue
args1(1).Name = "FilterName"
args1(1).Value = "writer_pdf_Export"
args1(2).Name = "FilterData"
args1(2).Value = Array(Array("UseLosslessCompression",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE), [...55 weitere Optionen...] )
targetURL = "file:///C:/<Pfad zur Datei>/OrigDPI-Vf.pdf"
ThisComponent.storeToURL(targetURL, args1())

Hat keiner eine Idee dazu?

Es funktioniert auch nicht mit den LibreOffice Versionen 7.1.6 und 7.2.1.

Ich habe nun einen Fehlerbericht eingemeldet:
https://bugs.documentfoundation.org/show_bug.cgi?id=144653
Mal sehen…

Hallo,
versuche es mal hiermit, mit einem großen Bild im odt. Bei mir gibt es zwei unterschiedlich große pdfs

Sub Main

dim filterArgs(1) as New com.sun.star.beans.PropertyValue
filterArgs(1).Name = "Quality"
filterArgs(1).Value = 10

dim args1(2) as New com.sun.star.beans.PropertyValue
args1(1).Name = "FilterName"
args1(1).Value = "writer_pdf_Export"
args1(2).Name = "FilterData"

args1(2).Value = filterArgs

ThisComponent.storeToURL("file:///C:/Users/Martin/Desktop/V1.pdf", args1())

filterArgs(1).Value = 90
args1(2).Value = filterArgs

ThisComponent.storeToURL("file:///C:/Users/Martin/Desktop/V2.pdf", args1())

End Sub

Gruß ms777

1 Like

Danke für deine Bemühungen, @ms777, dein Code funktioniert.

Mein Problem ist, dass ich in FilterData statt einem einzelnen PropertyValue eine Sequenz von mehreren PropertyValues übergeben will. Das scheint in LibreOffice-Basic nicht zu funktionieren bzw. habe ich es noch nicht herausgefunden. Vermutlich liegt es an den impliziten Mapping Regeln zwischen Basic und UNO Objekten. Der DevGuide konnte mir nicht weiter helfen.

LG grv0815

Wenn ich eure Codes vergleiche, finde ich bei ms777 die von Ihm genutzten FilterArgs als .Name/.Value -Paar, wie bei den anderen Parametern auch.

Du nutzt dagegen array(array( ohne eine Name/Value -Paarbildung, was für mich nicht dasselbe ist.

Kann es sein, dass Du die Prameterübergabe an einen dispatch-Befehl aufgezeichnet hast und dies jetzt direkt fur einen api-call verwendest?

1 Like

Ja, der originale Code stammt von der Macro-Aufzeichnung. Das ist die einfachste Möglichkeit um die internen Namen und Aufzählungstypen für die Werte herauszufinden. Das UNOPropertyValue-Struct besteht aus vier Komponenten, wobei nur Name und Wert benötigt wird.

Ich habe nun meinen Fehler gefunden.
Im zugehörigen Dialog habe ich abhängige Properties als UNO-Objekte direkt im UNO-PropertySequenz Objekt bzw. als Basic-Array Eintrag zugewiesen. Das hat das Sequenz-Objekt wohl zerstört und der Export-Call hat es stillschweigend ignoriert.

Hier ist die lauffähige Version zum setzen mehrerer PropertyValues, analog zu ms777’s Ansatz:

Sub TestEportPDF
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	dim FilePath as String
	FilePath = "file:///C:/<YourPersonalPath>/"
	dim filterArgs(3) as New com.sun.star.beans.PropertyValue
	' high quality settings for printing
	filterArgs(0).Name = "UseLosslessCompression"
	filterArgs(0).Value = True
	filterArgs(1).Name = "Quality"
	filterArgs(1).Value = 90
	filterArgs(2).Name = "ReduceImageResolution"
	filterArgs(2).Value = False
	filterArgs(3).Name = "MaxImageResolution"
	filterArgs(3).Value = 300
	
	dim cmdArgs(2) as New com.sun.star.beans.PropertyValue
	cmdArgs(0).Name = "URL"
	cmdArgs(0).Value = FilePath & "V1.pdf"
	cmdArgs(1).Name = "FilterName"
	cmdArgs(1).Value = "writer_pdf_Export"
	cmdArgs(2).Name = "FilterData"
	cmdArgs(2).Value = filterArgs()
	'ThisComponent.storeToURL(FilePath & "V1.pdf", cmdArgs())
	dispatcher.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:ExportDirectToPDF", "", 0, cmdArgs())
	
	' low quality settings for screen
	filterArgs(0).Value = False
	filterArgs(1).Value = 10
	filterArgs(2).Value = True
	filterArgs(3).Value = 75
	cmdArgs(0).Value = FilePath & "V2.pdf"
	cmdArgs(2).Value = filterArgs()
	'ThisComponent.storeToURL(FilePath & "V2.pdf", cmdArgs())
	dispatcher.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:ExportDirectToPDF", "", 0, cmdArgs())
End Sub

Besten Dank für eure Bemühungen, ms777 und Wanderer! :+1:

P.S.: Ich verwende den Dispatcher wegen dem impliziten Fortschrittsbalken, der Code läuft auch bei einem direkten Aufruf von storeToURL() - nur der Dateiname wird anders übergeben.