Macro: A5 doppeln und auf A4 drucken

Hallo alle zusammen,

für Arbeitsblätter in der Schule benötige ich ein Macro, welches eine A5 Seite verdoppelt und dann nebeneinander auf einer A4-Seite ausdruckt bzw. in eine Datei schreibt.

Von Hand geht das wunderbar:

Im Druckdialog gibt man unter den zu druckenden Seiten “1,1” an, beim
Seitenlayout stellt man “2 Seiten pro Blatt” ein und unter Optionen klickt
man “Nur die Papiergröße der Druckereinstellungen verwenden” an.

Wenn man unter Optionen auch noch “Drucken in Datei” anklickt,
wird eine entsprechende PDF-Datei erzeugt.

Nun habe ich mit dem Macro-Recorder und bescheidenen Programmierkenntnissen erfolglos versucht, ein entsprechendes Macro zu schreiben.

In wiki.openoffice.org/…/Printing_Text_Documents sind letztlich alle notwendigen Aspekte aufgeführt, insbesondere mit Blick auf den letzten Satz und den darin enthaltenen “Filename” und “Pages”.

The method printPages() prints the document according to the previous settings. The argument for the
printPages() method may contain the PrintOptions as described in the section above (containing the
properties CopyCount, FileName, Collate and Pages).

Intensive Recherche im Netz hat mich auch nicht weitergebracht, ein Beispiel zu nup-Druck habe ich gefunden, dies funktioniert aber nicht. Die Seiten werden einzeln ausgedruckt:

Sub PrintTwoPerPage
  Dim Props(0 To 1) As New com.sun.star.beans.PropertyValue
  Props(0).Name = "PageColumns" : Props(0).Value = 2
  Props(1).Name = "IsLandscape" : Props(1).Value = True
  If HasUnoInterfaces(ThisComponent, "com.sun.star.text.XPagePrintable") Then
    ThisComponent.setPagePrintSettings(Props())  '
    ThisComponent.printPages(Array())            'Use default properties
  Else
    Print "Sorry, this document does not support the XPagePrintable interface"
  End If
End Sub

Für Hinweise wäre ich sehr dankbar.

Gruß

Tobias

Also, klappt das wirklch wie unter “Von Hand geht das wuderbar” beschrieben. Ich kann immer nur mehrere Seiten des selben Drucks eines Dokuments auf ein Blatt drucken, nicht mehrere Ausdrucke.der jeweils selben Seite von mehreren Drucken. Wie geht das?

Hallo Lupp, wenn man im Druckdialog bei “Bereich und Kopien” unter “Seiten” die folgende Angabe einträgt “1,1” druckt libreoffice bei mir die Seite 1 in zweifacher Ausfertigung hintereinander.

Hi Tobias, mit Macros habe ich keine Erfahrung. Aber, warum “umständlich”, wenn es einfach geht.
Wähle im Menü Format>Seite>Seite Format: “A4”, “Querformat”, Ränder z.B. “2 cm”.

im Tab Spalten 2 Spalten wählen. Bei “Breite und Abstand” den Abstand auf “4 cm” setzen, OK klicken.

Die fertige Seite sieht dann so aus:

Du kannst es dann ganz normal als A4-Seite drucken.

Wenn Du das ganze mehr layoutmäßig bearbeiten möchtest würde ich eine A4-Seite quer in Draw aufsetzen.

Ja, das geht natürlich und habe ich auch schon häufig gemacht. Das Problem ist nur, dass man bei Veränderungen immer wieder die Seite kopieren muss und dann z.B. bei Nummerierungen Fehler auftreten können. Auch wenn man Arbeitsblätter in A5-quer entwickelt – was aus diversen Gründen eher der Regelfall ist --, wird es (z.B. mit einer 1x2-Tabelle) auch fehleranfällig.

Eleganter und ohne solche Hilfskonstrukte wäre eben der von mir beschriebene Weg; mit einem Makro wäre auch sehr einfach.

Wenn ich mich mit einer solchen Aufgabenstellung beschäftige, dann kommen für mich zwei Lösungen dieser Art in Frage:

  • 2 Etiketten (auf 1 A4-Seite), die sich synchronisieren lassen (Schaltfläche; wenn dir der Etikettenassistent geläufig ist, dann ist das alles ein geringer Aufwand; du kannst natürlich auch mit Vorlagen arbeiten, die einmal erstellt, immer wieder benutzt werden können)
    oder
  • Erzeugung eines PDF-Dokuments, dann einfach das gleiche Dokument an das erste anhängen (z.B. mit pdfmod oder pdfSAM) und dann mit entsprechenden Vorgaben auf 1 Seite ausdrucken.

Ciao

Frames (Textrahmen) sind eine gute Lösung, und die Kopie vom ersten in den zweiten lässt sich ziemlich gut “makroisieren”. Es bleibt das Problem mit automatischen Nummerierungen, auf das der Fragesteller schon hingewiesen hat (Kommentar zur Antwort von @Hrbrgr ). Seine Texte haben offenbar eine Struktur, die über das bei Etiketten übliche hinausgeht - und er scheint zu wissen was er tut. Ich vermute, er hat auch schon an die pdf-Lösung gedacht. Ist halt etwas komplizierter.

Tatsächlich habe ich schon diverse Varianten durchprobiert (2x1 bzw. 1x2 Tabellen, Textspalten, A4 verdoppeln und dann 2-auf-1 drucken (per Office bzw. pdf-tool). Diese Lösungen funktionieren alle soweit ganz gut, sind aber doch “fehleranfällig” (copy&paste, Schriftgrößen, Nummerierungen).

Um das gewünschte Originaldokument in der korrekten Skalierung und ohne solche “Klimmzüge” zu bearbeiten, war ich letztlich auf die vorgestellte Form ausgewichen. Ein Macro wäre eine schöne Lösung.

"… die vorgestellte Form …" kann ich nicht nachvollziehen, wie früher schon bemerkt, und schon deshalb nicht per Makro automatisieren.
Eine automatische Kopie mit Textrahmen als Positionierungsmittel kann nummerierte Listen korrekt abbilden, wenn man dem ersten nummerierten Absatz das entsprechende Merkmal (en: ‘Restart Numbering’) verpasst hat. Bei nummerierten Beschriftungen von graphischen Shapes ist es komplizierter, und bei der Formelnummerierung bin ich ratlos.

Erklärung zu "die vorgestellte Form " siehe oben. Ich habe Ihre Vorlage ausprobiert, das ist eine gute Sache. Letztlich fände ich es aber doch hilfreicher, wenn ich tatsächlich eine echte A5-Seite bearbeiten könnte und “außerhalb” den NUP-Druck durchführen könnte.

===2. Bearbeitung 2018-09-09 11:00-die letzte===
Wie schon gesagt, ich kann nicht aufgeben.
Lade die beiden hier anhängenden Dateien ins gleiche -am besten leere- Verzeichnis, gib zumindest der Vorlage A4horiNoMarginTemplate.ott ihren korrekten Namen zurück, und öffne die Beispieldatei a5_v2.odt mit Makroerlaubnis. Der Makro mit dem längsten Namen macht dann das Gewünschte, wobei er auf die Vorlage zugreift. Da diese Vorlage im Makro mit Namen angesprochen ist, darf der von dieser Seite erzeugte Zufallsname nicht bleiben!
Das schließliche Drucken habe ich nicht implementiert. Es sollte kein Problem sein.
Aber natürlich(?) funktioniert das jetzt in AOO nicht mehr. Man könnte verrückt werden.
===2. Bearbeitung Ende==

Ich hatte ein Beispiel vorbereitet, das mit Textrahmen und einem"Makro" arbeitet. Ich habe es dann aber nicht veröffentlicht, weil die Bemerkung des OQ bezüglich Nummerierungen dazwischen kam. Außerdem gab es offenbar bugbedingte Rätsel bei der Ausführung des Makros. Den Versuch, ihn per Klick auf einen Knopf aufzurufen, musste ich ganz aufgeben.
Die Antwort von @Grantler hat mich nun bewogen, die Demo doch als Vorlage zur Verfügung zu stellen, wobei ich ausdrücklich feststellen muss, dass sie im Sinne des OQ wohl nicht ausreicht. Sollte jemand daraus doch ein Werkzeug für “die Produktion” machen, wird er den Usercode vielleicht in die lokale Library verlegen …
Das Nummerierungsproblem wird aber wohl verhindern, dass sich der Aufwand lohnt.

Hier der angekündigte Anhang.

===Bearbeitung 2018-09-05 16:18===
Achtung! Neue Demo arbeitet nur unter Apache OpenOffice korrekt!

Ic habe in solchen Dingen die unglückliche Eigenschaft, dass ich nicht aufgeben kann. Nachdem mir klar war, wie ich das Verfahren von Tobias anwenden konnte, musste ich auch den Weg finden, es zu automatisieren. Schließlich gibt es doch diese wunderbare API.
Ich habe recherchiert, unter LibO 6.1 “entwickelt” und getestet. Es vergingen letztlich Stunden, und ich habe endlich wieder reichlich teilbedrucktes Notizpapier.
Kurz bevor ich wegen etlichen völlig unbrauchbaren Fehlermeldungen doch aufgeben wollte, habe ich den erreichten Stand in die Beispieldatei gesichert, und das Ergebnis mit AOO 4.1.5 erprobt. Es lief damit reproduzierbar wie eigentlich erwartet. Dann habe ich noch etlich ältere Versionen von LibO probiert, aber immer Fehlergebnisse in einer bunten Auswahl von Varianten bekommen.
Schlussfolerung die Dokumentmethode (für Writer-Dokumente) myTextdocument.SetPagePrintSettings(propertiesArray) ist in LibreOffice kaputt.
Für diejenigen, die sich für solche Zeitverschwendungsspielchen interessieren, hänge ich die Demo an. Schließlich ist “der Makro” ja eigentlich korrekt. Soll ich jetzt noch eine Stunde damit verschenden, einen Bugreport einzureichen? Wer kann das besser?

Vielen Dank für diese große Mühe. So viel Aufwand und dann kommt ein Bug. Letztlich fällt mir nur noch folgende Idee ein: Die “Print-Verdoppelung” funktioniert ja, nur eben der NUP-Druck nicht. Wenn man nun die A5-Seite verdoppelt und automatisch in eine Datei schreibt (Druckdialog, Optionen, Drucken in Datei), könnte man diese mit einem PDF-Viewer per NUP-Druck ausdrucken. So hätte man eine Original-Bearbeitungsdatei und eben eine passende Druck-Datei.

Unter Linux funktioniert ein

"job(2).Name = “FileName” : job(2).Value = “/tmp/test.pdf”

auch mit “file://tmp/test.pdf” bzw. “file:///tmp/test.pdf” nicht.

Ja. So ähnlich ist es jedenfalls auch nicht kompilizierter. Man wird am besten mit dem ExportFilter “writer_pdf_Export” und doc.StoreDocumentAs(…) (interim) arbeiten.
Dann neues .odt ereugen (A4 quer, interim), frisches .pdf importieren (Das geht als Bild durch.), platzieren, kopieren, einfügen, wieder platzieren, drucken, Interim-Dateien löschen. So einfach ist das.
Naja, dieser Thread hat längst die Suche nach einer Lösung überschritten, und ist zum Sport geworden. Ich mache Pause.

Aber (Zitat:) “Wenn man nun die A5-Seite verdoppelt …”
Wie soll denn das gehen? So ähnlich war mein urprünglicher Ansatz mit den Frames, und es gab die Nummerierungsprobleme.

Ich habe jetzt eine weitere Stunde damit verschwendet, es mit dem Filter “writer_pdf_Export” zu versuchen. Der hat formal einen Parameter namens “FilterData” und darin sind (bis zu?) 53 Parameter in Form von kleinen Arrays gepackt. Ein direkter Export, den ich mit dem Rekorder aufgezeichnet habe, hat die Auswahl von nur der 1. Seite akzeptiert. Weder der aufgezeichnete Mkro, noch die entsprechend “sauber” programmierte Routine haben die entsprechende Setzung ausgewertet. Bug.

Natürlich kann man jetzt die “Zusicherung” geben, nie ein mehr als einseitiges Dokument in den Prozess zu schicken. Aber was ist denn das für eine Dokumentautomation?
Mittlerweile gibt es hundert oder mehr Filter. “writer_pdf_Export” ist bestimmt einer der meistbenutzten. Welche sind wohl austrechend geprüft und getestet?

Schließlich:
Das Format, in das der Rekorder die FilterData packt, und das ich auch als Muster benutzt habe, ist Schrott. Es kann vom (für den) Filter nicht ausgewertet werden, ob er nun vom aufgezeichneten oder von frei geschriebenem Code benutzt wird. Siehe [Gelöst] PDF-Export eines Textbereiches - OpenOffice.info. (Naja, das war erst vor 6 Jahren). Alle Optionen in ein gewöhnliches Array von Properties gepackt, dann funktioniert der Filter. Für SetPagePrintSettings hilft das nichts.

Ja eine Riesenaufwand! Und ich dachte, wenn man meinen Wunsch so “einfach” über den Druck-Dialog einstellen kann, dann wird man das doch auch in endlicher Zeit als Makro programmieren können. Weit gefehlt! Dieser Bug-gepflasterte Weg scheint jedenfalls zu einem Ende zu kommen. Es sollte ja eine Vereinfachung werden und keine hochkomplexe Stolperfalle. Von einer Vereinfachung ist es jedoch weit entfernt.

@Lupp: Jedenfalls vielen Dank für den Einsatz!