CIB pdf toolbox technischer Leitfaden (DE)

15. Briefpapierfunktion, Overlay von Texten, Grafiken und Barcodes

15.3. Implementierungshinweise

Im Folgenden wird auf Besonderheiten bei der Implementierung hingewiesen.

Briefpapierfunktion
Overlayfunktion

Briefpapierfunktion

Allgemeiner Ablauf:

  • Der String der Property BackgroundFilename wird geparst. Für jede angegebene Seite wird ein PropertyInfo-Objekt erzeugt und einem PointerArray hinzugefügt. Jede PropertyInfo enthält folgende Informationen:
    • Ein Array mit PageSettings. Dieses enthält die Informationen, hinter welche Seite die Seite des Briefpapiers kommt. Der Index in diesem Array entspricht der Seite Hauptdokuments. Steht hier eine -1 drin, bedeutet das, dass die Seite nicht hinter die entsprechende Seite des Hauptdokuments kommt. Alle anderen Angaben bedeuten, dass sie dahinter kommt.
    • Einen Index (sagt aus um die wievielte Seite des Briefpapier-Dokuments es sich handelt)
    • Einen Filename (zugehörige Briefpapier-Datei)
  • Das Parsen läuft folgendermaßen ab:
    • Die durch geschweifte Klammern getrennten Angaben (wenn es mehrere sind) werden zerlegt (Trenner= „}{„)
    • Positionsdaten werden ausgelesen und abgelegt
    • Die Seitenangaben (die optional in geschweiften Klammern stehen), die durch „;“ getrennt mehrere Seiten des Briefpapiers angeben können, werden aufgesplittet.
    • Der Dateiname wird ermittelt
    • Die Seitenangaben werden verwendet um das Array der PageSettings zu belegen.
    • Die Angaben innerhalb einer geschweiften Klammer sind durch Prios geregelt.
    • In die einzelnen PageSettings der InfoObjekte werden zunächst je nach Prio die Zahlen 0,1,2 eingetragen (-1 default)
    • Sind die Arrays der InfoObjekte einer Klammer belegt, müssen diese noch miteinander abgeglichen werden. Höhere Prios überschreiben die niedrigeren, so dass immer wenn in 2 PageSetting-Arrays die gleiche Position belegt ist, die höhere Zahl gewinnt und die Position der niedrigeren mit -1 belegt wird.
  • Es wird zunächst ein normaler PdfJoin mit den Eingabedateien durchgeführt, anschließend werden die Backgrounddateien abgearbeitet. Hier werden die gleichen Prozeduren durchlaufen, wie beim normalen Join, nur dass anstelle der Methode, die einen neuen PageTree aufbaut, eine Methode aufgerufen wird, die die Inhalte mischt.
  • In dieser Methode werden die Property-Infos durchlaufen und überprüft, ob aufgrund der Pagesettings die Seite hinterlegt werden soll oder nicht.
  • Wurde die richtige BackgroundPage gefunden, wird ein neues Xobject aus der Hintergrundseite erzeugt:
    • Über GetContentstreamAsString() wird der Inhalt der Seite geholt und ein neues Dictionary erzeugt.
    • Daraus wird ein neuer Stream erzeugt und als neues Objekt in das Hauptdokument eingefügt.
    • Dieses Objekt wird zu einem Form Xobject verwandelt, indem in dessen Dictionary die entsprechenden Einträge gesetzt werden:
      • Type /XObject
      • Subtype /Form
      • BBox entspricht der MediaBox der Seite
      • Name muss ein Name sein, der das Objekt eindeutig innerhalb der Seite identifiziert, deshalb muss überprüft werden, ob der Name bereits vorhanden ist und evtl ein anderer vergeben werden
      • Das Resources-Dictionary entspricht dem der Hintergrundseite
  • Nun muss noch ein neues ContentStream-Objekt erzeugt werden, das auf das neues XObject referenziert und dem Dokument hinzugefügt werden: q XObjectName Do Q
  • Die Referenz auf dieses Objekt wird dann noch in das ContentArray der Hauptseite hinzugefügt (vorne dran, damit es im Hintergrund ist)
  • Die Xobjects werden in einem Array verwaltet, damit für jede Hintergrundseite nur eines erzeugt wird, und wenn es wieder gebraucht wird, aus dem Array geholt werden kann.
  • Die Annotations der beiden Seiten werden gemischt, indem die Referenzen auf Annotations der Hintergrundseite dem Annotations-Array der Hauptseite hinzugefügt. Werden. Evtl. /P – Einträge werden entfernt.

Auch die AcroForms der zweiten Seite müssen zur ersten hinzu gemischt werden.


Overlayfunktion

Allgemeiner Ablauf:

  • Der Inhalt der Property Overlay wird geparst. Bei fehlenden Positionsangaben werden die Default-Werte verwendet. Auch hier wird der gleiche Parser verwendet und PropertyInfo Objekte erzeugt.
  • Diese Objekte enthalten Angaben zu Position, Breite/Höhe (Grafik), Dateiname (bzw. Text)
  • Die erzeugten Informationen werden in einem Array von verwaltet. Nach dem Join wird das Hauptdokument mit den entsprechenden Overlay-Informationen gemischt.
  • Hier wird für jede Seite des Hauptdokuments das PropertyInfo-Array nach Elementen durchsucht, deren PageSettings mit der aktuellen Seite vereinbar ist. Ist ein solches gefunden, muss entweder die entsprechende Grafik, oder der entsprechende Text in das Hauptdokument eingefügt werden.
  • Für jede passende Angabe muss im Falle eines Textes wie folgt vorgegangen werden:
    • Man holt sich über GetContentstreamAsString() den Inhalt der Seite, je nachdem, ob der Text vor oder hinter den Inhalt der Seite soll, muss ein neuer Contentstream aufgebaut werden, in dem der neue Teil entweder vor oder hinter den alten Teil gesetzt wird:
      • q <alter contentstream> Q q <contentstream für einzufügenden text> Q“
    • Der ContentStream für den einzufügenden Text muss wie folgt aussehen:

BT

/F13 12 Tf

288 720 Td

(ABC) Tj

ET

 

    • BT kennzeichnet den Beginn, ET das Ende.
    • /F13 ist der Name des Fonts der verwendet werden soll
    • 12 die Schriftgröße
    • 288 720 sind die Positionsdaten
    • ABC der einzufügende Text
  • Hier wird also auf einen Font mit Namen F13 verwiesen. Dieser muss im Resources-Dictionary der Seite referenziert werden:

/Resources

<< /Font << /F13 23 0 R >>

             >> 

23 0 obj

<< /Type /Font

/Subtype /Type1

/BaseFont /Helvetica

>> 

endobj

    • Daraus ergibt sich, dass für jeden Font, der in der Property Overlay angegeben wird, ein Font-Objekt wie oben beschrieben erzeugt werden muss.
    • Auch hier muss darauf geachtet werden, dass die Namen innerhalb der Seite eindeutig sind.
  • Ausführungen für Grafiken und Barcodes werden in Zukunft ergänzt.