[gelöst] Serienbriefe als pdf speichern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

traveling.hannes
Beiträge: 5
Registriert: Fr, 10.01.2020 19:45

[gelöst] Serienbriefe als pdf speichern

Beitrag von traveling.hannes »

Hallo,
ich könnte etwas Hilfe bei folgendem Problem brauchen:
Ich möchte aus einem Makro einen Serienbrief starten und die Dokumente einzeln als pdf-Dateien speichern.
Mit Hilfe des Handbuchs habe ich folgendes Makro geschrieben

Code: Alles auswählen

SUB Serienbriefdruck
	DIM oMailMerge AS OBJECT
	DIM aProps() as new com.sun.star.beans.PropertyValue
	
	'aProps(0).Name = "URL"
	'aProps(0).Value = url_pdf_out
	'aProps(1).Name = "FilterName"
	'aProps(1).Value = "writer_pdf_Export"
	oMailMerge = createunoservice("com.sun.star.text.MailMerge")
	oMailMerge.DataSourceName = "Yogakurse" ' Datenquelle
	oMailMerge.DocumentURL = ConvertToUrl("D:/Datenbank/Praevention/Praeventionsbescheinigung.odt") 'Serienbriefdokument
	oMailMerge.CommandType = 0 '0=Tabelle, 1=Abfrage, 3=SQL
	oMailMerge.Command = "Praeventionsbescheinigungen" 'Name der Tabelle, Abfrage oder SQL-Commando
	'oMailMerge.Filter = """Geschlecht""='m'" 'Filter
	oMailMerge.OutputType = 2 'Ausgabetypen Drucker (1), Datei (2) und Mail (3)
	oMailMerge.OutputUrl = ConvertToUrl("D:/Datenbank/Praevention") ' Speicherort
	oMailMerge.FileNameFromColumn = True 'Dateiname aus Tabelleneintrag
	oMailMerge.Filenameprefix = "Dateiname" 'Feld für Dateinamen
	oMailMerge.execute(aProps())
END SUB
Mit den Auskommentierungen wie oben wird der Serienbrief erstellt und in einzelnen Writer Dateien gespeichert.
Das ist ja schon mal ein Teilerfolg.
Mit den vier auskommentierten Zeilen hatte ich gehofft die Dateien als pdf zu bekommen.
Leider bekomme ich aber folgende Fehlermeldung:
"Unzulässiger Wert oder Datentyp. Index außerhalb des definierten Bereichs."
Mit der Markierung der ersten auskommentierten Zeile.
Wenn ich nur aProps(0) auskommentiere, kommt die Fehlermeldung entsprechend für "FilterName"

Für (Nach)Hilfe bin ich dankbar!

Mit herzlichen Grüßen,
Hannes
Zuletzt geändert von traveling.hannes am Di, 02.05.2023 11:44, insgesamt 1-mal geändert.
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Serienbriefe als pdf speichern

Beitrag von mikeleb »

Hallo,
meines Wissens geht da so nicht.
Die Erstellung der Serienbriefe erfolgt, wenn als Datei, dann stets als Writer-Dokument.
Du könntest probieren, Sie an eine pdf-Drucker zu senden oder zunächst die Writer-Dokumente erstellen und sie dann als pdf exportieren.
Gruß,
mikeleb
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Serienbriefe als pdf speichern

Beitrag von F3K Total »

Moin,
mit dem XMailmergeListener kann man während der Serienbriefprozess läuft, auf die Dokumente (event) zugreifen.
Die Dokumente kann man den als .Pdf exportieren.
https://www.openoffice.org/api/docs/com ... tener.html

Gruß R
traveling.hannes
Beiträge: 5
Registriert: Fr, 10.01.2020 19:45

Re: Serienbriefe als pdf speichern

Beitrag von traveling.hannes »

Hallo Mikeleb und R,
vielen Dank für Eure Hilfe!
Ich wollte den Vorschlag einen Drucker zu verwenden der pdf-Datein generiert ausprobieren.
Die Durchsicht der MailMerge Properties aus dem Link hat mich auf .SaveFilter aufmerksam gemacht.
Wenn dort der Wert auf "writer_pdf_Export" gesetzt wird, werden pdf-Dateien erzeugt!

Code: Alles auswählen

SUB Serienbriefdruck
	DIM oMailMerge AS OBJECT
	DIM aProps() as new com.sun.star.beans.PropertyValue
	
	oMailMerge = createunoservice("com.sun.star.text.MailMerge")
	oMailMerge.DataSourceName = "Yogakurse" ' Datenquelle
	oMailMerge.DocumentURL = ConvertToUrl("D:/Datenbank/Praevention/Praeventionsbescheinigung.odt") 'Serienbriefdokument
	oMailMerge.CommandType = 0 '0=Tabelle, 1=Abfrage, 3=SQL
	oMailMerge.Command = "Praeventionsbescheinigungen" 'Name der Tabelle, Abfrage oder SQL-Commando
	oMailMerge.OutputType = 2 'Ausgabetypen Drucker (1), Datei (2) und Mail (3)
	oMailMerge.SaveFilter = "writer_pdf_Export"
	oMailMerge.OutputUrl = ConvertToUrl("D:/Datenbank/Praevention") ' Speicherort
	oMailMerge.FileNameFromColumn = True 'Dateiname aus Tabelleneintrag
	oMailMerge.Filenameprefix = "Dateiname" 'Feld für Dateinamen
	oMailMerge.execute(aProps())
END SUB
Bei dem herumprobieren mit den Properties (PrintOptions, SaveFilter) habe ich mir die Frage gestellt,
ob es irgendwo eine Referenzliste mit den möglichen Werten für die einzelnen Properties gibt. Für OutputType oder CommandType
stand das netterweise immer als Kommentar in den Beispielen. Für so einen Hinweis wäre ich dankbar!

Der Hinweis auf den XMailMergeListener und die Zugriffsmöglichkeit auf die Dokumente im Serienbriefprozess hört sich sehr spannend an.
Aber ich fürchte, dass übersteigt meine Fähigkeiten. Wenn es dazu Beispiele gibt, würde ich mich auch über einen Hinweis freuen!

Also nochmal herzlichen Dank,
Hannes
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Serienbriefe als pdf speichern

Beitrag von F3K Total »

Moin,
hier dein Code, abgewandelt mit Zugriff auf die Dokumente im Serienbriefprozess:

Code: Alles auswählen

SUB Serienbriefdruck
	DIM oMailMerge AS OBJECT
	DIM aProps() as new com.sun.star.beans.PropertyValue
	oListener = CreateUnoListener("oMailMergeListener_", "com.sun.star.text.XMailMergeListener")'Listener erzeugen
	oMailMerge = createunoservice("com.sun.star.text.MailMerge")
	oMailMerge.DataSourceName = "Yogakurse" ' Datenquelle
	oMailMerge.DocumentURL = ConvertToUrl("D:/Datenbank/Praevention/Praeventionsbescheinigung.odt") 'Serienbriefdokument
	oMailMerge.CommandType = 0 '0=Tabelle, 1=Abfrage, 3=SQL
	oMailMerge.Command = "Praeventionsbescheinigungen" 'Name der Tabelle, Abfrage oder SQL-Commando
	oMailMerge.OutputType = 2 'Ausgabetypen Drucker (1), Datei (2) und Mail (3)
	oMailMerge.SaveFilter = "writer_pdf_Export"
	oMailMerge.OutputUrl = ConvertToUrl("D:/Datenbank/Praevention") ' Speicherort
	oMailMerge.FileNameFromColumn = True 'Dateiname aus Tabelleneintrag
	oMailMerge.Filenameprefix = "Dateiname" 'Feld für Dateinamen
	oMailMerge.addMailMergeEventListener (oListener) 'Listener hinzufügen
	oMailMerge.execute(aProps())
	oMailMerge.removeMailMergeEventListener(oListener) 'Listener wieder entfernen
END SUB

Sub oMailMergeListener_notifyMailMergeEvent (oEvent as object)'as new com.sun.star.text.XMailMergeListener)
	xray oEvent.Model' Zugriff auf die aktuelle Datei, kann man hier verändern, muss nicht gespeichert werden.
End Sub

Sub oMailMergeListener_disposing()
End Sub
Auf diese Weise kann man z.B. variable Bilder in den Serienbrief einbauen
Gruß R
traveling.hannes
Beiträge: 5
Registriert: Fr, 10.01.2020 19:45

Re: Serienbriefe als pdf speichern

Beitrag von traveling.hannes »

Super!
Vielen Dank!
Ich setze das Thema auf gelöst.
Antworten