PDFlib Manual D
PDFlib Manual D
PDFlib Manual D
www.pdflib.com
Referenzhandbuch
®
PDFlib GmbH
Tal 40, 80331 München, Deutschland
www.pdflib.com
Tel. +49 • 89 • 29 16 46 87
Fax +49 • 89 • 29 16 46 86
Bei Fragen können Sie die PDFlib-Mailing-Liste abonnieren und sich deren Archiv ansehen unter:
groups.yahoo.com/group/pdflib.
Vertriebsinformationen: sales@pdflib.com
Support für Inhaber einer kommerziellen PDFlib-Lizenz: support@pdflib.com (geben Sie bitte immer Ihre
Lizenznummer an)
Der Inhalt dieser Dokumentation wurde mit größter Sorgfalt zusammengestellt. PDFlib GmbH gibt jedoch
keine Gewähr oder Garantie hinsichtlich der Richtigkeit oder Genauigkeit der Angaben in dieser Dokumen-
tation und übernimmt keinerlei juristische Verantwortung oder Haftung für Schäden, die durch Fehler in
dieser Dokumentation entstehen. Alle Warenbezeichnungen werden ohne Gewährleistung der freien Ver-
wendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen.
PDFlib und das PDFlib-Logo sind eingetragene Warenzeichen der PDFlib GmbH. PDFlib-Lizenznehmer sind
dazu berechtigt, den Namen PDFlib und das PDFlib-Logo in ihrer Produktdokumentation zu verwenden.
Dies ist jedoch nicht zwingend erforderlich.
Adobe, Acrobat und PostScript sind Warenzeichen von Adobe Systems Inc. AIX, IBM, OS/390, WebSphere,
iSeries und zSeries sind Warenzeichen von International Business Machines Corporation. ActiveX,
Microsoft, OpenType und Windows sind Warenzeichen von Microsoft Corporation. Apple, Macintosh und
TrueType sind Warenzeichen von Apple Computer, Inc. Unicode und das Unicode-Logo sind Warenzeichen
von Unicode, Inc. Unix ist ein Warenzeichen von The Open Group. Java und Solaris sind Warenzeichen von
Sun Microsystems, Inc. HKS ist eine eingetragene Marke des HKS Warenzeichenverbands e.V.: Hostmann-
Steinberg, K+E, Schmincke. Die Namen von anderen Produkten und Diensten können Warenzeichen von
Unternehmen oder Organisationen sein, die hier nicht angeführt sind.
Die in der Software oder Benutzerdokumentation angezeigten PANTONE®-Farben stimmen nicht unbe-
dingt mit den PANTONE-Standards überein. Die genaue Farbe können Sie in den PANTONE-Farbtafeln
nachschlagen. PANTONE® und andere Warenzeichen von Pantone, Inc. sind Eigentum von Pantone, Inc. ©
Pantone, Inc., 2003.
Pantone, Inc. ist Copyright-Inhaber der Farbdaten und/oder Software, die von PDFlib GmbH ausschließlich
zur Weitergabe und zum Gebrauch mit der PDFlib-Software lizenziert wurde. Die PANTONE-Farbdaten
und/oder -Software dürfen nur zur Ausführung der PDFlib-Software auf eine Festplatte oder in den Spei-
cher kopiert werden.
PDFlib enthält modifizierte Bestandteile folgender Software anderer Hersteller:
ICClib, Copyright © 1997-2002 Graeme W. Gill
PNG Image Reference Library (libpng), Copyright © 1998, 1999, 2000 Glenn Randers-Pehrson
Zlib Compression Library, Copyright © 1995-1998 Jean-loup Gailly und Mark Adler
TIFFlib Image Library, Copyright © 1988-1997 Sam Leffler, Copyright © 1991-1997 Silicon Graphics, Inc.
Kryptografische Software von Eric Young, Copyright © 1995-1998 Eric Young (eay@cryptsoft.com)
JPEG-Software der Indenpendent JPEG Group, Copyright © 1991-1998, Thomas G. Lane
1 Einführung 13
1.1 Programmierung mit PDFlib 13
1.2 Die wichtigsten neuen Funktionen von PDFlib 6 15
1.3 Funktionalität von PDFlib 17
1.4 Verfügbarkeit der Funktionen in den Produkten 19
Inhaltsverzeichnis 3
2.9.3 Fehlerbehandlung in PHP 40
2.10 Python-Sprachbindung 41
2.10.1 Installation der Python-Edition von PDFlib 41
2.10.2 Das Beispiel »Hello world« in Python 41
2.10.3 Fehlerbehandlung in Python 41
2.11 REALbasic-Sprachbindung 42
2.12 RPG-Sprachbindung 42
2.12.1 Kompilieren und Binden von RPG-Programmen für PDFlib 42
2.12.2 Das Beispiel »Hello world« in RPG 43
2.12.3 Fehlerbehandlung in RPG 44
2.13 Ruby-Sprachbindung 46
2.13.1 Installation der Ruby-Edition von PDFlib 46
2.13.2 Das Beispiel »Hello world« in Ruby 46
2.13.3 Fehlerbehandlung in Ruby 47
2.13.4 Ruby on Rails 47
2.14 Tcl-Sprachbindung 48
2.14.1 Installation der PDFlib-Tcl-Edition 48
2.14.2 Das Beispiel »Hello world« in Tcl 48
2.14.3 Fehlerbehandlung in Tcl 49
3 PDFlib-Programmierung 51
3.1 Allgemeine Aspekte 51
3.1.1 PDFlib-Programmstruktur und Geltungsbereich von Funktionen 51
3.1.2 Parameter 51
3.1.3 Behandlung von Ausnahmen (Exceptions) 52
3.1.4 Das PDFlib Virtual File System (PVF) 55
3.1.5 Ressourcenkonfiguration und Dateisuche 56
3.1.6 Erzeugen von PDF-Dokumenten im Arbeitsspeicher 59
3.1.7 Einsatz von PDFlib auf EBCDIC-Systemen 60
3.1.8 Unterstützung für große Dateien 61
3.2 Seitenbeschreibungen 62
3.2.1 Koordinatensysteme 62
3.2.2 Höchstwerte für Seiten und Koordinaten 64
3.2.3 Pfade 66
3.2.4 Templates 67
3.3 Farbe 69
3.3.1 Farben und Farbräume 69
3.3.2 Füllmuster und Farbverläufe 69
3.3.3 Schmuckfarben 70
3.3.4 Colormanagement und ICC-Profile 73
3.4 Hypertext-Elemente 77
3.4.1 Beispiele zur Erstellung von Hypertext-Elementen 77
3.4.2 Formatierungsoptionen für Textfelder 80
4 Inhaltsverzeichnis
4 Textausgabe 83
4.1 Übersicht über Schriften und Zeichensätze 83
4.1.1 Unterstützte Fontformate 83
4.1.2 Zeichensätze 84
4.1.3 Unicode-Unterstützung 85
4.2 Fontformate im Detail 87
4.2.1 Unterstützung von Systemschriften auf Windows und Mac 87
4.2.2 PostScript-Fonts 88
4.2.3 TrueType- und OpenType-Fonts 89
4.2.4 Benutzerdefinierte Schriften (Type-3-Fonts) 91
4.3 Schrifteinbettung und Schriftuntergruppen 93
4.3.1 Wie PDFlib nach Fonts sucht 93
4.3.2 Schrifteinbettung 94
4.3.3 Bildung von Fontuntergruppen (Subsetting) 96
4.4 Zeichensätze 98
4.4.1 8-Bit-Zeichensätze 98
4.4.2 Symbolschriften und fontspezifische Zeichensätze 102
4.4.3 Glyph-ID-Adressierung für TrueType- und OpenType-Fonts 103
4.4.4 Das Eurozeichen 103
4.5 Unicode-Unterstützung 105
4.5.1 Unicode für Seitenbeschreibungen und Hypertext 105
4.5.2 Content-Strings, Hypertext-Strings und Name-Strings 106
4.5.3 Stringbehandlung in Unicode-fähigen Sprachen 107
4.5.4 String-Behandlung in nicht Unicode-fähigen Sprachen 108
4.5.5 Character-Referenzen 111
4.5.6 Unicode-kompatible Fonts 113
4.6 Textmetrik und Textvarianten 115
4.6.1 Font- und Zeichenmetriken 115
4.6.2 Kerning 116
4.6.3 Textvarianten 117
4.7 Chinesischer, japanischer und koreanischer Text 120
4.7.1 CJK-Unterstützung in Acrobat und PDF 120
4.7.2 Standard-CJK-Fonts und -CMaps 120
4.7.3 Benutzerspezifische CJK-Fonts 124
4.8 Platzieren und Einpassen von einzeiligem Text 128
4.8.1 Einfaches Platzieren von Text 128
4.8.2 Platzieren von Text in einer Box 129
4.8.3 Ausrichten von Text 130
4.9 Mehrzeilige Textflüsse 131
4.9.1 Platzierung eines Textflusses in der Fitbox 132
4.9.2 Optionen für die Absatzformatierung 133
4.9.3 Inline-Optionen und Makros 134
4.9.4 Tabulatoren 137
4.9.5 Nummerierte Listen 137
4.9.6 Steuerzeichen, Zeichenersetzung und Symbolfonts 139
Inhaltsverzeichnis 5
4.9.7 Trennung 141
4.9.8 Steuerung des Algorithmus für den Zeilenumbruch 142
4.9.9 Formatierung von CJK-Text in Textflüssen 145
6 Inhaltsverzeichnis
7 Erstellung verschiedener PDF-Varianten 195
7.1 Acrobat und PDF-Versionen 195
7.2 Verschlüsseltes PDF 197
7.2.1 Stärken und Schwächen der Sicherheitsfunktionen von PDF 197
7.2.2 Schützen von Dokumenten mit PDFlib 198
7.3 Web-Optimiertes (Linearisiertes) PDF 200
7.4 PDF/X 201
7.4.1 PDF/X-Standards 201
7.4.2 Erzeugung PDF/X-kompatibler Ausgabe 202
7.4.3 Import von PDF/X-Dokumenten mit PDI 205
7.5 Tagged PDF 207
7.5.1 Erzeugung von Tagged PDF mit PDFlib 207
7.5.2 Erzeugung von Tagged-PDF-Textausgabe und -Textflüssen 209
7.5.3 Aktivierung von Elementen für komplexe Layouts 210
7.5.4 Verwendung von Tagged PDF in Acrobat 213
Inhaltsverzeichnis 7
8.6 Rasterbild- und Template-Funktionen 294
8.6.1 Rasterbilder 295
8.6.2 Templates 299
8.6.3 Piktogramme (Thumbnails) 302
8.7 Funktionen für den PDF-Import (PDI) 304
8.7.1 Dokument und Seite 304
8.7.2 Weitere Funktionen zur PDI-Verarbeitung 309
8.7.3 Parameterbehandlung 309
8.8 Blockfunktionen (PPS) 313
8.9 Hypertext-Funktionen 317
8.9.1 Aktionen 317
8.9.2 Benannte Ziele 321
8.9.3 Anmerkungen 323
8.9.4 Formularfelder 327
8.9.5 Lesezeichen 332
8.9.6 Dokumentinfofelder 334
8.9.7 Veraltete Hypertext-Parameter und Funktionen 335
8.10 Strukturfunktionen für Tagged PDF 338
A Literaturhinweise 341
B PDFlib-Kurzreferenz 343
Index 349
8 Inhaltsverzeichnis
0 Anwendung des PDFlib-
Lizenzschlüssels
Alle Binärversionen von PDFlib, PDFlib+PDI und PPS, die von PDFlib GmbH angeboten
werden, sind als Evaluierungsversionen in vollem Funktionsumfang verwendbar, unab-
hängig davon, ob Sie eine kommerzielle Lizenz erworben haben oder nicht. Bei nicht li-
zenzierten Versionen wird jedoch quer über allen generierten Seiten der Demostempel
www.pdflib.com ausgegeben. Unternehmen, die an einer Lizenzierung von PDFlib inter-
essiert sind und den Demostempel in der Evaluierungsphase oder ersten Demos ver-
meiden möchten, können ihre Firmen- und Projektdaten mit einer kurzen Erläuterung
an sales@pdflib.com senden und einen temporären Lizenzschlüssel anfordern (wir be-
halten uns das Recht vor, einer Anforderung nicht nachzukommen, z.B. bei anonymen
Anfragen).
Nachdem Sie einen Lizenzschlüssel erworben haben, müssen Sie ihn anwenden,
damit der Demostempel auch tatsächlich unterdrückt wird. Sie können den Lizenz-
schlüssel zur Laufzeit mit einem PDFlib-Aufruf und einer vorbereiteten Lizenzdatei
oder (unter Windows) einem Registry-Schlüssel anwenden. Wenn Sie mit der Installati-
onsroutine von Windows arbeiten, können Sie bei der Produktinstallation einen (aber
nicht mehrere) Lizenzschlüssel eingeben.
Anwenden eines Lizenzschlüssels zur Laufzeit. Fügen Sie in Ihrem Skript oder Pro-
gramm eine Zeile ein, die den Lizenzschlüssel zur Laufzeit setzt. Der Parameter license
muss dabei unmittelbar nach der Instantiierung des PDFlib-Objekts gesetzt werden (das
heißt, nach PDF_new( ) oder einem entsprechenden Aufruf). Die Syntax hängt von der
jeweiligen Programmiersprache ab:
> In C und Python:
PDF_set_parameter(p, "license", "...Ihr Lizenzschlüssel...")
> In RPG:
d licensekey s 20
d licenseval s 50
c eval licenseopt='license'+x'00'
c eval licenseval='...Ihr Lizenzschlüssel...'+x'00'
c callp PDF_set_parameter(p:licenseopt:licenseval)
> In Tcl:
PDF_set_parameter $p, "license", "...Ihr Lizenzschlüssel..."
9
Verwendung einer Lizenzdatei. Tragen Sie den oder die Lizenzschlüssel folgenderma-
ßen in eine Textdatei ein (alle PDFlib-Distributionen enthalten dafür die Vorlage
licensekeys.txt):
PDFlib license file 1.0
# Lizenzinformation für Produkte der PDFlib GmbH
PDFlib 6.0.3 ...Ihr Lizenzschlüssel...
Sie können Lizenzschlüssel für verschiedene Produkte der PDFlib GmbH in die Li-
zenzdatei aufnehmen, wobei jeder Schlüssel in einer eigenen Zeile stehen muss. Im
nächsten Schritt müssen Sie die Lizenzdatei bei PDFlib bekannt machen. Dazu gibt es
zwei Möglichkeiten: Entweder setzen Sie den Parameter licensefile unmittelbar nach
der Instantiierung des PDFlib-Objekts (das heißt, nach PDF_new( ) oder einem ent-
sprechenden Aufruf) mit einem Funktionsaufruf ähnlich dem folgenden:
> In C und Python:
PDF_set_parameter(p, "licensefile", "/path/to/licensekeys.txt")
> In Tcl:
PDF_set_parameter $p, "licensefile", "/path/to/licensekeys.txt"
Alternativ dazu setzen Sie die Umgebungsvariable PDFLIBLICENSEFILE auf Ihre Lizenzda-
tei. Unter Windows bewerkstelligen Sie dies in der Systemsteuerung. Unter Unix ver-
wenden Sie in etwa folgenden Befehl:
export PDFLIBLICENSEFILE=/path/to/license/file
Windows-Registry. Unter Windows können Sie den Namen der Lizenzdatei auch in fol-
genden Registry-Schlüssel eintragen:
HKLM\Software\PDFlib\PDFLIBLICENSEFILE
Beachten Sie, dass es sich bei PDFlib, PDFlib+PDI und PDFlib Personalization Server (PPS)
um verschiedene Produkte handelt, die unterschiedliche Lizenzschlüssel erfordern,
selbst wenn sie in einer einzigen Bibliothek/Komponente ausgeliefert werden. Die Seri-
ennummer von PPS gilt auch für PDFlib+PDI sowie PDFlib, die von PDFlib+PDI gilt auch
für PDFlib, aber nicht umgekehrt. Alle Lizenzschlüssel sind plattformabhängig und kön-
nen nur auf der Plattform eingesetzt werden, für die sie erworben wurden.
Eintragen mehrerer CPU-Schlüssel. Wenn Sie mehrere CPU-Lizenzen nicht in einer ein-
zigen, sondern in verschiedenen Bestellungen erworben haben, können Sie sie sukzessi-
ve in die Lizenzdatei eintragen. Auch die Funktion PDF_set_parameter( ) kann bei mehre-
ren Lizenzschlüsseln mehrmals aufgerufen werden. Über die Windows-Registry oder die
Windows-Installationsroutine lassen sich die Lizenzschlüssel dagegen nicht sukzessive
eintragen.
11
1 Einführung
1.1 Programmierung mit PDFlib
Was ist PDFlib? PDFlib ist eine Bibliothek, mit der Sie Dateien im Portable Document
Format (PDF) von Adobe erstellen können. PDFlib fungiert als Backend für Ihre Pro-
gramme. Sie als Programmierer sind verantwortlich für die Verwaltung der zu verarbei-
tenden Daten, und PDFlib übernimmt die Generierung des PDF-Codes, der die Daten
grafisch darstellt. Die Formatierung und Anordnung der Text- und Grafikobjekte bleibt
dabei Ihre Aufgabe, Sie brauchen sich aber nicht um die Details des komplexen PDF-For-
mats zu kümmern.
> PDFlib bietet zahlreiche nützliche Funktionen zur Erstellung von Text, Vektorgrafik,
Rasterbildern und Hypertext-Elementen in PDF.
> PDFlib+PDI enthält neben allen PDFlib-Funktionen zusätzlich die PDF-Importbiblio-
thek PDI, mit der sich Seiten aus vorhandenen PDF-Dokumenten in die generierte
Ausgabe integrieren lassen.
> Der PDFlib Personalization Server (PPS) enthält neben PDFlib+PDI zusätzliche Funk-
tionen zum automatischen Füllen von PDFlib-Blöcken. Blöcke stellen Platzhalter auf
der Seite dar, die sich mit Text, Bildern oder PDF-Seiten füllen lassen. Sie können in-
teraktiv mit dem PDFlib-Block-Plugin für Adobe Acrobat (Mac oder Windows) er-
zeugt und automatisch mit PPS gefüllt werden. Das Plugin gehört zum Lieferumfang
von PPS.
Wie wird PDFlib eingesetzt? PDFlib ist auf verschiedensten Plattformen einsetzbar,
unter anderem auf Unix, Windows, Mac und EBCDIC-basierten Systemen wie IBM eSer-
ver iSeries und zSeries. PDFlib ist in der Programmiersprache C geschrieben, unterstützt
aber den Zugriff von verschiedensten anderen Programmiersprachen und -umgebun-
gen – den so genannten Sprachbindungen. Dazu gehören alle für eigenständige Appli-
kationen und Web-Anwendungen gängige Sprachen. Das Application Programming
Interface (API) ist einfach zu erlernen und für alle Sprachbindungen gleich. Derzeit wer-
den folgende Sprachbindungen unterstützt:
> COM für den Einsatz mit Visual Basic, Active Server Pages mit VBScript oder JScript,
Borland Delphi, Windows Script Host und anderen Umgebungen
> ANSI C
> ANSI C++
> Cobol (IBM eServer zSeries)
> Java inklusive Servlets
> .NET für den Einsatz mit C#, VB.NET, ASP.NET und anderen Umgebungen
> PHP
> Perl
> Python
> REALbasic
> RPG (IBM eServer iSeries)
> Ruby
> Tcl
Anforderungen an den Einsatz von PDFlib. Mit PDFlib können Sie PDF generieren,
ohne sich vorher durch die PDF-Spezifikation zu quälen. Der Einsatz von PDFlib setzt
zwar kein Wissen über die technischen Einzelheiten des PDF-Formats voraus, ein allge-
meines Verständnis von PDF kann jedoch nicht schaden. Für einen optimalen Einsatz
von PDFlib sollte der Anwendungsprogrammierer mit dem Grafikmodell vertraut sein,
das PostScript (und damit auch PDF) zugrunde liegt. Aber auch ein Anwendungspro-
grammierer, der bereits mit einem Grafik-API für Bildschirmanzeige oder Ausdruck ge-
arbeitet hat, sollte sich anhand des vorliegenden Handbuchs ohne große Probleme auf
das PDFlib-API umstellen können.
Über dieses Handbuch. Das vorliegende Handbuch beschreibt das API von PDFlib. Es
beschreibt nicht, wie die Binärdateien für die Bibliothek erzeugt werden. Funktionen,
die hier nicht erwähnt werden, werden nicht unterstützt und sollten auch nicht ver-
wendet werden. In diesem Handbuch werden keine Acrobat-Funktionen erklärt. Diesbe-
zügliche Informationen finden Sie in der Literatur zu Acrobat und in den Literaturhin-
weisen am Ende dieses Handbuchs. Die PDFlib-Distribution enthält weitere Beispiele
zum Aufruf von PDFlib-Funktionen.
14 Kapitel 1: Einführung
1.2 Die wichtigsten neuen Funktionen von PDFlib 6
Die folgende Liste gibt eine Übersicht über die wichtigsten neuen oder erweiterten
Funktionen von PDFlib 6.
Ebenen (Layer). Die in Acrobat 6 eingeführte Ebenenfunktion von PDF ist für CAD und
technische Anwendungen von Bedeutung, lässt sich aber auch für beeindruckende in-
teraktive Dokumente, mehrsprachige Dokumentation etc. nutzen. PDFlib unterstützt
alle in PDF 1.5 verfügbaren Ebenenfunktionen, auch solche, die in Acrobat nicht verfüg-
bar sind.
Tagged PDF. Tagged PDF bildet eine entscheidende Voraussetzung, um die Barriere-
freiheit (Accessibility) von PDF gemäß Section 508 in den USA und ähnlichen Gesetzen
in anderen Ländern zu gewährleisten. In Deutschland gibt es diesbezüglich die »Verord-
nung zur Schaffung barrierefreier Informationstechnik nach dem Behindertengleich-
stellungsgesetz« (Barrierefreie Informationstechnik-Verordnung, BITV).
PDFlib ist die erste allgemein einsetzbare PDF-Bibliothek, die die Erzeugung von
Tagged PDF unterstützt. Mit den neuen Funktionen kann aus dynamischen Daten sehr
einfach Tagged PDF erzeugt werden. Alle Acrobat-Funktionen für Tagged PDF können
auf die generierte Ausgabe angewandt werden, zum Beispiel das Umfließen von Text,
die Sprachausgabe und der erweiterte Export in andere Formate wie RTF, HTML oder
XML. In Kombination mit der neuen Textflussformatierung lassen sich auch umfang-
reiche Texte schnell nach Tagged PDF übertragen. Es ist das erste Mal, dass dynamisch
auf dem Web-Server generiertes PDF den Vorschriften bezüglich Barrierefreiheit ge-
nügt.
OPI für die Druckvorstufe. In manchen Arbeitsabläufen in der grafischen Industrie ist
noch der OPI-Standard aus der PostScript-Ära im Einsatz, bei dem OPI-Informationen in
PDF-Dokumente eingebettet werden. PDFlib 6 unterstützt dies durch Optionen zum
Hinzufügen von OPI-Informationen zu importierten Bildern.
Linearisiertes PDF. PDFlib 6 generiert linearisiertes PDF, das auch web-optimiertes PDF
genannt wird. Dies ermöglicht das seitenweise Herunterladen (auch Byteserving ge-
nannt) von PDF-Dokumenten im Webbrowser, so dass sie dem Benutzer unverzüglich
angezeigt werden.
Formularfelder. Alle Typen von PDF-Formularfeldern können erstellt und mit Java-
Script oder anderen Aktionen versehen werden. Damit lassen sich PDF-Formulare dyna-
misch anhand von Benutzereingaben oder Datenbankinhalten erzeugen.
Hypertext. Die Hypertext-Funktionen von PDFlib wurden erweitert, so dass nun alle
PDF-Optionen für Lesezeichen, Aktionen und Anmerkungen unterstützt werden. Über
die Seitennummerierung können Seiten symbolische Namen oder römische Zahlen zu-
gewiesen werden, z.B. i, ii, iii... oder A-1, A-2 etc.
16 Kapitel 1: Einführung
1.3 Funktionalität von PDFlib
Tabelle 1.1 zeigt eine Liste der wichtigsten PDFlib-Funktionen zum Erstellen und Impor-
tieren von PDF. In PDFlib 6 neue oder erweiterte Funktionen sind gekennzeichnet.
Tabelle 1.1 Funktionen von PDFlib, PDFlib+PDI und PDFlib Personalization Server (PPS)
Kategorie Funktionalität
PDF-Ausgabe PDF-Dokumente beliebiger Länge, direkt im Arbeitsspeicher (für Web-Server) oder auf Festplatte
Kompression von Text, Vektorgrafik, Rasterbilddaten und Dateianlagen
Einfügen von Seiten1 und Unterbrechung/Wiederaufnahme1 der Seitenausgabe, um Seiten in
beliebiger Reihenfolge zu erzeugen
PDF-Varianten PDF 1.3, 1.4, 1.5 und 1.6 (Acrobat 4, 5, 6 und 7)
Linearisiertes (Web-optimiertes) PDF für Byteserving über das Web1
PDF-Import Import von Seiten aus vorhandenen PDF-Dokumenten (nur PDFlib+PDI und PPS)
Blöcke PDF-Personalisierung mit PDFlib-Blöcken für Text, Rasterbilder und PDF-Daten (nur PPS)
PDFlib-Block-Plugin für Acrobat zur Erstellung von PDFlib-Blöcken (nur PPS), neue Oberfläche1
Vektorgrafik Basisfunktionen für Vektorgrafik: Linienzüge, Kurvenzüge, Kreise, Rechtecke etc.
Farbverläufe, Füllen von Flächen und Durchziehen von Linien mit Mustern
effiziente Wiederverwendung von Text und Vektorgrafik durch Templates
Parameter für expliziten Grafikzustand zum Aussparen, Überdrucken von Text etc.
Transparenz und Farbmischmodus
Ebenen1 (Layer): optionaler Seiteninhalt, der selektiv aktiviert oder deaktiviert werden kann
Schriften TrueType- (ttf und ttc) und PostScript-Type-1-Schriften (pfb und pfa sowie lwfn auf dem Mac)
OpenType-Schriften (ttf, otf) mit PostScript- oder TrueType-Zeichenbeschreibungen
AFM- und PFM-Metrikdateien für PostScript-Schriften
Schrifteinbettung
Verwendung der im System installierten Schriften auf Mac und Windows
Untergruppenbildung (Subsetting) für TrueType- und OpenType-Schriften
benutzerdefinierte (Type 3) Schriften
Textausgabe Textausgabe in beliebigen Fonts; unterstrichener, überstrichener, durchgestrichener Text
Unterschneidung (Kerning) für PostScript-, TrueType- und OpenType-Fonts
TrueType- und OpenType-Glyph-ID-Adressierung für anspruchsvolle Typografie
proportionale Breite für Standard-CJK-Schriften
Internatio- Unicode für Seitenbeschreibungen, Hypertext1 und Dateinamen1; UTF-8- oder UCS-2-Kodierung,
nalisierung Little- oder Big-Endian
vollintegrierte Behandlung von Unicode-Strings in COM, Java, .NET, REALbasic, Tcl
Unterstützung zahlreicher Zeichensätzen (internationale Standards und herstellerspezifische
Codepages)
Abfragen von Codepages vom System (Windows, IBM eServer iSeries und zSeries)
Standard-CJK-Schriften und CMaps für Chinesisch, Japanisch und Koreanisch
benutzerspezifische CJK-Schriften im TrueType- oder OpenType-Format mit Unicode
Einbettung von Unicode-Informationen in PDF, um Text in Acrobat korrekt zu extrahieren
Rasterbilder Rasterbilder in den Formaten BMP, GIF, PNG, TIFF1, JPEG, JPEG2000 und CCITT
automatische Erkennung von Rasterbilddateiformaten
transparente (maskierte) Bilder und Transparenzmasken
Bildmasken (eingefärbte Bilder)
18 Kapitel 1: Einführung
1.4 Verfügbarkeit der Funktionen in den Produkten
Tabelle 1.2 zeigt die Verfügbarkeit von Funktionen in der Open-Source-Variante PDFlib
Lite und verschiedenen kommerziellen Produkten.
PDFlib Personaliza-
tion Server (PPS)
(Open Source)
PDFlib+PDI
PDFlib Lite
PDFlib
Funktion API-Funktionen und Parameter
elementare PDF-Erstellung (alle außer den unten angeführten) X X X X
Sprachbindungen C, C++, Java, Perl, Tcl, PHP, Python X X X X
Sprachbindungen Cobol, COM, .NET, REALbasic, RPG, Ruby – X X X
funktioniert auf EBCDIC- – X X X
Systemen
Kennwortschutz und PDF_begin_document( ) mit Optionen – X X X
Berechtigungseinstellungen userpassword, masterpassword, permissions
linearisiertes PDF PDF_begin_document( ) mit Option linearize – X X X
Schriftuntergruppen (Subsets) PDF_load_font( ) mit Option subsetting – X X X
Unterschneiden (Kerning) PDF_load_font( ) mit Option kerning – X X X
Zugriff auf Mac- und PDF_load_font( ) – X X X
Windows-Systemschriften
Zugriff auf Systemzeichensätze PDF_load_font( ) – X X X
in Windows, iSeries und zSeries
Unicode-Zeichensatz und PDF_load_font( ) mit encoding = unicode, – X X X
ToUnicode- CMaps Parameter autocidfont und unicodemap
numerische und Entity- Option charref in PDF_fit_textline( ), Parameter – X X X
Referenzen charref
proportionale Zeichenbreiten PDF_load_font( ) mit UCS2-kompatibler CMap – X X X
für Standard-CJK-Fonts mit
Unicode-CMaps
Adressierung über Glyph-ID PDF_load_font( ) mit encoding = glyphid – X X X
erweiterte Zeichensätze für PDF_load_font( ) – X X X
OpenType-Fonts mit
PostScript-Outlines
Textfluss PDF_create_textflow( ), PDF_delete_textflow( ), – X X X
PDF_fit_textflow( ), PDF_info_textflow( )
Schmuckfarbe PDF_makespotcolor( ) – X X X
Farbseparation PDF_begin_page_ext( ) mit Option separationinfo – X X X
Formularfelder PDF_create_field( ), PDF_create_fieldgroup( ), PDF_ – X X X
create_action( ) mit type=SetOCGState
JavScript-Aktionen PDF_create_action( ) mit type=JavaScript – X X X
Ebenen PDF_define_layer( ), PDF_begin_layer( ), PDF_end_ – X X X
layer( ), PDF_set_layer_dependency( ), PDF_create_
action( ) mit type=SetOCGState
Tagged PDF PDF_begin_item( ), PDF_end_item( ), PDF_ – X X X
activate_item( ), PDF_begin_document( ) mit
Optionen tagged und lang
PDFlib Personaliza-
tion Server (PPS)
(Open Source)
PDFlib+PDI
PDFlib Lite
PDFlib
Funktion API-Funktionen und Parameter
JPEG2000 PDF_load_image( ) mit imagetype=jpeg2000 X X X
PDF/X-Unterstützung PDF_process_pdi( ), PDF_begin_document( ) mit – X X X
Option pdfx
Unterstützung von PDF_load_iccprofile( ), PDF_setcolor( ) mit iccbasedgray/ – X X X
ICC-Profilen rgb/cmyk, PDF_load_image( ) mit Option honoriccprofile,
Parameter honoriccprofile, PDF_begin/end_page_ext( )
mit Option defaultgray/rgb/cmyk
CIE L*a*b*-Farbe PDF_setcolor( ) mit type = lab; Lab-TIFF-Bilder – X X X
OPI-Unterstützung PDF_load_image( ) mit Optionen OPI-1.3/OPI-2.0 – X X X
PDF-Import (PDI) PDF_open_pdi( ), PDF_open_pdi_callback( ), PDF_open_ – – X X
pdi_page( ), PDF_fit_pdi_page( ), PDF_process_pdi( )
Abfrage von Informationen PDF_get_pdi_value( ), – – X X
aus vorhandenen PDFs PDF_get_pdi_parameter( )
Verarbeitung variabler PDF_fill_textblock( ), – – – X
Daten und Personalisierung PDF_fill_imageblock( ),
mit Blöcken PDF_fill_pdfblock( )
Abfrage von Standard- und PDF_get_pdi_value( ), PDF_get_pdi_parameter( ) – – – X
kundenspezifischen Block- mit Schlüsseln vdp/Blocks
eigenschaften
PDFlib-Block-Plugin für interaktive Erstellung von PDFlib-Blöcken zur – – – X
Acrobat Verwendung mit PPS
20 Kapitel 1: Einführung
2 Sprachbindungen von PDFlib
2.1 Übersicht
Verfügbarkeit und Plattformen. Die Funktionalität von PDFlib ist auf allen Plattfor-
men und in allen Sprachbindungen identisch (mit ein paar kleineren Ausnahmen, auf
die im Handbuch hingewiesen wird). Tabelle 2.1 zeigt die Kombinationen aus Sprache
und Plattform, die wir getestet haben.
2.1 Übersicht 21
2.2 Cobol-Sprachbindung
2.2.1 Besondere Hinweise für Cobol
Die PDFlib-API-Funktionen für Cobol sind nicht unter den in Kapitel 8 angegebenen Na-
men, sondern über spezielle Namenskürzel verfügbar. Diese Kürzel werden hier nicht
näher beschrieben, sondern in einer eigenen Umsetzungstabelle (xref.txt) aufgeführt. So
ist statt PDF_load_font( ) beispielsweise die abkürzende Schreibweise PDLODFNT zu ver-
wenden.
In Cobol programmierte PDFlib-Clients werden statisch mit dem PDFLBCOB-Objekt
gelinkt. Dieses lädt dynamisch das PDLBDLCB Load Module (DLL), welches beim ersten
Aufruf von PDNEW (entspricht PDF_new( )) wiederum das PDFlib Load Module (DLL) dy-
namisch lädt. Das Instanz-Handle der neu allozierten internen PDFlib-Struktur wird im
Parameter P gespeichert, der in allen folgenden Aufrufen übergeben werden muss.
Das PDLBDLCB Load Module liefert die Schnittstellen zwischen den 8-Zeichen-Cobol-
Funktionen und den PDFlib-Kernroutinen. Außerdem bildet es die asynchrone Ausnah-
mebehandlung von PDFlib auf das von Cobol erwartete, monolithische Verfahren ge-
mäß »prüfe den Rückgabewert jeder Funktion« ab.
Hinweis PDLBDLCB und PDFLIB müssen dem COBOL-Programm via STEPLIB verfügbar gemacht werden.
Datentypen. Die Datentypen, die in der vorliegenden PDFlib-Referenz für das API be-
nutzt werden, müssen wie in den folgenden Beispielen in Cobol-Datentypen umgesetzt
werden (aus dem Hello-Beispiel unten):
05 PDFLIB-A4-WIDTH USAGE COMP-1 VALUE 5.95E+2. // float
05 WS-INT PIC S9(9) BINARY. // int
05 WS-FLOAT COMP-1. // float
05 WS-STRING PIC X(128). // const char *
05 P PIC S9(9) BINARY. // long *
05 RETURN-RC PIC S9(9) BINARY. // int *
In allen an das PDFlib-API übergebenen Cobol-Strings sollte ein zusätzliches Byte zur
Speicherung des abschließenden Nullbytes (LOW-VALUES (NULL)) vorgesehen sein.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PDFLIB-PAGE-SIZE-CONSTANTS.
05 PDFLIB-A4-WIDTH USAGE COMP-1 VALUE 5.95E+2.
05 PDFLIB-A4-HEIGHT USAGE COMP-1 VALUE 8.42E+2.
01 PDFLIB-CALL-AREA.
05 P PIC S9(9) BINARY.
05 RC PIC S9(9) BINARY.
05 PDFLIB-RETURN-LONG PIC S9(9) BINARY.
05 PDFLIB-RETURN-CHAR PIC X(64) VALUE SPACES.
05 PDFLIB-ERR-STRING PIC X(128).
01 WS-WORK-FIELDS.
05 WS-INT PIC S9(9) BINARY.
05 WS-FONT PIC S9(9) BINARY.
05 WS-FLOAT COMP-1.
05 WS-FLOAT2 COMP-1.
05 WS-STRING PIC X(128).
05 WS-STRING2 PIC X(128).
05 WS-NULL PIC X(1) VALUE LOW-VALUES.
PROCEDURE DIVISION.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* CREATE A PDF OBJECT *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CALL "PDNEW" USING P,
RC.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* OPEN NEW PDF DOCUMENT *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MOVE 0 TO WS-INT.
STRING Z'HELLO.PDF'
DELIMITED BY SIZE INTO WS-STRING.
IF PDFLIB-RETURN-LONG = -1
CALL "PDERRMSG" USING P,
PDFLIB-ERR-STRING,
RC
2.2 Cobol-Sprachbindung 23
DISPLAY PDFLIB-ERR-STRING
MOVE +8 TO RETURN-CODE
GOBACK.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SET PDF INFORMATION *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
STRING Z'Creator'
DELIMITED BY SIZE INTO WS-STRING.
STRING Z'Hello.cbl'
DELIMITED BY SIZE INTO WS-STRING2.
STRING Z'Author'
DELIMITED BY SIZE INTO WS-STRING.
STRING Z'Thomas Merz'
DELIMITED BY SIZE INTO WS-STRING2.
STRING Z'Title'
DELIMITED BY SIZE INTO WS-STRING.
STRING Z'Hello, world (COBOL)!'
DELIMITED BY SIZE INTO WS-STRING2.
STRING Z'Helvetica-Bold'
DELIMITED BY SIZE INTO WS-STRING.
STRING Z'ebcdic'
DELIMITED BY SIZE INTO WS-STRING2.
MOVE 24 TO WS-FLOAT.
2.2 Cobol-Sprachbindung 25
END PROGRAM HELLO.
2.3 COM-Sprachbindung
(Dieser Abschnitt ist nur in der COM/.NET/REALbasic-Ausgabe des PDFlib-Referenz-
handbuchs enthalten.)
2.4 C-Sprachbindung
2.4.1 Verfügbarkeit und besondere Hinweise zu C
PDFlib ist in ANSI C geschrieben. Um die C-Sprachbindung von PDFlib zu nutzen, kön-
nen Sie eine statische oder eine dynamisch ladbare Bibliothek (DLL unter Windows und
MVS) verwenden. Außerdem benötigen Sie die zentrale PDFlib-Include-Datei pdflib.h zur
Einbindung in Ihre PDFlib-Client-Quellmodule. Alternativ dazu kann pdflibdl.h einge-
setzt werden, um die PDFlib-DLL zur Laufzeit dynamisch zu laden (siehe Abschnitt 2.4.3,
»Einsatz von PDFlib als DLL, die zur Laufzeit geladen wird«, Seite 27).
#include "pdflib.h"
int
main(void)
{
PDF *p;
int font;
PDF_TRY(p) {
if (PDF_begin_document(p, "hello.pdf", 0, "") == -1) {
printf("Error: %s\n", PDF_get_errmsg(p));
return(2);
}
PDF_end_document(p, "");
}
PDF_CATCH(p) {
printf("PDFlib exception occurred in hello sample:\n");
printf("[%d] %s: %s\n",
PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p));
PDF_delete(p);
return(2);
}
PDF_delete(p);
return 0;
}
2.4.3 Einsatz von PDFlib als DLL, die zur Laufzeit geladen wird
Die meisten Clients werden PDFlib als statisch gebundene oder dynamische Bibliothek
einsetzen, die beim Linken gebunden wird. Sie können die PDFlib-DLL aber auch zur
Laufzeit laden und sich dynamisch Zeiger auf alle API-Funktionen besorgen. Dies ist ins-
besondere unter MVS sinnvoll, wo es üblich ist, die Bibliothek als DLL zur Laufzeit zu la-
den, ohne die Applikation überhaupt mit der PDFlib-Bibliothek zu linken. Zur einfache-
ren Verwendung dieser Methode gehen Sie wie folgt vor:
> Inkludieren Sie pdflibdl.h statt pdflib.h.
> Verwenden Sie PDF_new_dl( ) und PDF_delete_dl( ) statt PDF_new( ) und PDF_delete( ).
> Verwenden Sie PDF_TRY_DL( ) und PDF_CATCH_DL( ) statt PDF_TRY( ) und PDF_CATCH( ).
> Arbeiten Sie bei allen anderen PDFlib-Aufrufen mit Funktionszeigern.
> PDF_get_opaque( ) darf nicht verwendet werden.
> Kompilieren Sie das Hilfsmodul pdflibdl.c und binden Sie es mit Ihrer Anwendung.
Hinweis Das Laden der PDFlib-DLL zur Laufzeit wird nicht auf allen Plattformen unterstützt.
Das folgende Beispiel lädt die PDFlib-DLL mit diesem Verfahren zur Laufzeit:
#include <stdio.h>
#include <stdlib.h>
#include "pdflibdl.h"
int
main(void)
{
PDF *p;
int font;
PDFlib_api *PDFlib;
2.4 C-Sprachbindung 27
printf("PDFlib-Objekt konnte nicht erzeugt werden (DLL nicht gefunden?)\n");
return(2);
}
PDF_TRY_DL(PDFlib, p) {
if (PDFlib->PDF_begin_document(p, "hellodl.pdf", 0, "") == -1) {
printf("Error: %s\n", PDFlib->PDF_get_errmsg(p));
return(2);
}
PDFlib->PDF_end_document(p, "");
}
PDF_CATCH_DL(PDFlib, p) {
printf("PDFlib-Exception aufgetreten in Beispiel hellodl:\n");
printf("[%d] %s: %s\n",
PDFlib->PDF_get_errnum(p), PDFlib->PDF_get_apiname(p),
PDFlib->PDF_get_errmsg(p));
PDF_delete_dl(PDFlib, p);
return(2);
}
return 0;
}
2.4.4 Fehlerbehandlung in C
PDFlib unterstützt die strukturierte Ausnahmebehandlung mit try/catch-Klauseln. Da-
mit können C- und C++-Clients von PDFlib ausgelöste Exceptions abfangen und ange-
messen reagieren. In der catch-Klausel hat der Client Zugriff auf einen String mit einer
exakten Problembeschreibung, einer eindeutigen Exception-Nummer und dem Namen
der PDFlib-API-Funktion, die die Ausnahme ausgelöst hat. Ein PDFlib-C-Clientpro-
gramm mit Ausnahmebehandlung besitzt in etwa folgenden Aufbau:
PDF_TRY(p)
{
...PDFlib-Anweisungen...
}
PDF_CATCH(p)
PDF_delete(p);
Hinweis PDF_TRY und PDF_CATCH sind recht trickreich als Präprozessor-Makros implementiert. Verges-
sen Sie eines davon, so erhalten Sie eine vermutlich schwierig zu verstehende Compiler-Fehler-
meldung. Benutzen Sie die Makros deshalb genau wie oben angegeben, ohne zusätzlichen
Code zwischen die TRY- und CATCH-Klauseln einzufügen (außer PDF_CATCH( )).
Wenn Sie die try-Klausel mittendrin verlassen möchten, müssen Sie den Exception-Me-
chanismus darüber zuerst mit dem Makro PDF_EXIT_TRY( ) informieren. Zwischen die-
sem Makro und dem Ende des try-Blocks darf dann keine andere PDFlib-Funktion mehr
aufgerufen werden.
Eine wesentliche Aufgabe der catch-Klausel besteht darin, das Innenleben von PDFlib
mit PDF_delete( ) und dem Zeiger auf das PDFlib-Objekt zu bereinigen. PDF_delete( )
schließt gegebenenfalls auch die Ausgabedatei. In benutzerdefinierten Error-Handlern
dürfen nur die PDFlib-Funktionen PDF_delete( ) und PDF_get_opaque( ) sowie die Aus-
nahmebehandlungsfunktionen PDF_get_errnum( ), PDF_get_apiname( ) und PDF_get_
errmsg( ) aufgerufen werden. Nach fatalen Exceptions ist das PDF-Dokument unbrauch-
bar und wird unvollständig und inkonsistent hinterlassen. Wie auf eine Exception zu
reagieren ist, hängt natürlich vollkommen von der jeweiligen Anwendung ab.
Bei C- und C++-Clients, die keine Exceptions abfangen, wird auf Exceptions standard-
mäßig mit einer entsprechenden Meldung auf die Standard-Fehlerausgabe sowie einem
Abbruch bei fatalen Fehlern reagiert. Beachten Sie, dass die PDF-Ausgabedatei dabei in
einem inkonsistenten Zustand hinterlassen wird! Da ein Programmabbruch für eine
Bibliotheksroutine nicht akzeptabel ist, sollten bei ernsthaften PDFlib-Projekten unbe-
dingt die Fehlerbehandlungsmöglichkeiten von PDFlib genutzt werden. Eine benutzer-
definierte catch-Klausel könnte die Fehlermeldung beispielsweise in einem GUI-Dialog-
feld präsentieren und danach nicht abbrechen, sondern auf andere Art fortfahren.
2.4.5 Speicherverwaltung in C
Um maximale Flexibilität zu gewährleisten, können die PDFlib-internen Speicherver-
waltungsroutinen (die auf den Standard-C-Funktionen malloc und free basieren) durch
externe, vom Client übergebene Prozeduren ersetzt werden. Diese werden dann für jede
PDFlib-interne Speicherallozierung oder -freigabe benutzt. Sie werden mit PDF_new2( )
installiert und dann statt der internen PDFlib-Routinen verwendet. Beim Aufruf von
PDF_new2( ) müssen entweder alle oder keine der folgenden Routinen übergeben wer-
den:
2.4 C-Sprachbindung 29
> eine Routine zur Speicherallozierung
> eine Routine zur Speicherfreigabe
> eine Routine zur Neuallozierung, die Speicherblöcke vergrößert, die vorher mit der
Allozierungsroutine belegt wurden
2.5 C++-Sprachbindung
2.5.1 Verfügbarkeit und besondere Hinweise zu C++
Neben der C-Include-Datei pdflib.h wird für PDFlib-Clients ein Objekt-Wrapper für C++
mitgeliefert. Dieser erfordert die Include-Datei pdflib.hpp, die wiederum pdflib.h inklu-
diert, welche also ebenfalls vorhanden sein muss. Das zugehörige Modul pdflib.cpp muss
mit der Anwendung gebunden werden, die wiederum mit der generischen PDFlib-C-
Bibliothek zu binden ist.
Um den C++-Objekt-Wrapper effektiv einzusetzen, tritt an die Stelle des Präfix PDF_
in allen PDFlib-Funktionen ein stärker objektorientierter Ansatz mit einem PDFlib-
Objekt und zugehörigen Methoden. Beachten Sie diesen Unterschied, wenn Sie die PDF-
lib-API-Beschreibungen im Handbuch lesen, die in C-Syntax aufgelistet werden.
#include "pdflib.hpp"
int
main(void)
{
try {
p.set_info("Creator", "hello.cpp");
p.set_info("Author", "Thomas Merz");
p.set_info("Title", "Hello, world (C++)!");
p.setfont(font, 24);
p.set_text_pos(50, 700);
p.show("Hello, world!");
p.continue_text("(says C++)");
p.end_page_ext("");
p.end_document("");
}
return 0;
}
2.5 C++-Sprachbindung 31
2.5.4 Speicherverwaltung in C++
Vom Client übergebene Routinen zur Speicherverwaltung funktionieren in der C++-
Sprachbindung genauso wie in der C-Sprachbindung.
Dem PDFlib-Konstruktor können optional ein Error-Handler, Speicherverwaltungs-
routinen sowie ein Zeiger auf Benutzerdaten übergeben werden. In pdflib.hpp werden
standardmäßig NULL-Argumente übergeben, die eine Aktivierung der Fehler- und Spei-
cherverwaltungsroutinen von PDFlib bewirken. Sämtliche Speicherverwaltungsfunkti-
onen müssen C-Funktionen sein. Es dürfen keine C++-Methoden zum Einsatz kommen.
Zur Vermeidung dieses Problems verwenden Sie den String-Konstruktor mit explizitem
Längenparameter:
p.show(string("\x00\x41\x96\x7B\x8C\xEA", 6)); // Richtig
2.6 Java-Sprachbindung
Java unterstützt ein portierbares Verfahren zum Anbinden von nativem Programm-
code an Java-Programme, nämlich das Java Native Interface (JNI). Das JNI bietet Pro-
grammierkonventionen, um native C- oder C++-Routinen aus Java-Code heraus aufzu-
rufen und umgekehrt. Um der Java-VM zugänglich zu sein, müssen alle C-Routinen in
geeignetem Wrapper-Code verpackt werden. Die daraus resultierende Bibliothek ist als
dynamisches Objekt zu generieren, damit sie von der Java-VM geladen werden kann.
Um von Java aus verwendbar zu sein, wird mit PDFlib JNI-Wrapper-Code mitgelie-
fert. Anhand des geschilderten Verfahrens kann PDFlib an Java angebunden werden, in-
dem die dynamische Bibliothek von der Java-VM geladen wird. Das eigentliche Laden
der Bibliothek erfolgt mittels einer statischen Member-Funktion der Java-Klasse pdflib.
Dadurch muss sich der Java-Client nicht mit den Einzelheiten zum Laden einer dynami-
schen Bibliothek auseinandersetzen.
Aufgrund der Stabilität und Robustheit von PDFlib wird die Stabilität und Sicherheit
der Java-Anwendung beim Anbinden der nativen PDFlib-Bibliothek an die Java-VM in
keinerlei Weise beeinträchtigt. Als Vorteil kann die höhere Geschwindigkeit einer nati-
ven Implementierung genutzt werden. Hinsichtlich der Portabilität ist zu bedenken,
dass PDFlib auf allen Plattformen verfügbar ist, auf denen eine Java-VM läuft!
Dieses Paket befindet sich in der Datei pdflib.jar und enthält eine einzige Klasse namens
pdflib. Anhand der Quelldateien in der PDF-Lite-Version können Sie mit dem Utility-Pro-
gramm javadoc eine gekürzte Fassung des (vorliegenden) PDFlib-Referenzhandbuchs er-
zeugen, da die PDFlib-Klasse die erforderlichen javadoc-Kommentare enthält. Textdatei-
en mit Anmerkungen und Einschränkungen zum Einsatz von PDFlib in verschiedenen
Java-Umgebungen sind ebenfalls vorhanden.
Um dieses Paket Ihrer Anwendung verfügbar zu machen, müssen Sie pdflib.jar an die
Umgebungsvariable CLASSPATH anfügen, die Option -classpath pdflib.jar in die Aufrufe
von Java-Compiler und Java-Laufzeitumgebung aufnehmen oder die entsprechenden
Schritte in Ihrer IDE durchführen. Im JDK können Sie die Java-VM so konfigurieren, dass
sie ein vorgegebenes Verzeichnis nach nativen Bibliotheken durchsucht. Dazu weisen
Sie der Property java.library.path den Namen des gewünschten Verzeichnisses zu, zum
Beispiel:
java -Djava.library.path=. pdfclock
Unix. Unter Unix muss die Bibliothek libpdf_java.so (unter Mac OS X: libpdf_java.jnilib)
in eines der Standardverzeichnisse für dynamisch ladbare Bibliotheken oder in ein ent-
sprechend konfiguriertes Verzeichnis kopiert werden.
2.6 Java-Sprachbindung 33
Ausführlichere Hinweise zum Einsatz von PDFlib mit bestimmten Servlet-Engines und
Java-Applikationsservern finden Sie in weiteren Dokumentationsdateien der PDFlib-
Distribution.
Hinweis Da die Spezifikation der EJB (Enterprise Java Beans) den Gebrauch nativer Bibliotheken aus-
schließt, kann PDFlib nicht in EJBs eingesetzt werden.
try{
p = new pdflib();
p.set_info("Creator", "hello.java");
p.set_info("Author", "Thomas Merz");
p.set_info("Title", "Hello world (Java)!");
p.setfont(font, 18);
p.set_text_pos(50, 700);
p.show("Hello world!");
p.continue_text("(says Java)");
p.end_page_ext("");
p.end_document("");
} catch (PDFlibException e) {
System.err.print("PDFlib exception occurred in hello sample:\n");
System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() +
": " + e.get_errmsg() + "\n");
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
if (p != null) {
p.delete();
}
}
}
}
Die Java-Exceptions können mit der üblichen Kombination aus try und catch behandelt
werden:
try {
...PDFlib-Anweisungen...
} catch (PDFlibException e) {
System.err.print("PDFlib exception occurred in hello sample:\n");
System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() +
": " + e.get_errmsg() + "\n");
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
if (p != null) {
p.delete(); /* PDFlib-Objekt löschen */
}
}
2.7 .NET-Sprachbindung
(Dieser Abschnitt ist nur in der COM/.NET/REALbasic-Ausgabe des PDFlib-Referenz-
handbuchs enthalten.)
2.8 Perl-Sprachbindung
Perl1 unterstützt ein Verfahren zur Erweiterung des Sprachinterpreters durch native
C-Bibliotheken. Der PDFlib-Wrapper für Perl besteht aus einer C-Wrapperdatei und ei-
nem Perl-Paketmodul. Das C-Modul wird zum Aufbau einer dynamischen Bibliothek
verwendet, die vom Perl-Interpreter unter Zuhilfenahme der Paketdatei zur Laufzeit ge-
laden wird. Perl-Skripten referenzieren das Bibliotheksmodul mit einer use-Anweisung.
1. Siehe www.perl.com
2.7 .NET-Sprachbindung 35
Damit die PDFlib-Sprachbindung funktioniert, benötigt der Perl-Interpreter Zugriff
auf den PDFlib-Perl-Wrapper und die Moduldatei pdflib_pl.pm. Zusätzlich zu den unten
beschriebenen plattformspezifischen Methoden können Sie mit der Perl-Befehlszeilen-
option -I zum Modulsuchpfad @INC ein Verzeichnis hinzufügen, zum Beispiel:
perl -I/path/to/pdflib hello.pl
Unix. Perl sucht pdflib_pl.so (unter Mac OS X: pdflib_pl.dylib) und pdflib_pl.pm im aktuel-
len Verzeichnis oder in dem Verzeichnis, das mit folgendem Befehl ausgegeben wird:
perl -e 'use Config; print $Config{sitearchexp};'
Perl durchsucht außerdem das Unterverzeichnis auto/pdflib_pl. Der obige Befehl liefert
eine Ausgabe, die in etwa wie folgt aussieht:
/usr/lib/perl5/site_perl/5.8/i686-linux
Windows. PDFlib unterstützt den ActiveState-Port von Perl 5 für Windows namens Ac-
tivePerl.1 pdflib_pl.dll und pdflib_pl.pm werden im aktuellen Verzeichnis gesucht oder im
Verzeichnis, das mit folgendem Perl-Befehl ausgegeben wird:
perl -e "use Config; print $Config{sitearchexp};"
Der obige Befehl liefert eine Ausgabe, die in etwa wie folgt aussieht:
C:\Program Files\Perl5.8\site\lib
$p = PDF_new();
eval {
if (PDF_begin_document($p, "hello.pdf", "") == -1) {
printf("Error: %s\n", PDF_get_errmsg($p));
exit;
}
PDF_end_document($p, "");
1. Siehe www.activestate.com
if ($@) {
printf("hello: PDFlib Exception occurred:\n");
printf(" $@\n");
exit;
}
PDF_delete($p);
2.9 PHP-Sprachbindung
2.9.1 Installation der PDFlib-Edition für PHP
Ausführliche Informationen über die verschiedenen Möglichkeiten des Einsatzes von
PDFlib mit PHP 1 einschließlich einer Diskussion der Frage, ob ein ladbares PDFlib-Modul
für PHP zum Einsatz kommen kann oder nicht, finden Sie in der Datei PDFlib-in-PHP-
HowTo.pdf, die mitausgeliefert wird und auf der PDFlib-Web-Site verfügbar ist.
Sie müssen PHP per Konfiguration über die externe PDFlib-Bibliothek informieren.
Dazu gibt es zwei Möglichkeiten:
> Fügen Sie in eine der folgenden Zeilen in php.ini ein:
extension=libpdf_php.so ; für Unix
extension=libpdf_php.dll ; für Windows
PHP sucht die Bibliothek in dem Verzeichnis, das unter Unix in der Variablen
extension_dir in der Datei php.ini verzeichnet ist. Unter Windows werden außerdem
die Standardsystemverzeichnisse durchsucht. Mit dem folgenden einzeiligen PHP-
Skript können Sie ermitteln, welche Version der PDFlib-Sprachbindung für PHP Sie
installiert haben:
<?phpinfo()?>
Angezeigt wird eine lange Info-Seite über Ihre aktuelle PHP-Konfiguration. Suchen
Sie auf der Seite nach dem Abschnitt pdf. Wenn dieser Abschnitt PDFlib GmbH Binary
Version (sowie die PDFlib-Versionsnummer) enthält, dann verwenden Sie den unter-
stützten neuen PDFlib-Wrapper. Der nicht unterstützte alte Wrapper wird dagegen
als PDFlib GmbH Version angezeigt.
> Laden Sie PDFlib zur Laufzeit, wobei Sie eine der folgenden Zeilen an den Anfang
Ihres Skripts stellen:
1. Siehe www.php.net
2.9 PHP-Sprachbindung 37
dl("libpdf_php.so"); # für Unix
dl("libpdf_php.dll"); # für Windows
Neue Funktionen in PHP 5. PDFlib nutzt folgende neue Funktionen von PHP 5:
> Neues Objektmodell: Die PDFlib-Funktionen sind in ein PDFlib-Objekt gekapselt.
> Exceptions: PDFlib-Exceptions werden als PHP-5-Exceptions weitergeleitet und kön-
nen mit der üblichen Kombination aus try und catch abgefangen werden. Die neue
Ausnahmebehandlung kann sowohl mit dem neuen objektorientierten Konzept als
auch mit den alten API-Funktionen verwendet werden.
Um zu gewährleisten, dass Dateinamen unabhängig von der Plattform immer gleich be-
handelt werden, sollten Sie unbedingt die SearchPath-Funktion von PDFlib verwenden
(siehe Abschnitt 3.1.5, »Ressourcenkonfiguration und Dateisuche«, Seite 56).
/* open new PDF file; insert a file name to create the PDF on disk */
if (PDF_begin_document($p, "", "") == 0) {
die("Error: " . PDF_get_errmsg($p));
}
PDF_end_document($p, "");
$buf = PDF_get_buffer($p);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello.pdf");
print $buf;
PDF_delete($p);
?>
Beispiel für PHP 5. Das folgende Beispiel verwendet die neuen PHP-5-Funktionen zur
Ausnahmebehandlung und Objektkapselung:
<?php
try {
$p = new PDFlib();
/* open new PDF file; insert a file name to create the PDF on disk */
if ($p->begin_document("", "") == 0) {
die("Error: " . $p->get_errmsg());
}
$p->set_info("Creator", "hello.php");
$p->set_info("Author", "Rainer Schaaf");
$p->set_info("Title", "Hello world (PHP)!");
$p->setfont($font, 24.0);
$p->set_text_pos(50, 700);
$p->show("Hello world!");
$p->continue_text("(says PHP)");
$p->end_page_ext("");
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello.pdf");
print $buf;
}
catch (PDFlibException $e) {
die("PDFlib exception occurred in hello sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
2.9 PHP-Sprachbindung 39
}
catch (Exception $e) {
die($e);
}
$p = 0;
?>
.. PDFlib-Anweisungen...
Beachten Sie, dass Sie die von PHP 5 unterstützte Ausnahmebehandlung sowohl mit der
alten funktionsorientierten, als auch mit der neuen objektorientierten PDFlib-Schnitt-
stelle verwenden können.
Unix. Die Bibliothek pdflib_py.so (unter Mac OS X: pdflib_py.dylib) wird in allen Ver-
zeichnissen gesucht, die in der Umgebungsvariablen PYTHONPATH festgelegt sind.
Windows. Die Bibliothek pdflib_py.dll wird in allen Verzeichnissen gesucht, die in der
Umgebungsvariablen PYTHONPATH festgelegt sind.
p = PDF_new()
PDF_end_document(p, "")
PDF_delete(p)
1. Siehe www.python.org
2.10 Python-Sprachbindung 41
except:
print 'Exception abgefangen!'
2.11 REALbasic-Sprachbindung1
(Dieser Abschnitt ist nur in der COM/.NET/REALbasic-Ausgabe des PDFlib-Referenz-
handbuchs enthalten.)
2.12 RPG-Sprachbindung
PDFlib bietet ein /copy-Modul, das alle Prototypen sowie einige nützliche Konstanten
definiert, die zur Kompilierung von ILE-RPG-Programmen mit eingebetteten PDFlib-
Funktionen benötigt werden.
Da alle von PDFlib bereitgestellten Funktionen in der Sprache C implementiert sind,
müssen Sie am Ende jedes String-Wertes, der an eine PDFlib-Funktion übergeben wird,
x'00' anfügen. Alle von PDFlib zurückgegebenen Strings werden ebenfalls mit x'00' be-
endet.
Bevor Sie mit der Kompilierung des ILE-RPG-Programms beginnen, müssen Sie ein Bin-
dungsverzeichnis anlegen, das das mit PDFlib ausgelieferte PDFlib-Serviceprogramm
enthält. Das folgende Beispiel zeigt, wie Sie in der Bibliothek PDFLIB das Bindungsver-
zeichnis PDFLIB erstellen:
CRTBNDDIR BNDDIR(PDFLIB/PDFLIB) TEXT('PDFlib Binding Directory')
Sie können Ihr Programm nun mit dem Befehl CRTBNDRPG (oder der Option 14 in PDM)
kompilieren:
1. Siehe www.realbasic.com
2.12 RPG-Sprachbindung 43
*
c eval fontname='Helvetica-Bold'+x'00'
c eval fontenc='ebcdic'+x'00'
c eval font=PDF_load_font(p:fontname:0:fontenc:n)
*
c callp PDF_setfont(p:font:24)
c callp PDF_set_text_pos(p:50:700)
*
c eval text='Hello world!'+x'00'
c callp PDF_show(p:text)
c eval text='(says ILE RPG)'+x'00'
c callp PDF_continue_text(p:text)
c callp PDF_end_page_ext(p:empty)
c callp PDF_end_document(p:empty)
c callp PDF_delete(p)
*
c exsr exit
*****************************************************************************************
c geterrmsg begsr
c eval errmsg_p=PDF_get_errmsg(p)
c if errmsg_p<>*NULL
c eval error=%subst(errmsg:1:%scan(x'00':errmsg)-1)
c endif
c endsr
*****************************************************************************************
c exit begsr
c if error<>*blanks
c eval error='Error: '+error
c error dsply
c endif
c seton lr
c return
c endsr
...PDFlib-Anweisungen...
c callp PDF_delete(p)
*
c exsr exit
*****************************************************************************************
c exit begsr
c if error<>*blanks
c error dsply
c endif
c seton lr
c return
c endsr
*****************************************************************************************
* Wenn eine der PDFlib-Funktionen eine Exception auslöst, wird zuerst der
* Error-Handler aufgerufen. Danach erhalten wir eine reguläre RPG-Exception.
c *pssr begsr
c exsr exit
c endsr
*****************************************************************************************
* Fehlerbehandlungsprozedur
* Diese Prozedur wird an PDFlib gebunden, indem der Prozedurzeiger an PDF_new2
* übergeben wird. Sie wird beim Auftreten einer PDFlib-Exception aufgerufen.
*
*****************************************************************************************
p errhandler B
d errhandler PI
d p * value
d type 10i 0 value
d c_message 2048
*
d length s 10i 0
*
* x'00' am Ende entfernen (wir werden von einem C-Programm aufgerufen)
* und Fehler-String (global) setzen
c clear error
c x'00' scan c_message length 50
c sub 1 length
c if *in50 and length>0
c if length>%size(error)
c eval error=c_message
c else
2.12 RPG-Sprachbindung 45
c eval error=%subst(c_message:1:length)
c endif
c endif
*
* Immer PDF_delete aufrufen, um PDFlib zu bereinigen
c callp PDF_delete(p)
*
c return
*
p errhandler E
2.13 Ruby-Sprachbindung
2.13.1 Installation der Ruby-Edition von PDFlib
Der Erweiterungsmechanismus von Ruby1 lädt eine dynamische Bibliothek zur Lauf-
zeit. Damit die PDFlib-Sprachbindung funktioniert, benötigt der Ruby-Interpreter Zu-
griff auf die PDFlib-Erweiterungsbibliothek für Ruby. Diese Bibliothek (unter Windows/
Linux/Unix: PDFlib.so; auf Mac OS X: PDFlib.dylib) wird normalerweise im Unterverzeich-
nis site_ruby des lokalen Ruby-Installationsverzeichnisses installiert, das heißt in einem
Verzeichnis mit etwa folgendem Namen:
/usr/local/lib/ruby/site_ruby/<rubyversion>/
Ruby durchsucht aber auch andere Verzeichnisse nach Erweiterungen. Mit folgendem
Ruby-Aufruf erhalten Sie eine Liste dieser Verzeichnisse:
ruby -e "puts $:"
Diese Liste enthält in der Regel auch das aktuelle Verzeichnis, so dass Sie die PDFlib-Er-
weiterungsbibliothek und die Skripte zum Testen einfach ins gleiche Verzeichnis stel-
len können.
begin
p = PDFlib.new
p.set_info("Creator", "hello.rb")
p.set_info("Author", "Thomas Merz")
p.set_info("Title", "Hello world (Ruby)!")
1. Siehe www.ruby-lang.org/en
p.set_text_pos(50, 700)
p.show("Hello world!")
p.continue_text("(says Ruby)")
p.end_page_ext("")
p.end_document("")
Lokale PDFlib-Installation. Wenn Sie PDFlib nur mit Ruby on Rails einsetzen möchten
und nicht global zum allgemeinen Einsatz mit Ruby installieren können, können Sie
PDFlib auch lokal im Verzeichnis vendors in der Rails-Hierarchie installieren. Dies ist ins-
besondere dann nützlich, wenn Sie nicht über die Berechtigung verfügen, allgemeine
Ruby-Erweiterungen zu installieren, aber in Rails mit PDFlib arbeiten möchten.
1. Siehe www.rubyonrails.org
2.13 Ruby-Sprachbindung 47
2.14 Tcl-Sprachbindung
2.14.1 Installation der PDFlib-Tcl-Edition
Der Erweiterungsmechanismus von Tcl 1 lädt dynamische Bibliotheken zur Laufzeit. Da-
mit die PDFlib-Bindung funktioniert, benötigt die Tcl-Shell Zugriff auf die dynamische
Bibliothek mit dem PDFlib-Wrapper für Tcl sowie auf die Paketindexdatei pkgIndex.tcl.
Um die Bibliothek von einem bestimmten Verzeichnis aus verfügbar zu machen, kön-
nen Sie in Ihrem Skript folgendes Idiom verwenden (dies mag sinnvoll sein, wenn Sie
PDFlib auf einem System ausführen, auf dem Sie keine Administrator-Berechtigung be-
sitzen und PDFlib somit nicht installieren können):
lappend auto_path /path/to/pdflib
Unix. Die Bibliothek pdflib_tcl.so (unter Mac OS X: pdflib_tcl.dylib) muss in eines der
Standardverzeichnisse für dynamische Bibliotheken kopiert werden oder in ein anderes
entsprechend konfiguriertes Verzeichnis. Die Dateien pkgIndex.tcl und pdflib_tcl.so wer-
den normalerweise in folgendes Verzeichnis gestellt:
/usr/lib/tcl8.3/pdflib
set p [PDF_new]
1. Siehe dev.scriptics.com
PDF_delete $p
2.14 Tcl-Sprachbindung 49
50 Kapitel 2: Sprachbindungen von PDFlib
3 PDFlib-Programmierung
3.1 Allgemeine Aspekte
3.1.1 PDFlib-Programmstruktur und Geltungsbereich von Funktionen
PDFlib-Anwendungen müssen sich an einige strukturelle Regeln halten, die sehr ein-
fach zu verstehen sind. Es ist sehr einfach, Anwendungen unter Einhaltung dieser Be-
dingungen zu schreiben. So wird man eine Seite zum Beispiel kaum schließen, bevor
man sie geöffnet hat. Da sich das PDFlib-API eng an die herkömmliche Auffassung eines
aus einzelnen Seiten bestehenden Dokuments anlehnt, erhält man in der Regel korrek-
te PDFlib-Clientprogramme, wenn man ein Dokument einfach auf ganz »natürliche«
Art und Weise anlegt.
PDFlib erzwingt die korrekte Reihenfolge von Funktionsaufrufen durch streng defi-
nierte Geltungsbereiche (so genannte scopes). Jede Funktionsbeschreibung enthält auch
Angaben über den jeweiligen Geltungsbereich. Der Aufruf einer Funktion in einem an-
deren Geltungsbereich löst eine PDFlib-Exception aus. PDFlib löst außerdem eine Ex-
ception aus, wenn die von einem Bibliotheksclient übergebenen Parameter nicht kor-
rekt sind.
In den Funktionsbeschreibungen in Kapitel 8 wird auch der jeweilige Geltungsbe-
reich angeführt. Tabelle 3.1 definiert die verschiedenen Geltungsbereiche, während Ab-
bildung 3.1 ihre Verschachtelung veranschaulicht. PDFlib löst eine Exception aus, wenn
eine Funktion außerhalb ihres zulässigen Geltungsbereichs aufgerufen wird. Der aktu-
elle Geltungsbereich kann mit dem Parameter scope abgefragt werden.
3.1.2 Parameter
Die Arbeitsweise von PDFlib lässt sich durch zahlreiche globale Parameter steuern. Sie
behalten ihre Einstellungen während der gesamten Lebensdauer des PDFlib-Objekts bei,
Abb. 3.1
Verschachtelung der ...
Geltungsbereiche
sofern sie nicht explizit vom Client geändert werden. Zur Parameterbehandlung sind
folgende Funktionen vorgesehen:
> PDF_set_parameter( ) zum Setzen von Parametern vom Typ string.
> PDF_set_value( ) zum Setzen von Parametern mit numerischen Werten.
> PDF_get_parameter( ) zur Abfrage von Parametern vom Typ string.
> PDF_get_value( ) zur Abfrage der Werte numerischer Parameter.
Weitere Informationen über die Namen und Werte der einzelnen Parameter finden Sie
in Kapitel 8.
PDFlib zeigt solche Fehler durch die Rückgabe eines speziellen Wertes an (normalerwei-
se – 1, aber 0 in der PHP-Sprachbindung), der bei den einzelnen Funktionen in Kapitel 8
52 Kapitel 3: PDFlib-Programmierung
beschrieben wird. Andere Ereignisse können als schädlich angesehen werden, aber eher
selten auftreten, zum Beispiel:
> es ist kein Speicher mehr verfügbar
> Verletzungen des Geltungsbereichs (zum Beispiel das Schließen eines Dokuments
vor dem Öffnen)
> die Übergabe falscher Parameter an PDFlib-Funktionen (zum Beispiel der Versuch,
einen Kreis mit negativem Radius zu zeichnen)
Stößt PDFlib auf eine solche Ausnahmesituation, so wird eine Exception ausgelöst, um
auf die Situation zu reagieren, ohne dass spezielle Werte an die aufrufende Funktion zu-
rückgegeben werden. In der Programmiersprache C, die Exceptions nicht direkt unter-
stützt, kann der Client eine eigene Fehlerbehandlungsroutine (einen so genannten Er-
ror-Handler) installieren, die im Falle einer Exception aufgerufen wird. Es wird jedoch
empfohlen, mit PDF_TRY( )/PDF_CATCH( )-Blöcken zu arbeiten (siehe Abschnitt 2.4.4,
»Fehlerbehandlung in C«, Seite 28).
Es ist wichtig sich klarzumachen, dass die Generierung des PDF-Dokuments nicht ab-
geschlossen werden kann, wenn eine Exception auftritt. Die einzigen Methoden, die
nach einer Exception noch aufgerufen werden können, sind PDF_delete( ), PDF_get_
apiname( ), PDF_get_errnum( ) und PDF_get_errmsg( ). Alle anderen PDFlib-Methoden lie-
fern unzuverlässige Ergebnisse. Die Exception (oder die an den C-Error-Handler überge-
benen Daten) umfassen folgende Informationen:
> eine eindeutige Fehlernummer (siehe Tabelle 3.2)
> der Name der PDFlib-API-Funktion, die die Exception ausgelöst hat
> ein beschreibender Text mit detaillierten Angaben zum Problem
Abfragen der Ursache für einen gescheiterten Funktionsaufruf. Wie oben erwähnt,
muss die Generierung der PDF-Ausgabe beim Auftreten einer Exception auf jeden Fall
abgebrochen werden. Manche Clients mögen es aber vorziehen, durch Anpassung eini-
ger Parameter mit dem Dokument fortzufahren. Kann beispielsweise ein bestimmter
Font nicht geladen werden, brechen die meisten Clients die Dokumentgenerierung ab;
es mag aber auch Clients geben, die mit einem anderen Font fortfahren möchten. Eine
derartige Differenzierung lässt sich mit den Parametern fontwarning etc. erreichen. In
obigem Fall wäre es vielleicht wünschenswert, die Fehlermeldung zu erhalten, die Teil
der Exception ist. Dazu können direkt nach einem gescheiterten Funktionsaufruf , das
heißt, nach einem Funktionsaufruf, der den Fehlerwert -1 (in PHP: 0) liefert, die Funktio-
nen PDF_get_errnum( ), PDF_get_errmsg( ) und PDF_get_apiname( ) aufgerufen werden.
Die folgenden Codefragmente zeigen verschiedene Strategien in bezug auf die Aus-
nahmebehandlung. Die Beispiele versuchen, einen Font zu laden und einzubetten,
wobei davon ausgegangen wird, dass der Font nicht verfügbar ist.
Ist der Parameter oder die Option fontwarning gleich true (der Standardfall), muss die
Dokumentgenerierung abgebrochen werden:
font = PDF_load_font(p, "MeinFontName", 0, "winansi", "fontwarning=true");
/* wenn keine Exception ausgelöst wurde, ist das Font-Handle gültig;
* wurde eine Exception ausgelöst, kann die PDF-Ausgabe nicht fortgesetzt werden
*/
Ist der Parameter fontwarning gleich false, muss überprüft werden, ob der Rückgabewert
gültig ist:
font = PDF_load_font(p, "MeinFontName", 0, "winansi", "fontwarning=false";
if (font == -1) {
/* Font-Handle ist ungültig; Ursache herausfinden. */
errmsg = PDF_get_errmsg(p);
/* Fehlermeldung protokollieren */
/* Anderen Font probieren oder aufgeben */
...
}
/* Font-Handle ist gültig; weiter wie üblich */
Ist der Parameter fontwarning gleich false und weist der Rückgabewert auf einen Fehler
hin, kann die Fehlerursache abgefragt werden, um angemessen auf die Situation reagie-
ren zu können:
PDF_set_parameter(p, "fontwarning", "false");
font = PDF_load_font(p, "MeinFontName", 0, "winansi", "embed";
if (font == -1) {
/* Font-Handle ist ungültig; Ursache herausfinden. */
errmsg = PDF_get_errmsg(p);
/* Fehlermeldung protokollieren */
54 Kapitel 3: PDFlib-Programmierung
/* Anderen Font probieren oder aufgeben */
...
}
/* Font-Handle ist gültig; weiter wie üblich */
Zum Auffinden einer Datei überprüft PDFlib zuerst, ob sich der Name auf eine virtuelle
Datei bezieht, und versucht dann, die Datei auf der Festplatte zu öffnen.
In allen Fällen darf der Client die entsprechenden Daten nur nach einem erfolgreichen
Aufruf von PDF_delete_pvf( ) oder nach PDF_delete( ) freigeben.
56 Kapitel 3: PDFlib-Programmierung
Tabelle 3.3 In PDFlib unterstützte Ressourcenkategorien
Ressourcenkategoriename Erklärung
Encoding Textdatei mit 8-Bit-Zeichensatz oder Codepagetabelle
HostFont Name einer im System installierten Schrift.
ICCProfile Name eines ICC-Farbprofils
StandardOutputIntent Name einer Standard-Druckausgabebedingung für PDF/X
Vermeiden Sie redundante Ressourceneinträge. Nehmen Sie zum Beispiel eine be-
stimmte Fontmetrikinformation nur einmal auf. Achten Sie zudem darauf, dass der
Schriftname in der UPR-Datei exakt mit dem tatsächlichen Schriftnamen überein-
stimmt (auch wenn PDFlib Abweichungen toleriert).
Auf Mac OS Classic muss der Doppelpunkt ’:’ als Trennzeichen in Verzeichnisanga-
ben verwendet werden. Die Schriftnamen der ressourcenbasierten PostScript-Type-1-
Schriften (LWFN-Fonts) müssen mit dem vollständigen Pfad einschließlich des Volume-
Namens angegeben werden:
Foo-Italic=Classic:Data:Fonts:FooIta
Das UPR-Dateiformat. UPR-Dateien liegen im Textformat vor und sind sehr einfach
aufgebaut, so dass sie problemlos manuell im Texteditor oder auch automatisch erstellt
werden können. Beginnen wir mit der Syntax:
> Eine Zeile besteht aus maximal 255 Zeichen.
> Ein Gegenschrägstrich ’\’ am Zeilenende bewirkt, dass die Zeile auch nach dem New-
line-Zeichen fortgeführt wird.
> Ein einzelner Punkt ’ . ’ dient als Abschnittsende.
> Es wird zwischen Groß- und Kleinschreibung unterschieden.
> Kommentare beginnen mit dem Prozentzeichen ’%’ und enden am Zeilenende.
> Leer- und Tabulatorzeichen werden ignoriert, außer in Ressourcen- und Datei-
namen.
> Ein optionaler Abschnitt, der alle Ressourcenkategorien auflistet, die in der Datei be-
schrieben werden. Jede Zeile beschreibt eine Kategorie. Die Liste wird mit einem
Punkt abgeschlossen. Die verfügbaren Ressourcenkategorien werden unten be-
schrieben.
> Ein Abschnitt für jede der Ressourcenkategorien, die am Dateianfang aufgeführt
wurden. Jeder Abschnitt beginnt mit einer Zeile für die Ressourcenkategorie, gefolgt
von einer beliebigen Anzahl von Zeilen, die die verfügbaren Ressourcen beschreiben.
Diese Liste wird durch eine Zeile mit einem einzelnen Punkt abgeschlossen. Jede Res-
sourcenzeile besteht aus dem Namen der Ressource (bei Gleichheitszeichen sind An-
führungszeichen erforderlich). Erfordert die Ressource einen Dateinamen, muss die-
ser nach einem Gleichheitszeichen angefügt werden. PDFlib berücksichtigt den
Parameter SearchPath (siehe unten) bei der Suche nach Dateien, deren Namen als
Ressourcen eingetragen sind.
> Auf den Systemen IBM iSeries wird die Ressourcenkategorie SearchPath mit folgen-
den Werten initialisiert:
/pdflib/6.0.3/fonts
/pdflib/6.0.3/bind/data
> Auf den Systemen IBM zSeries mit MVS wird die SearchPath-Funktion nicht unter-
stützt.
> Auf OpenVMS-Systemen können logische Namen als SearchPath übergeben werden.
UPR-Beispieldatei. Das folgende Listing zeigt ein Beispiel für eine UPR-Konfigurati-
onsdatei:
PS-Resources-1.0
SearchPath
/usr/local/lib/fonts
C:/psfonts/pfm
C:/psfonts
/users/kurt/my_images
.
FontAFM
Code-128=Code_128.afm
.
FontPFM
Corporate-Bold=corpb___.pfm
.
Mistral=c:/psfonts/pfm/mist____.pfm
.
FontOutline
Code-128=Code_128.pfa
ArialMT=Arial.ttf
.
Encoding
myencoding=myencoding.enc
58 Kapitel 3: PDFlib-Programmierung
.
ICCProfile
highspeedprinter=cmykhighspeed.icc
.
Kann diese Datei nicht gelesen werden, wird eine Exception ausgelöst.
> Unter Windows versucht PDFlib zudem, den Registry-Eintrag
HKLM\SOFTWARE\PDFlib\PDFlib\6.0.3\resourcefile
zu lesen. Der Wert dieses Eintrags (der bei der PDFlib-Installation erzeugt wird, aber
auch anders generiert werden kann) wird als Name der zu lesenden Ressourcendatei
verwendet. Kann diese Datei nicht gelesen werden, wird eine Exception ausgelöst.
> Durch explizites Setzen des Parameters resourcefile kann der Client PDFlib veranlas-
sen, eine Ressourcendatei zur Laufzeit einzulesen:
PDF_set_parameter(p, "resourcefile", "/path/to/pdflib.upr");
Dieser Aufruf kann beliebig oft wiederholt werden; die Ressourceneinträge werden
akkumuliert.
Konfiguration von Ressourcen zur Laufzeit. Statt mit einer UPR-Datei zu arbeiten, kön-
nen Sie einzelne Ressourcen auch direkt mit der Funktion PDF_set_parameter( ) im
Quellcode konfigurieren. Diese Funktion erhält einen Kategorienamen sowie den zuge-
hörenden Ressourceneintrag so, wie diese auch im entsprechenden Abschnitt in der
UPR-Datei erscheinen, zum Beispiel:
PDF_set_parameter(p, "FontAFM", "Foobar-Bold=foobb___.afm")
PDF_set_parameter(p, "FontOutline", "Foobar-Bold=foobb___.pfa")
Dies wird als »aktiver« Modus bezeichnet, da der Client aktiv entscheidet, wann der
Pufferinhalt abgeholt werden soll. Der aktive Modus ist in allen unterstützten Sprach-
bindungen verfügbar.
60 Kapitel 3: PDFlib-Programmierung
kombinieren lassen. Die EBCDIC-Variante von PDFlib ist für verschiedene Betriebssyste-
me und Rechnerarchitekturen verfügbar.
Um PDFlib-Funktionen auf EBCDIC-Systemen zu nutzen, müssen folgende Elemente
im EBCDIC-Format übergeben werden (genauer gesagt, in Codepage 037 auf iSeries und
Codepage 1047 auf zSeries):
> PFA-Fontdateien, UPR-Konfigurationsdateien, AFM-Metrikdateien
> Zeichensatz- und Codepagedateien
> String-Parameter für PDFlib-Funktionen
> Namen von Eingabe- und Ausgabedateien
> Umgebungsvariablen (sofern von der Laufzeitumgebung unterstützt)
> PDFlib-Fehlermeldungen werden ebenfalls im EBCDIC-Format erzeugt (außer in
Java).
Um Eingabedateien im ASCII-Format (PFA, UPR, AFM, Zeichensätze) zu verwenden, set-
zen Sie den Parameter asciifile auf true (Standardwert ist false). PDFlib erwartet diese Da-
teien dann im ASCII-Format. String-Parameter müssen aber nach wie vor in EBCDIC ko-
diert sein.
Im Gegensatz dazu müssen folgende Elemente immer binär behandelt werden (das
heißt, dass keinerlei Konvertierung durchgeführt werden darf):
> PDF-Eingabe und -Ausgabe-Dateien
> PFB-Fontdateien und PFM-Metrikdateien
> TrueType- und OpenType-Fontdateien
> Rasterbilddateien und ICC-Profile
Hinweis Importierte Dateien anderer Typen als PDF, etwa Fonts und Bilder, können die Grenze von 2 GB
nicht übersteigen. PDF-Ausgabedaten, die über die Schnittstelle PDF_get_buffer( ) abgeholt
werden, sind ebenfalls durch dieses Limit begrenzt. Beachten Sie schließlich noch, dass PDF-
Dateien generell nicht die Grenze von 1010 Byte übersteigen können, was ca. 9.3 GB entspricht.
Die erste Koordinate läuft nach rechts, die zweite nach oben. Das Standardkoordinaten-
system kann von PDFlib-Clientprogrammen durch Rotieren, Skalieren, Verschieben
oder Scheren modifiziert werden, so dass sich neue benutzerspezifische Koordinaten er-
geben. Für diese Transformationen werden die Funktionen PDF_rotate( ), PDF_scale( ),
PDF_translate( ) und PDF_skew( ) verwendet. Nach der Transformation müssen alle Koor-
dinaten in Grafik- und Textfunktionen an das neue Koordinatensystem angepasst
übergeben werden. Zu Beginn einer neuen Seite wird wieder auf das Standardkoordina-
tensystem umgestellt.
Nach diesem Aufruf interpretiert PDFlib alle Koordinaten (außer für Hypertext-Funkti-
onen, siehe unten) in Zentimeter, da 72/2.54 = 28.3465.
Da PDF nur Hypertextrechtecke unterstützt, deren Kanten parallel zum Seitenrand ver-
laufen, müssen die übergebenen Rechtecke modifiziert werden, wenn das Koordinaten-
system durch Skalierung, Rotation, Verschiebung oder Scherung transformiert wurde.
In diesem Fall berechnet PDFlib das kleinste umschließende Rechteck mit Kanten paral-
lel zum Seitenrand, transformiert es in Standardkoordinaten und verwendet das Ergeb-
nis statt der übergebenen Koordinaten.
Damit haben Sie die Möglichkeit, Seitenbeschreibungen sowie Hypertext-Elemente
in einem einzigen Koordinatensystem zu definieren, sofern Sie den Parameter
usercoordinates auf true gesetzt haben.
62 Kapitel 3: PDFlib-Programmierung
PDFlib-Entwicklung können Sie sich die Seite mit dem für Sie interessanten Format auf
eine durchsichtige Folie ausdrucken.
Acrobat 6/7 (nur die Vollversion, nicht der kostenlose Reader) verfügt ebenfalls über
ein nützliches Hilfsmittel. Mit dem Menübefehl Anzeige, Navigationsregisterkarten, Info
können Sie verschiedene Koordinaten anzeigen. Um die angezeigte Maßeinheit zu än-
dern, wählen Sie eine Einheit aus dem Menü Optionen. Alternativ dazu wählen Sie
Bearbeiten, Grundeinstellungen..., [Allgemein...], Einheiten und Hilfslinien, [oder Seiten-
einheiten] und selektieren Punkt, Millimeter, Zoll, Pica oder Zentimeter. Beachten Sie da-
bei, dass sich die angezeigten Koordinaten auf einen Ursprung in der linken oberen
Ecke der Seite beziehen und nicht, wie in PDF üblich, auf die linke untere Ecke.
Lassen Sie sich nicht von PDF-Ausdrucken mit scheinbar falschem Seitenformat irri-
tieren. Häufig hat das eine der folgenden Ursachen:
> Im Druckdialog von Acrobat wurde eine der Optionen Kleine Seiten auf Seitengröße
vergrößern oder Große Seiten auf Seitengröße verkleinern aktiviert, was zu einer Skalie-
rung des Ausdrucks führt.
> Nicht-PostScript-Druckertreiber können Objekte nicht immer in ihrer exakten Größe
drucken.
Drehen von Objekten. Es ist wichtig sich klarzumachen, dass Objekte nicht mehr ver-
ändert werden können, nachdem sie auf der Seite gezeichnet wurden. Es gibt zwar
PDFlib-Funktionen zum Drehen, Verschieben, Skalieren und Scheren des Koordinaten-
systems, diese wirken sich aber nicht auf bereits auf der Seite vorhandene Objekte aus,
sondern nur auf später gezeichnete. Mit der Option orientate für die Funktionen PDF_
fit_textline( ), PDF_fit_image( ) und PDF_fit_pdi_page( ) ist es problemlos möglich, Text,
Rasterbilder oder importierte PDF-Seiten um 90˚ oder ein Vielfaches davon zu drehen.
Drehungen um beliebige Winkel lassen sich mit den allgemeinen Funktionen zur
Koordinatentransformation bewerkstelligen. Das folgende Beispiel generiert erst ein
wenig horizontalen Text, dann wird das Koordinatensystem gedreht, um Text gedreht
auszugeben. Das Sichern und Wiederherstellen des Grafikkontexts (mit save/restore) er-
möglicht es, nach der Ausgabe des vertikalen Texts ohne weiteres wieder horizontalen
Text im ursprünglichen Koordinatensystem auszugeben:
PDF_set_text_pos(p, 50, 600);
PDF_show(p, "Dies ist horizontaler Text");
textx = PDF_get_value(p, "textx", 0); /* Textposition bestimmen */
texty = PDF_get_value(p, "texty", 0); /* Textposition bestimmen */
PDF_save(p);
PDF_translate(p, textx, texty); /* Ursprung an Textende verschieben */
PDF_rotate(p, 45); /* Koordinaten drehen */
PDF_set_text_pos(p, 18, 0); /* Abstand von horizontalem Text vorsehen */
PDF_show(p, "Gedrehter Text");
PDF_restore(p);
3.2 Seitenbeschreibungen 63
formationen aber auch die Textausgabe beeinflussen, sind weitere Aufrufe erforderlich,
damit der Text nicht gespiegelt erscheint.
Um den Einsatz von Top-Down-Koordinaten zu erleichtern, unterstützt PDFlib einen
besonderen Modus, in dem alle relevanten Koordinaten entsprechend anders interpre-
tiert werden: Statt des PDF-Standardkoordinatensystems mit dem Ursprung (0, 0) in der
linken unteren Ecke der Seite, in dem die y-Koordinaten von unten nach oben wachsen,
wird ein Koordinatensystem verwendet, dessen Ursprung in der linken oberen Ecke
liegt, wobei die y-Koordinaten nach unten hin größer werden. Dieses Top-Down-Koordi-
natensystem kann mit dem Parameter topdown aktiviert werden:
PDF_set_parameter(p, "topdown", "true")
Für jede Seite kann ein eigenes Koordinatensystem eingerichtet werden. Der Parameter
topdown darf aber nicht innerhalb einer Seitenbeschreibung (sondern nur zwischen den
Seiten) gesetzt werden. Die topdown-Funktionalität soll es PDFlib-Benutzern ermögli-
chen, auf einfache Art in einem Top-Down-Koordinatensystem zu arbeiten. Der Voll-
ständigkeit halber folgt eine detaillierte Aufstellung aller Elemente, bei denen sich
durch die Einrichtung eines Top-Down-Koordinatensystems Änderungen ergeben.
»Absolute« Koordinaten werden im Benutzerkoordinatensystem wie üblich und un-
verändert interpretiert:
> Alle Funktionsparameter, die in Funktionsbeschreibungen als »Koordinaten« be-
zeichnet werden. Zum Beispiel: x, y in PDF_moveto( ); x, y in PDF_circle( ), x, y (aber
nicht width und height!) in PDF_rect( ); llx, lly, urx, ury in PDF_create_annotation( )).
1. Weitere Informationen über ISO-Formate, japanische Formate und US-Standardformate finden Sie unter folgenden URLs:
home.inter.net/eds/paper/papersize.html, www.cl.cam.ac.uk/~mgk25/iso-paper.html
64 Kapitel 3: PDFlib-Programmierung
<format>.height, wobei <format> eines der in Tabelle 3.4 aufgeführten Formate bezeich-
net (Beispiel in Kleinbuchstaben: a4.width)
PDFlib verwendet keinen dieser Werte intern, sondern schreibt sie lediglich in die Aus-
gabedatei. Standardmäßig wird eine MediaBox entsprechend der für die Seite festgeleg-
ten Höhe und Breite, aber keiner der anderen Einträge erzeugt. Das folgende Codefrag-
ment beginnt eine neue Seite und setzt die vier Werte für die CropBox:
/* neue Seite mit selbstdefinierter CropBox beginnen */
PDF_begin_page_ext(p, 595, 842, "cropbox {10 10 500 800}");
Anzahl der Seiten im Dokument. In PDFlib gibt es keine Begrenzung für die Anzahl der
Seiten in einem Dokument. PDFlib generiert PDF-Strukturen, anhand derer Acrobat
auch Dokumente mit hunderten oder tausenden von Seiten effizient anzeigen kann.
3.2 Seitenbeschreibungen 65
Ausgabegenauigkeit und Koordinatenbereich. Die Genauigkeit numerischer Werte in
der PDFlib-Ausgabe wurde sehr sorgsam danach bemessen, den Anforderungen von
PDF und der unterstützten Umgebungen zu genügen und dabei gleichzeitig eine mög-
lichst geringe Dateigröße zu erzeugen. Wie in Tabelle 3.6 ausgeführt, hängt die Genauig-
keit von PDFlib von den absoluten Koordinatenwerten ab. Dieser Aspekt kann zwar sehr
häufig ignoriert werden, bei manchen anspruchsvollen Anwendungen ist jedoch darauf
zu achten, bei Skalierungsoperationen die PDF-inhärenten Koordinatengrenzen nicht
zu überschreiten.
3.2.3 Pfade
Ein Pfad ist eine Form, die aus einer beliebigen Anzahl von geraden Linien, Rechtecken
oder Kurven besteht. Er kann aus mehreren getrennten Abschnitten, so genannten Teil-
pfaden, bestehen. Auf einen Pfad können verschiedene Operationen angewandt werden
(siehe Abschnitt 8.4.6, »Zeichnen und Beschneiden von Pfaden«, Seite 280):
> Beim Stroking (Zeichnen) wird der Pfad selbst gezeichnet, wobei die vom Client über-
gebenen Zeichenparameter (etwa Farbe und Strichstärke) berücksichtigt werden.
> Beim Filling (Füllen) wird der gesamte vom Pfad eingeschlossene Bereich gezeichnet,
wobei die vom Client übergebenen Füllungsparameter berücksichtigt werden.
> Beim Clipping (Beschneiden) wird der Abbildungsbereich für nachfolgende Zeichen-
operationen verkleinert, indem der aktuelle Clipping-Bereich (standardmäßig die
ganze Seite) durch die Schnittmenge aus dem aktuellen Clipping-Bereich und dem
Pfad ersetzt wird.
> Wenn man den Pfad einfach beendet, ergibt das einen Pfad, der zwar in der PDF-
Datei vorhanden, aber unsichtbar ist. Dies wird aber nur selten genutzt.
Es führt zu einem Fehler, wenn Sie einen Pfad konstruieren, ohne eine der obigen Ope-
rationen auf ihn anzuwenden. Durch das System der Geltungsbereiche stellt PDFlib si-
cher, dass sich Clients an diese Einschränkung halten. Wenn Sie die Darstellungseigen-
schaften eines Pfades ändern möchten (zum Beispiel Farbe oder Strichstärke), so
müssen sie dies vor jeglichen Zeichenoperationen tun. Alle diesbezüglichen Regeln las-
sen sich zusammenfassen zu: »In einer Pfaddefinition darf die Darstellung nicht geän-
dert werden.«
Die bloße Konstruktion eines Pfads ist auf der Seite nicht wahrnehmbar; Sie müssen
den Pfad explizit zeichnen oder füllen, um sichtbare Ergebnisse zu erzielen:
PDF_moveto(p, 100, 100);
PDF_lineto(p, 200, 100);
PDF_stroke(p);
Die meisten Grafikfunktionen arbeiten mit dem Konzept eines aktuellen Punkts, den
man sich wie die momentane Stiftposition beim Zeichnen vorstellen kann.
66 Kapitel 3: PDFlib-Programmierung
3.2.4 Templates
Templates in PDF. PDFlib unterstützt ein PDF-Merkmal, das technisch »XObject vom
Typ Form« (form XObject) heißt. Da diese Bezeichnung jedoch leicht mit interaktiven
Formularen verwechselt werden kann, verwenden wir stattdessen die Bezeichnung
Templates. Ein PDFlib-Template kann man sich als Puffer außerhalb der Seite vorstellen,
in den Text, Vektorgrafiken und Rasterbilder umgelenkt werden (statt sich regulär auf
der Seite zu befinden). Nachdem das Template angelegt worden ist, kann es ähnlich ei-
nem Rasterbild verwendet und beliebig oft auf beliebigen Seiten platziert werden. Wie
Rasterbilder können Templates geometrisch transformiert, zum Beispiel skaliert oder
geschert werden. Wird ein Template auf mehreren Seiten (oder auf einer Seite mehr-
mals) verwendet, werden die PDF-Operatoren, die für die Konstruktion des Templates
zuständig sind, nur einmal in die PDF-Datei aufgenommen, was die Größe der Ausgabe-
datei entsprechend verringert. Templates eignen sich für Elemente, die wiederholt auf
mehreren Seiten auftreten, zum Beispiel ein feststehender Hintergrund, ein Firmenlo-
go oder grafische Elemente, die aus CAD-Software oder Software für Landkarten stam-
men. Templates werden zudem häufig für Schnitt- und Registermarken oder benutzer-
definierte asiatische Glyphen verwendet.
Einsatz von Templates mit PDFlib. Templates können nur außerhalb einer Seitenbe-
schreibung definiert, aber innerhalb einer Seitenbeschreibung verwendet werden. Temp-
lates können weitere Templates enthalten. Dabei gilt natürlich die Einschränkung, dass
ein Template nicht in seiner eigenen Definition verwendet werden darf. Um ein bereits
definiertes Template auf einer Seite zu referenzieren, verwenden Sie die Funktion PDF_
fit_image( ) genauso wie Sie Bilder auf der Seite platzieren (siehe Abschnitt 5.3, »Platzie-
ren von Bildern und importierten PDF-Seiten«, Seite 159). Das generelle Codefragment
hierfür sieht wie folgt aus:
/* Template definieren */
template = PDF_begin_template(p, template_width, template_height);
...mit Text-, Vektorgrafik- und Rasterbildfunktionen zeichnen...
PDF_end_template(p);
...
PDF_begin_page(p, page_width, page_height);
/* Template verwenden */
PDF_fit_image(p, template, (float) 0.0, (float) 0.0, "");
...weitere Zeichenoperationen...
PDF_end_page(p);
...
PDF_close_image(p, template);
Auf einem Template können alle Text-, Grafik- und Farbfunktionen benutzt werden.
Während der Konstruktion des Templates dürfen jedoch folgende Funktionen nicht
verwendet werden:
> Die Funktionen in Abschnitt 8.6, »Rasterbild- und Template-Funktionen«, Seite 294,
außer PDF_place_image( ), PDF_fit_image( ) und PDF_close_image( ). Dies stellt keine
große Einschränkung dar, da Rasterbilder außerhalb einer Template-Definition ge-
öffnet und innerhalb eines Templates frei verwendet (aber eben nicht geöffnet) wer-
den dürfen.
3.2 Seitenbeschreibungen 67
> Die Funktionen in Abschnitt 8.9, »Hypertext-Funktionen«, Seite 317. Hypertext-Ele-
mente müssen immer auf der Seite definiert werden, auf der sie im Dokument er-
scheinen sollen. Sie können nicht als Bestandteil eines Templates generiert werden.
68 Kapitel 3: PDFlib-Programmierung
3.3 Farbe
3.3.1 Farben und Farbräume
PDFlib-Clients können die Farben festlegen, die zum Zeichnen und Füllen von Pfaden
und Buchstaben verwendet werden sollen. Farben können in mehreren Farbräumen de-
finiert werden:
> Graustufen zwischen 0=schwarz und 1=weiß
> RGB-Tripel, das heißt drei Werte zwischen 0 und 1, die den Anteil von Rot, Grün und
Blau festlegen: (0, 0, 0)=schwarz, (1, 1, 1)=weiß
> Vier CMYK-Werte für Cyan, Magenta, Yellow (Gelb) und Black (Schwarz), zwischen
0=keine Farbe und 1=volle Farbe; (0, 0, 0, 0)=weiß, (0, 0, 0, 1)=schwarz; beachten Sie
den Unterschied zur RGB-Definition.
> Geräteunabhängige Farben im Farbraum CIE L*a*b* werden über einen Helligkeits-
wert (luminance) zwischen 0 und 100 und zwei Farbwerte zwischen -127 und 128 fest-
gelegt (siehe Abschnitt 3.3.4, »Colormanagement und ICC-Profile«, Seite 73).
> ICC-basierte Farben werden mittels eines ICC-Profils definiert (siehe Abschnitt 3.3.4,
»Colormanagement und ICC-Profile«, Seite 73).
> Schmuckfarbe (Separation-Farbraum): eine vordefinierte oder eine selbstdefinierte
Farbe beliebigen Namens mit einer alternativen Darstellung in einem der oben er-
wähnten Farbräume; sie wird generell für die Erstellung von Dokumenten verwen-
det, die auf einer Druckmaschine mit einer oder mehreren kundenspezifischen Far-
ben gedruckt werden sollen. Der Farbauftrag liegt zwischen 0=keine Farbe und
1=maximale Intensität der Schmuckfarbe. Eine Liste der Schmuckfarbnamen finden
Sie in Abschnitt 3.3.3, »Schmuckfarben«, Seite 70.
> Füllmuster: Kachelung mit einem Objekt, das aus beliebigem Text, Vektorgrafiken
oder Rasterbildern besteht (siehe Abschnitt 3.3.2, »Füllmuster und Farbverläufe«, Sei-
te 69)
> Farbverläufe liefern einen kontinuierlichen Übergang zwischen zwei Farben und ba-
sieren auf einem anderen Farbraum (siehe Abschnitt 3.3.2, »Füllmuster und Farbver-
läufe«, Seite 69).
> Der Index-Farbraum stellt an sich keinen eigenen Farbraum dar, sondern dient zur
effizienten Kodierung eines anderen Farbraums. Er wird automatisch erzeugt, wenn
ein indiziertes (auf einer Farbpalette basierendes) Bild importiert wird.
Füllmuster. Ein Füllmuster (Pattern) ist durch eine beliebige Anzahl von Operationen
zum Auftragen von Farbe definiert, die in einer einzigen Einheit zusammengefasst wer-
den. Diese Einheit kann auf ein beliebiges anderes Objekt angewandt werden, indem sie
wiederholt (oder gekachelt) über den gesamten zu füllenden Bereich oder zu zeichnen-
den Pfad aufgetragen wird. Die Arbeit mit Füllmustern umfasst folgende Schritte:
> Zuerst wird zwischen PDF_begin_pattern( ) und PDF_end_pattern( ) das Füllmuster de-
finiert. Dazu können die meisten Grafikoperatoren herangezogen werden.
3.3 Farbe 69
> Mit dem von PDF_begin_pattern( ) zurückgegebenen Füllmuster-Handle kann das
Füllmuster mit PDF_setcolor( ) zur aktuellen Farbe gemacht werden.
Abhängig vom Parameter painttype von PDF_begin_pattern( ) wird die Farbe des Füllmus-
ters festgelegt. Ist painttype gleich 1, muss die Füllmusterdefinition eine eigene Farbspe-
zifikation enthalten und sieht damit immer gleich aus; ist painttype gleich 2, darf die
Füllmusterdefinition keine eigene Farbspezifikation enthalten. Das Füllmuster wird
dann in der jeweils aktuellen Füll- oder Zeichenfarbe aufgetragen.
Hinweis Füllmuster können auch auf Basis eines Farbverlaufs definiert werden (siehe unten).
Farbverläufe werden als Übergang zwischen zwei Farben definiert. Die erste Farbe ent-
spricht immer der aktuellen Füllfarbe; die zweite Farbe wird in den Parametern c1, c2, c3
und c4 von PDF_shading( ) übergeben. Diese numerischen Werte werden im Farbraum
der ersten Farbe gemäß der Beschreibung von PDF_setcolor( ) interpretiert.
PDF_shading( ) gibt ein Handle auf ein Farbverlaufsobjekt zurück, das zu zwei Zwe-
cken verwendet werden kann:
> Füllen einer Fläche mit PDF_shfill( ). Dieses Verfahren kann verwendet werden, wenn
die Geometrie des zu füllenden Objekts der Geometrie des Farbverlaufs entspricht.
Trotz ihres Namens füllt diese Funktion nicht nur das Innere des Objekts, sondern
wirkt sich auch auf den Außenbereich aus. Dieses Verhalten kann mit PDF_clip( ) ge-
ändert werden.
> Definition eines Pattern für einen Farbverlauf zum Füllen komplexerer Objekte.
Dazu muss zunächst mit PDF_shading_pattern( ) ein Pattern erzeugt werden, das auf
dem Farbverlauf basiert. Mit diesem Pattern können dann beliebige Objekte gefüllt
oder gezeichnet werden.
3.3.3 Schmuckfarben
PDFlib unterstützt Schmuckfarben (spot color, in der PDF-Fachsprache als Separation-
Farbraum bezeichnet, obwohl der Ausdruck Separation im Allgemeinen auch für Pro-
zessfarben verwendet wird). Diese können zur Ausgabe von benutzerdefinierten Farben
verwendet werden, die außerhalb des Bereichs von Farbe liegen, die aus Prozessfarben
gemischt werden können. Schmuckfarben sind durch ihren Namen definiert und treten
in PDF immer gemeinsam mit einer Alternativfarbe auf, die der Schmuckfarbe mög-
lichst ähnlich ist. Die Alternativfarbe wird in Acrobat zur Bildschirmanzeige und zur
Ausgabe auf Geräten verwendet, die keine Schmuckfarben unterstützen (zum Beispiel
Bürodrucker). Auf der Druckmaschine wird die geforderte Schmuckfarbe zusätzlich zu
den im Dokument benutzten Prozessfarben angewandt. Dazu müssen die PDF-Dateien
einen weiteren Prozessschritt durchlaufen, die so genannte Farbseparation.
Hinweis Wenn in Acrobat 5 die Überdruckenvorschau aktiviert ist, werden manche Schmuckfarben
nicht korrekt angezeigt. Sie lassen sich aber korrekt separieren und drucken.
70 Kapitel 3: PDFlib-Programmierung
makespotcolor( ) angefordert, überprüft PDFlib zunächst, ob diese Schmuckfarbe in einer
der integrierten Bibliotheken verzeichnet ist. Ist dies der Fall, verwendet PDFlib inte-
grierte Werte für die Alternativfarbe. Anderenfalls wird von einer benutzerdefinierten
Schmuckfarbe ausgegangen und der Client muss geeignete Werte für die Alternativfar-
be liefern (über die aktuelle Farbe). Schmuckfarben können mit einem Farbauftrag, das
heißt mit einem Prozentwert zwischen 0 und 1 versehen werden.
Standardmäßig können integrierte Schmuckfarben nicht mit benutzerdefinierten
Alternativfarben umdefiniert werden. Dieses Verhalten lässt sich mit dem Parameter
spotcolorlookup ändern, etwa um die Kompatibilität zu älteren Anwendungen zu ge-
währleisten, die andere Farbdefinitionen verwenden, oder um Workflows zu unterstüt-
zen, die mit den von PDFlib erzeugten Lab-Alternativfarben für Pantone-Farben nicht
zurechtkommen.
PDFlib generiert für integrierte Schmuckfarben automatisch geeignete Alternativ-
farben, sofern eine der PDF/X-Kompatibilitätsstufen gewählt wurde (siehe Abschnitt
7.4, »PDF/X«, Seite 201). Bei benutzerdefinierten Schmuckfarben liegt es in der Verant-
wortung des Benutzers, zur gewählten PDF/X-Kompatibilitätsstufe passende Alterna-
tivfarben bereitzustellen.
Hinweis Die Daten für integrierte Schmuckfarben und die zugehörigen Markenzeichen wurden von den
jeweiligen Inhabern für den Einsatz in der PDFlib-Software lizenziert.
3.3 Farbe 71
PANTONE <Id> <Papiersorte>
wobei <Id> die Farbe (zum Beispiel 185) bezeichnet und <Papiersorte> die englische Ab-
kürzung für die verwendete Papiersorte ist (zum Beispiel C für coated, das heißt be-
schichtet). Die Namensbestandteile werden durch jeweils ein einzelnes Leerzeichen ge-
trennt. Wenn Sie eine Schmuckfarbe abrufen, deren Name zwar mit dem Präfix
PANTONE beginnt, aber keine existierende PANTONE-Farbe bezeichnet, so führt dies zu
einer nicht-fatalen Exception (Sie können dieses Verhalten deaktivieren, indem Sie den
Parameter warning auf false setzen). Das folgende Codefragment zeigt den Einsatz einer
PANTONE-Farbe mit einem Farbauftrag von 70 Prozent:
Hinweis Die hier angezeigten PANTONE®-Farben stimmen nicht unbedingt mit den PANTONE-Stan-
dards überein. Die genaue Farbe können Sie in den PANTONE-Farbtafeln nachschlagen.
PANTONE® und andere Warenzeichen von Pantone, Inc. sind Eigentum von Pantone, Inc. ©
Pantone, Inc., 2003.
Hinweis PANTONE®-Farben werden gegenwärtig nicht in den Modi PDF/X-1:2001, PDF/X-1a:2001 und
PDF/X-1a:2003 unterstützt.
wobei <Id> die Farbe (zum Beispiel 43) bezeichnet und <Papiersorte> die Abkürzung für
die verwendete Papiersorte ist (zum Beispiel N für Naturpapier). Die Namensbestandtei-
le HKS, <Id> und <Papiersorte> werden jeweils durch ein einzelnes Leerzeichen getrennt.
Wenn Sie eine Schmuckfarbe abrufen, deren Name zwar mit dem Präfix HKS beginnt,
aber keine existierende HKS-Farbe bezeichnet, so führt dies zu einer nicht-fatalen Ex-
ception (Sie können dieses Verhalten deaktivieren, indem Sie den Parameter warning
auf false setzen). Das folgende Codefragment zeigt den Einsatz einer HKS-Farbe mit ei-
nem Farbauftrag von 70 Prozent:
72 Kapitel 3: PDFlib-Programmierung
spot = PDF_makespotcolor(p, "HKS 38 E", 0);
PDF_setcolor(p, "fill", "spot", spot, 0.7, 0, 0);
3.3 Farbe 73
Tabelle 3.7 Rendering-Intents
Rendering-Intent Erklärung üblicher Einsatz
RelativeColorimetric Die Farbdaten werden in den Gamut des Geräts (Farbum- Vektorgrafiken
fang) hineinskaliert, wobei die Weißpunkte aufeinander
abgebildet werden und sich die Farben leicht verschieben.
Saturation Die Farbsättigung bleibt erhalten, wobei sich die Farbwerte Geschäftsgrafiken
verschieben können.
Perceptual Die Farbverhältnisse bleiben erhalten, wobei sowohl die eingescannte Bilder
innerhalb als auch die außerhalb des Gamuts liegenden
Farben modifiziert werden, um ein gefälliges Aussehen zu
erzielen.
ICC-Profile. Das International Color Consortium (ICC)1 definierte ein Dateiformat zur
Festlegung von Farbeigenschaften von Eingabe- und Ausgabegeräten. Diese so genann-
ten ICC-Farbprofile gelten als Industriestandard und werden von allen wichtigen Her-
stellern von Colormanagementsystemen und -anwendungen unterstützt. PDFlib unter-
stützt Colormanagement mit ICC-Profilen in folgenden Bereichen:
> Definition von ICC-basierten Farbräumen für Text und Vektorgrafik auf der Seite
> Verarbeitung von ICC-Profilen, die in importierten Bilddateien eingebettet sind
> Anwendung eines ICC-Profils auf ein importiertes Bild (wobei ein in das Bild einge-
bettetes ICC-Profil unter Umständen überschrieben wird)
> Definition von Standardfarbräumen (default color space) zur Abbildung von Graustu-
fen-, RGB- oder CMYK-Daten auf ICC-basierte Farbräume
> Definition einer Druckausgabebedingung für PDF/X mittels eines externen ICC-
Profils.
Colormanagement ändert die Anzahl der Komponenten in einer Farbspezifikation
nicht (zum Beispiel von RGB nach CMYK).
Suche nach ICC-Profilen. PDFlib sucht ICC-Profile in folgenden Schritten, wobei der an
PDF_load_iccprofile( ) übergebene Parameter profilename benutzt wird:
> Ist profilename = sRGB, verwendet PDFlib das interne sRGB-Profil (siehe unten) und
beendet die Suche.
> Es wird überprüft, ob sich in der Ressourcenkategorie ICCProfile eine Ressource na-
mens profilename befindet. Ist dies der Fall, wird ihr Wert in den folgenden Schritten
als Dateiname verwendet. Ist diese Ressource nicht vorhanden, wird profilename
selbst als Dateiname verwendet.
> Anhand des im vorigen Schritt ermittelten Dateinamens wird auf der Festplatte
nach einer Datei gesucht, wobei nacheinander folgende Kombinationen durchpro-
biert werden:
<dateiname>
<dateiname>.icc
<dateiname>.icm
<colordir>/<dateiname>
<colordir>/<dateiname>.icc
<colordir>/<dateiname>.icm
1. Siehe www.color.org
74 Kapitel 3: PDFlib-Programmierung
Unter Windows 2000/XP bezeichnet colordir das Verzeichnis, in dem das Betriebssys-
tem gerätespezifische ICC-Profile ablegt (normalerweise C:\WINNT\system32\spool\
drivers\color). Auf Mac OS X werden für colordir folgende Pfade ausprobiert:
/System/Library/ColorSync/Profiles
/Library/ColorSync/Profiles
/Network/Library/ColorSync/Profiles
~/Library/ColorSync/Profiles
Der Farbraum sRGB und das ICC-Profil sRGB. PDFlib unterstützt den zum Industrie-
standard gewordenen RGB-Farbraum sRGB (exakt ausgedrückt: IEC 61966-2-1). sRGB
wird von verschiedensten Software- und Hardware-Herstellern unterstützt und findet
breiten Einsatz bei einfachem Colormanagement für Endbenutzer-Geräte wie digitale
Kameras oder Bürogeräte wie Farbdrucker oder Bildschirme. PDFlib unterstützt den
Farbraum sRGB und hält die erforderlichen ICC-Profildaten intern vor. Das sRGB-Profil
steht damit ohne Zusatzkonfiguration immer zur Verfügung und muss deshalb nicht
explizit vom Client konfiguriert werden. Es kann mit PDF_load_iccprofile( ) und
profilename = sRGB angefordert werden.
Anwendung externer ICC-Profile auf Rasterbilder (Taggen). Neben den in Bilder einge-
betteten ICC-Profilen kann ein externes Profil auf ein Rasterbild angewandt werden, in-
dem ein Profil-Handle sowie die Option iccprofile an PDF_load_image( ) übergeben wird.
3.3 Farbe 75
ICC-basierte Farbräume für Seitenbeschreibungen. Die Farbwerte für Text und Vektor-
grafik können direkt in dem durch ein Profil definierten ICC-basierten Farbraum festge-
legt werden. Dazu wird zunächst der Farbraum spezifiziert, indem das ICC-Profil-Handle
einem der Parameter setcolor:iccprofilegray, setcolor:iccprofilergb oder setcolor:iccprofile-
cmyk als Wert zugewiesen wird. Dann können ICC-basierte Farbwerte gemeinsam mit ei-
nem der Farbraum-Schlüsselwörter iccbasedgray, iccbasedrgb und iccbasedcmyk an PDF_
setcolor( ) übergeben werden:
icchandle = PDF_load_iccprofile(...)
if (icchandle == -1) {
return;
}
PDF_set_value(p, "setcolor:iccprofilecmyk", icchandle);
PDF_setcolor(p, "fill", "iccbasedcmyk", 0, 1, 0, 0);
Abbildung von Gerätefarben auf ICC-basierte Standardfarbräume. PDF bietet eine Me-
thode, um in einer Seitenbeschreibung vorliegende geräteabhängige Graustufen-, RGB-
und CMYK-Farben auf geräteunabhängige Farben abzubilden. Damit lassen sich Farb-
werte, die sonst geräteabhängig wären, mit einer kolorimetrisch exakten Farbspezifika-
tion versehen. Eine solche Abbildung von Farbwerten wird durch Bereitstellung der
Farbraumdefinitionen DefaultGray, DefaultRGB und DefaultCMYK erreicht. In PDFlib wird
dazu einer der Parameter defaultgray, defaultrgb und defaultcmyk gesetzt und ihm als
Wert ein ICC-Profil-Handle zugewiesen. Die folgenden Beispiele definieren den Farb-
raum sRGB als RGB-Standardfarbraum für Text, Rasterbilder und Vektorgrafik:
icchandle = PDF_load_iccprofile(p, "sRGB", 0, "usage=iccbased");
if (icchandle == -1) {
return;
}
PDF_set_value(p, "defaultrgb", icchandle);
76 Kapitel 3: PDFlib-Programmierung
3.4 Hypertext-Elemente
3.4.1 Beispiele zur Erstellung von Hypertext-Elementen
Dieser Abschnitt zeigt die Vorgehensweise beim Erstellen von Hypertext-Elementen
wie Lesezeichen, Formularfelder oder Anmerkungen. Abbildung 3.2 zeigt das Ergebnis-
dokument mit allen Hypertext-Elementen, die wir in diesem Abschnitt erzeugen wer-
den. Das Dokument enthält folgende Hypertext-Elemente:
> Im Dokumentfenster rechts oben befindet sich über dem Text www.pdflib.com ein
unsichtbarer Weblink. Wenn Sie in diesen Bereich klicken, wird die zugehörige Web-
Seite geöffnet.
> Unmittelbar darunter liegt ein grau hinterlegtes Formular-Textfeld, das automa-
tisch (per JavaScript) mit dem aktuellen Datum gefüllt wird.
> Die rote Reißzwecke beinhaltet eine Anmerkung mit Dateianhang. Durch Anklicken
lässt sich die angehängte Datei öffnen.
> Unten links gibt es eine Formularfeld-Schaltfläche mit einem Druckersymbol. Wenn
Sie auf diese Schaltfläche klicken, wird der Acrobat-Menübefehl Datei, Drucken ausge-
führt.
> Im Navigationsfenster befindet sich das Lesezeichen »Our Paper Planes Catalog«.
Wenn Sie auf dieses Lesezeichen klicken, wird die Seite eines anderen PDF-Doku-
ments angezeigt.
Im Folgenden wird gezeigt, wie Sie diese Hypertext-Elemente mit PDFlib generieren.
Verknüpfung auf eine Web-Seite. Zunächst erzeugen wir eine Verknüpfung auf die
Web-Seite www.pdflib.com. Dies geschieht in zwei Schritten. Zuerst legen wir eine Aktion
vom Typ URI (in Acrobat: Web-Verknüpfung öffnen) an. Dabei wird ein Aktions-Handle er-
stellt, das wir im folgenden einem oder auch verschiedenen Hypertext-Elementen zu-
weisen können.
web_action = PDF_create_action(p, "URI", "url http://www.pdflib.com");
Im zweiten Schritt generieren wir die eigentliche Verknüpfung. Eine Verknüpfung ist in
PDF eine Anmerkung (Annotation) vom Typ Link. Dem Link übergeben wir in der Option
action das Ereignis activate, bei dem die Aktion ausgeführt werden soll, sowie unser
oben erstelltes Handle web_action für die auszuführende Aktion.
Abb. 3.2
Dokument mit Hypertext-
Elementen
3.4 Hypertext-Elemente 77
sprintf(optlist, "linewidth=0 action {activate %d}", web_action);
PDF_create_annotation (p, left_x, left_y, right_x, right_y, "Link", optlist);
Um den Link wird standardmäßig ein schmaler schwarzer Rahmen gezogen. Das mag
am Anfang zur genauen Positionierung nützlich sein, wir blenden den Rand aber mit
linewidth=0 aus.
Alternativ dazu können Sie die Textausgabe und den Link in nur einem Aufruf von
PDF_fit_textline( ) mit der Option weblink wie folgt erzeugen:
PDF_fit_textline(p, "http://www.pdflib.com", x, y, "position=50 underline"
"weblink {linewidth=1 annotcolor={rgb 1 0 0 }} fillcolor={rgb 0 0 1}");
Lesezeichen mit Sprung in eine andere Datei. Nun werden wir das Lesezeichen »Our
Paper Planes Catalog« erstellen, das auf eine andere PDF-Datei verweist, und zwar auf
den Papierfliegerkatalog paper_planes_catalog.pdf. Wir erzeugen zunächst eine Aktion
vom Typ GoToR. In der Optionsliste zu dieser Aktion definieren wir mit filename den Na-
men des Zieldokuments und mit der Option destination, dass ein bestimmter Seitenaus-
schnitt deutlich vergrößert angezeigt wird. Genauer gesagt soll das Dokument auf der
zweiten Seite (page 2) in definierter Darstellung (type fixed) mit der Seitenmitte im sicht-
baren Bereich (left 50 top 200) und in einer Vergrößerung von 200% (zoom 2) angezeigt
werden.
char optlist[256] =
"filename paper_planes_catalog.pdf "
"destination {page 2 type fixed left 50 top 200 zoom 2}"
Im nächsten Schritt erstellen wir das eigentliche Lesezeichen (Bookmark). Dem Lesezei-
chen übergeben wir in der Option action das Ereignis activate, bei dem die Aktion ausge-
führt werden soll, sowie unser oben erstelltes Handle goto_action für die auszuführende
Aktion. Mit der Option fontstyle bold legen wir Fettschrift fest und mit textcolor {rgb 0 0 1}
färben wir das Lesezeichen blau ein. Als Funktionsparameter übergeben wir den anzu-
zeigenden Lesezeichentext »Our Paper Planes Catalog«.
sprintf(optlist, "action {activate %d} fontstyle bold textcolor {rgb 0 0 1}",
goto_action);
Beim Anklicken des Lesezeichens wird der definierte Seitenausschnitt des Zieldoku-
ments angezeigt.
Anmerkung mit Dateianhang. Als nächstes Beispiel erstellen wir eine Anmerkung mit
einem Dateianhang. Dazu erzeugen wir eine Anmerkung vom Typ FileAttachment. Mit
der Option filename übergeben wir die anzuhängende Datei und sowie mit mimetype
image/gif den Typ der Datei (MIME ist eine verbreitete Konvention zur Typisierung von
Dateien). Die Anmerkung erscheint als Reißzwecke (iconname pushpin) in rot (annotcolor
{rgb 1 0 0}) und verfügt über einen Tooltip (contents {Get the Kraxi Paper Plane!}). Sie wird
nicht gedruckt (display noprint).
char optlist[256] =
"filename kraxi_logo.gif mimetype image/gif iconname pushpin "
78 Kapitel 3: PDFlib-Programmierung
"annotcolor {rgb 1 0 0} contents {Get the Kraxi Paper Plane!} display noprint"
Beachten Sie dabei, dass die Größe des mit iconname definierten Symbols nicht variabel
ist. Es wird in seiner Standardgröße in die linke obere Ecke des übergebenen Rechtecks
platziert.
Der Formularschaltfläche übergeben wir in der Option action das Ereignis up (in Acro-
bat: Maustaste loslassen), bei dem die Aktion ausgeführt werden soll, sowie unser oben
erstelltes Handle print_action für die auszuführende Aktion. Mit backgroundcolor {rgb 1 1
0} legen wir als Hintergrundfarbe Gelb fest und mit bordercolor {rgb 0 0 0} definieren wir
einen schwarzen Rand. Mit caption Print beschriften wir die Schaltfläche mit dem Text
Print, und mit tooltip {Print the document} legen wir einen Hilfstext fest. Mit font schließ-
lich legen wir die Schriftart anhand des oben erzeugten Handles button_font fest. Die
Größe der Beschriftung wird standardmäßig so angepasst, dass diese vollständig auf
der Schaltfläche Platz hat. Danach wird das eigentliche Feld mit seinen Koordinaten,
dem Namen print_button, dem Typ pushbutton sowie seinen Optionen erstellt.
sprintf(optlist, "action {up %d} backgroundcolor {rgb 1 1 0} bordercolor {rgb 0 0 0} "
"caption Print tooltip {Print the document} font %d",
print_action, button_font);
Im Folgenden erweitern wir die erste Variante des Beispiels, indem wir den Text Print
auf der Schaltfläche durch ein Druckersymbol ersetzen. Dazu müssen wir die entspre-
chende Bilddatei print_icon.jpg bereits vor dem Anlegen der Seite als Template laden.
Mit der Option icon weisen wir der Schaltfläche das oben erstellte Template-Handle
print_icon zu. Dann erzeugen wir wie oben die Formularschaltfläche:
print_icon = PDF_load_image(p, "auto", "print_icon.jpg", "template");
if (print_icon == -1)
{
/* Fehlerbehandlung */
return;
}
PDF_begin_page_ext(p, pagewidth, pageheight, "");
...
sprintf(optlist, "action {up %d} icon %d tooltip {Print the document} font %d",
print_action, print_icon, button_font);
3.4 Hypertext-Elemente 79
Einfaches Formulartextfeld. Als nächstes steht die Erstellung des Textfelds an, das sich
in unserem Dokument rechts oben befindet und zur Datumseingabe dienen soll. Dazu
besorgen wir uns ein Font-Handle und legen dann das Formularfeld an. Es erhält den
Namen date, ist vom Typ textfield und wird grau hinterlegt.
textfield_font = PDF_load_font(p, "Helvetica-Bold", "winansi", "");
sprintf(optlist, "backgroundcolor {gray 0.8} font %d", textfield_font);
PDF_create_field(p, left_x, left_y, right_x, right_y, "date", 0, "textfield", optlist);
Die Schriftgröße eines Textfelds ist standardmäßig auf auto gesetzt. Wenn Sie Text ein-
geben, wird dieser zunächst in der Feldgröße angezeigt. Erreicht er das Feldende, wird er
automatisch verkleinert, so dass er immer vollständig im Feld sichtbar ist.
Im zweiten Schritt legen wir die Seite an. In der Optionsliste zu dieser Seite definieren
wir mit action, dass die oben definierte Aktion show_date durch das Ereignis open (in
Acrobat: Seite öffnen) ausgelöst wird.
sprintf(optlist, "action {open %d}", show_date);
PDF_begin_page_ext(p, pagewidth, pageheight, optlist);
Im letzten Schritt legen wir das Formular-Textfeld wie oben an. Das aktuelle Datum
wird dann bei jedem Öffnen der Seite automatisch in das Feld mit dem Namen date ein-
getragen:
textfield_font = PDF_load_font(p, "Helvetica-Bold", "winansi", "");
sprintf(optlist, "backgroundcolor {gray 0.8} font %d", textfield_font);
PDF_create_field(p, left_x, left_y, right_x, right_y, "date", 0, "textfield", optlist);
80 Kapitel 3: PDFlib-Programmierung
Um ein Textfeld zu formatieren, werden ihm JavaScript-Codefragemente als
keystroke- und format-Aktionen mitgegeben. Der JavaScript-Code ruft eine interne Acro-
bat-Funktion auf, deren Parameter die Formatierung im einzelnen steuern.
Das folgende Beispiel erstellt die beiden Aktionen keystroke und format und ordnet
sie einem Formularfeld zu. Der Feldinhalt wird dabei mit zwei Dezimalstellen und dem
Währungssymbol EUR formatiert:
keystroke_action = PDF_create_action(p, "JavaScript",
"script {AFNumber_Keystroke(2, 0, 3, 0, \"EUR \", true); }");
3.4 Hypertext-Elemente 81
Tabelle 3.9 Parameter für die JavaScript-Formatierungsfunktionen
Parameter Mögliche Werte
cFormat Datumsformatstring. Er kann die folgenden Platzhalter sowie die für tFormat angeführten
Zeitformate enthalten:
d Tag des Monats
dd Tag des Monats mit führender Null
ddd Abkürzung für den Wochentag
m Monat als Zahl
mm Monat als Zahl mit führender Null
mmm Abkürzung für den Monatsnamen
mmmm vollständiger Monatsname
yyyy Jahr mit vier Ziffern
yy Jahr mit den beiden letzten Ziffern
tFormat Zeitformatstring. Er kann die folgenden Platzhalter enthalten:
h Stunde (0-12)
hh Stunde mit führender Null (0-12)
H Stunde (0-24)
HH Stunde mit führender Null (0-24)
M Minuten
MM Minuten mit führender Null
s Sekunden
ss Sekunden mit führender Null
t 'a' oder 'p'
tt 'am' oder 'pm'
psf Beschreibt weitere Formate:
0 Zipcode
1 Zipcode + 4
2 Telefonnummer
3 Sozialversicherungsnummer
Formularfelder aktivieren das Dirty-Flag des Dokuments. Beim Schließen eines PDF-
Dokuments mit Formularfeldern in Acrobat werden Sie gefragt, ob Sie die Datei spei-
chern möchten. Dies geschieht auch dann, wenn Sie keinerlei Änderungen vorgenom-
men haben. Technisch ausgedrückt wird beim Öffnen eines von PDFlib generierten
PDFs das Dirty-Flag des Dokuments gesetzt, so dass es von Acrobat als geändert angese-
hen wird. Dies spielt zwar meist keine Rolle, da das Formular ja in der Regel ausgefüllt
werden soll. Für Benutzer, die es trotzdem als störend empfinden, kann mit einem kur-
zen JavaScript Abhilfe geschaffen werden, das das Dirty-Flag des Dokuments nach dem
Laden der Datei zurücksetzt. Da zu verwenden Sie folgende Sequenz:
/* ...Formularfelder werden erstellt... */
PDF_create_field(p, "100, 500, 300, 600, "field1", "textfield", "..."
82 Kapitel 3: PDFlib-Programmierung
4 Textausgabe
4.1 Übersicht über Schriften und Zeichensätze
Die Behandlung von Schriften ist einer der komplexesten Aspekte von Seitenbeschrei-
bungen und Dokumentformaten wie PDF. In diesem Kapitel fassen wir die wichtigsten
Merkmale der Schrift- und Zeichensatzbehandlung von PDFlib zusammen. Der Begriff
»Zeichensatz« bezieht sich dabei auf die Zuordnung von einzelnen Bytes oder Bytekom-
binationen zu den Zeichen, die sie tatsächlich darstellen. Sofern nicht anderweitig ange-
geben, unterstützt PDFlib die jeweils beschriebenen Fontformate auf allen Plattfor-
men.1
OpenType-Fonts. OpenType ist ein modernes Fontformat, das PostScript- und TrueTy-
pe in sich vereint und außerdem plattformunabhängig ist. Es gibt zwei Varianten von
OpenType, die beide von PDFlib unterstützt werden:
> OpenType-Fonts mit TrueType-Zeichenbeschreibungen (*.ttf) werden wie gewöhnli-
che TrueType-Fonts behandelt.
> OpenType-Fonts mit PostScript-Zeichenbeschreibungen (*.otf) enthalten PostScript-
Daten in einem TrueType-ähnlichen Dateiformat. Diese Variante wird auch CFF
(Compact Font Format) genannt.
1. Die Begriffe Schrift und Font sowie Zeichensatz und Encoding werden jeweils synonym verwendet.
4.1.2 Zeichensätze
Ein Zeichensatz (Encoding) definiert, wie die in einem String enthaltenen Bytes von
PDFlib oder Acrobat interpretiert und in Text auf der Seite umgesetzt werden. PDFlib
unterstützt zahlreiche Encoding-Verfahren.
Alle unterstützten Zeichensätze lassen sich in einem Dokument beliebig kombinie-
ren. Im Prinzip können sogar verschiedene Zeichensätze für eine einzige Schrift ver-
wendet werden, was jedoch nur selten von Interesse sein dürfte.
Hinweis Für einen bestimmte Font können nicht unbedingt alle Zeichensätze verwendet werden. Der
Benutzer muss deshalb sicherstellen, dass der Font alle Zeichen enthält, die vom jeweiligen Zei-
chensatz benötigt werden. Dieses Problem kann auch bei den Acrobat-Standardfonts auftreten
(siehe Tabelle 4.2).
Diese Konzepte treten durchaus auch kombiniert auf. So können TrueType-Fonts aus
Kompatibilitätsgründen eine Hilfstabelle mit PostScript-Glyphennamen enthalten. Au-
ßerdem bietet die Adobe Glyph List (AGL) Unicode-Werte für viele Standard-PostScript-
Glyphennamen. PDFlib unterstützt alle der drei oben genannten Verfahren (Glyphen-
namen, Unicode, CID).
84 Kapitel 4: Textausgabe
8-Bit-Zeichensätze. 8-Bit-Zeichensätze (auch Ein-Byte-Zeichensätze genannt) ordnen
jedes Byte eines Textstrings einem Zeichen zu und sind damit auf maximal 256 Zeichen
beschränkt. Die in PDFlib verwendeten 8-Bit-Zeichensätze basieren auf Glyphennamen
oder Unicode-Werten und können aus verschiedenen Quellen stammen:
> Vordefinierte Zeichensätze, von denen eine große Auswahl zur Verfügung steht (sie-
he Tabelle 4.2). Diese umfassen die wichtigsten Zeichensätze, die gegenwärtig auf
verschiedensten Systemen und in unterschiedlichsten Sprachräumen im Einsatz
sind.
> Benutzerdefinierte Zeichensätze, die in einer externen Datei bereitgestellt oder zur
Laufzeit dynamisch mit PDF_encoding_set_char( ) zusammengestellt werden. Diese
Zeichensätze können auf Glyphennamen oder Unicode-Werten basieren.
> Zeichensätze, die vom Betriebssystem bezogen werden. Diese so genannten System-
zeichensätze werden nur auf Windows und den Systemen IBM eServer iSeries und
zSeries unterstützt.
> Abgekürzte Unicode-Zeichensätze, die zur bequemen Adressierung eines beliebigen
Unicode-Bereichs von 256 aufeinanderfolgenden Zeichen mit 8-Bit-Werten verwen-
det werden kann.
> Zeichensätze, die sich auf eine spezielle Schrift beziehen. Diese werden auch schrift-
spezifische Zeichensätze oder builtin encodings genannt.
4.1.3 Unicode-Unterstützung
Unicode stellt einen riesigen Zeichensatz dar, der alle gegenwärtigen und viele früher
gebräuchlichen Sprachen und Schriften der Welt abdeckt und in vielen Anwendungen,
Betriebssystemen und Programmiersprachen starke Unterstützung erfährt. PDFlib bie-
tet umfangreiche Unicode-Unterstützung. Dies bedeutet im Einzelnen:
> In Seitenbeschreibungen kann Unicode direkt übergeben werden.
> Unicode kann für verschiedene Hypertext-Elemente übergeben werden.
86 Kapitel 4: Textausgabe
4.2 Fontformate im Detail
4.2.1 Unterstützung von Systemschriften auf Windows und Mac
Auf Mac- und Windows-Systemen hat PDFlib Zugriff auf alle TrueType-, OpenType- und
PostScript-Schriften, die im Betriebssystem installiert sind. Wir bezeichnen solche
Schriften als Systemschriften (host fonts). Statt die Schriftdateien manuell zu konfigu-
rieren, werden sie einfach im System installiert (meist durch bloßes Kopieren in das
entsprechende Verzeichnis), und schon stehen sie PDFlib zur Verfügung.
Bei Systemschriften ist unbedingt auf den korrekten Schriftnamen einschließlich
Groß- und Kleinschreibung zu achten. Da die Namen von entscheidender Bedeutung
sind, werden im folgenden Methoden zur Ermittlung der richtigen Schriftnamen be-
schrieben. Weitere Informationen finden Sie in Abschnitt 4.2.2, »PostScript-Fonts«, Seite
88 und Abschnitt 4.2.3, »TrueType- und OpenType-Fonts«, Seite 89.
Ermitteln von Systemschriftnamen auf dem Mac. Mit dem Hilfsprogramm Font Book,
das mit Mac OS X ausgeliefert wird, können Sie die Namen installierter Systemschriften
ermitteln. Es gibt jedoch Fälle, in denen Font Book nicht den korrekten QuickDraw-Na-
men anzeigt, so wie der von PDFlib benötigt wird. Wir empfehlen daher Apples frei ver-
fügbare Font Tools,2 eine Sammlung von Befehlszeilen-Programmen inklusive des Pro-
gramms ftxinstalledfonts zur Bestimmung der QuickDraw-Namen aller installierten
Fonts. Um den von PDFlib erwarteten Namen zu ermitteln, installieren Sie Font Tools
und führen in einem Terminalfenster den folgenden Befehl aus:
ftxinstalledfonts -q
Mögliche Probleme beim Zugriff auf Systemschriften unter Windows. Wir möchten
Anwender auf ein potentielles Problem bei der Fontinstallation auf Windows-Systemen
aufmerksam machen. Wenn Sie Schriften über den Menübefehl Datei, Neue Schriftart
installieren... installieren (statt sie direkt in das Windows-Fonts-Verzeichnis zu ziehen),
erscheint die Checkbox Schriftarten in den Ordner "Fonts" kopieren. Ist diese Box nicht se-
1. Siehe www.microsoft.com/typography/property/TrueTypeProperty21.mspx
2. Siehe developer.apple.com/fonts/OSXTools.html
Mögliche Probleme beim Zugriff auf Systemschriften auf dem Mac. Beim Testen ha-
ben wir festgestellt, dass neu installierte Schriften für GUI-lose Anwendungen wie PDF-
lib manchmal erst zugreifbar sind, wenn der Benutzer sichvom System ab- und wieder
anmeldet.
4.2.2 PostScript-Fonts
Formate für PostScript-Fontdateien. PostScript-Type-1-Fonts bestehen aus zwei Teilen:
der eigentlichen Zeichenbeschreibung und den Metrikdaten. PDFlib unterstützt auf al-
len Systemen folgende Formate für PostScript-Type-1-Zeichenbeschreibungen und -Me-
trikdaten:
> Das plattformunabhängige Format AFM (Adobe Font Metrics) und das Windows-spe-
zifische Format PFM (Printer Font Metrics) für Fontmetrikdaten.
Während sich auf AFM basierende Fontmetriken in jeden von der Schrift unterstütz-
ten Zeichensatz umsortieren lassen, können übliche PFM-Dateien für westliche
Fonts (Codepage 1252) nur mit folgenden Zeichensätzen verwendet werden: auto,
winansi, iso8859-1, unicode, ebcdic. PFM-Dateien für Symbolfonts sind mit dem Zei-
chensatz builtin einsetzbar. PFM-Dateien für andere Codepages lassen sich mit einem
Zeichensatz benutzen, der zur Codepage in der PFM (oder einer Teilmenge) passt, mit
dem Zeichensatz builtin zur Verwendung der PFM-internen Codepage oder mit
unicode. Die PFM für einen kyrillischen Font ist zum Beispiel mit den Zeichensätzen
cp1250, builtin und unicode einsetzbar.
> Das plattformunabhängige Format PFA (Printer Font ASCII) und das Windows-spezifi-
sche Format PFB (Printer Font Binary) für Zeichenbeschreibungen im PostScript-Type-
1-Format (manchmal auch »ATM-Fonts« genannt).
> Auf dem Mac werden auch ressourcenbasierte PostScript-Type-1-Fonts, zum Beispiel
LWFN-Fonts (LaserWriter Font), unterstützt. Diesen liegt ein Zeichensatzkoffer
(FOND-Ressource oder FFIL) mit Metrikdaten bei (sowie Bildschirmschriften, die von
PDFlib ignoriert werden). PostScript-Systemschriften sind mit folgenden Zeichen-
sätzen einsetzbar: auto, macroman, macroman_apple, unicode und builtin. Die Zeichen-
sätze macroman und macroman_apple werden bei manchen Schriften je nach enthal-
tenem Zeichensatz unter Umständen nicht akzeptiert.
Beim Arbeiten mit PostScript-Systemschriften muss die LWFN-Datei im selben Ord-
ner wie der Zeichensatzkoffer liegen, und entsprechend der 5+3+3-Regel benannt
sein. Beachten Sie, dass PostScript-Systemschriften in Classic-Versionen von PDFlib
(ohne Carbon-Bibliothek) nicht unterstützt werden.
> OpenType-Fonts mit PostScript-Zeichenbeschreibungen (*.otf).
88 Kapitel 4: Textausgabe
PostScript-Fontnamen. Wenn Sie Fontdateien von der Festplatte einsetzen, können Sie
beliebige Alias-Namen verwenden (siehe Abschnitt 4.3.1, »Wie PDFlib nach Fonts sucht«,
Seite 93). Es gibt mehrere Möglichkeiten, den korrekten Namen für einen PostScript-
Font herauszufinden:
> Öffnen Sie die Zeichenbeschreibungsdatei (*.pfa oder *.pfb) und finden Sie den String
nach dem Eintrag /FontName. Entfernen Sie den Schrägstrich / am Anfang und ver-
wenden Sie den Rest als Schriftnamen.
> Wenn Sie mit Windows 2000/XP oder Mac OS X 10.4 arbeiten, können Sie auf die
Fontdatei doppelklicken, und ein Schriftbeispiel sowie der PostScript-Name der
Schrift werden angezeigt.
> Öffnen Sie die AFM-Metrikdatei und suchen Sie nach dem Eintrag FontName.
Hinweis Der PostScript-Fontname kann sich vom Windows-Namen der Schrift deutlich unterscheiden.
So erscheint die Schrift »AvantGarde-Demi« (PostScript-Name) im Windows-Fontmenü zum
Beispiel als »AvantGarde, Bold«. Genauso ist der Schriftname, der in den .inf-Dateien für Win-
dows erscheint, für den Einsatz mit PDF nicht relevant.
1. Siehe www.fontlab.com
2. Informationen über die in PostScript-Fonts verwendeten Glyphennamen finden Sie unter partners.adobe.com/asn/
developer/typeforum/unicodegn.html (Schriftanbieter müssen sich aber nicht an diese Empfehlungen für Glyphennamen
halten).
TrueType- und OpenType-Fontnamen. Wenn Sie Fontdateien von der Festplatte einset-
zen, können Sie beliebige Alias-Namen verwenden (siehe Abschnitt 4.3.1, »Wie PDFlib
nach Fonts sucht«, Seite 93). Der Name eines TrueType-Fonts im generierten PDF-Doku-
ment kann von den in PDFlib (oder Windows) benutzten Namen abweichen. Das ist nor-
mal und liegt darin begründet, dass PDF den PostScript-Namen eines TrueType-Fonts
verwendet, der nicht unbedingt mit dem ursprünglichen TrueType-Namen überein-
stimmt (zum Beispiel TimesNewRomanPSMT bzw. Times New Roman).
Hinweis Im Gegensatz zu PostScript-Fonts können die Namen von TrueType- und OpenType-Fonts Leer-
zeichen enthalten.
Windows wird damit angewiesen, nach einer bestimmten fetten, kursiven oder anderen
Variante der Basisschrift zu suchen. Je nach vorhandener Auswahl selektiert Windows
den Font, der dem angeforderten Stil am nächsten kommt (es wird keine neue Schrift-
variante erstellt). Der von Windows selektierte Font kann vom angeforderten Font ab-
weichen, der wiederum nicht mit dem Fontnamen im generierten PDF übereinstimmen
muss; PDFlib hat keinerlei Kontrolle über die Fontselektion von Windows. Stilnamen
für Fonts funktionieren außerdem nur bei TrueType- und OpenType-Systemschriften
und nicht bei PostScript-Systemschriften oder Schriften, die über eine Fontdatei auf der
Festplatte spezifiziertwerden.
Zur Festlegung des Schriftgewichts können folgende Schlüsselwörter an den an PDF_
load_font( ) zu übergebenden Basisnamen des Fonts angehängt werden (durch ein Kom-
ma vom Fontnamen getrennt):
none, thin, extralight, ultralight, light, normal, regular, medium,
semibold, demibold, bold, extrabold, ultrabold, heavy, black
90 Kapitel 4: Textausgabe
Georgia,Bold,Italic
Hinweis Windows-Stilnamen für Fonts sind nützlich, wenn Sie mit lokalisierten Schriftnamen zu tun
haben, da sie eine universelle Methode zum Zugriff auf Fontvariationen unabhängig von ihren
lokalisierten Namen bieten.
Type-3-Fonts müssen vollständig außerhalb der Seite definiert werden (genauer gesagt
muss die Fontdefinition im Geltungsbereich document vorgenommen werden). Das fol-
gende Beispiel zeigt die Definition eines einfachen Type-3-Fonts:
PDF_begin_font(p, "Fuzzyfont", 0, 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");
PDF_end_font(p);
Die Schrift wird in PDFlib registriert und ihr Name kann gemeinsam mit einem Zei-
chensatz, der die Namen der Glyphen in dem Type-3-Font enthält, an PDF_load_font( )
übergeben werden. Bei der Definition und Verwendung von Type-3-Fonts ist Folgendes
zu beachten:
> Ähnlich wie bei Füllmustern und Templates können Bilder nicht innerhalb einer
Glyphenbeschreibung geöffnet werden. Sie lassen sich jedoch davor öffnen und kön-
nen dann innerhalb der Glyphenbeschreibung platziert werden. Um diese Ein-
schränkung zu umgehen, können für kleine Bitmaps Inline-Bilder verwendet wer-
den.
> Aufgrund von Einschränkungen in PDF-Viewern müssen alle Zeichen, die in der
Textausgabe verwendet werden, auch tatsächlich in der Schrift definiert sein: Soll
Zeichencode x mit PDF_show( ) oder einer ähnlichen Funktion angezeigt werden und
enthält der Zeichensatz glyphname an Position x, dann muss glyphname über PDF_
begin_glyph( ) definiert worden sein. Diese Einschränkung bezieht sich nur auf Type-
3-Fonts. In PostScript-Type-1-, TrueType- oder OpenType-Fonts werden fehlende Gly-
phen dagegen einfach ignoriert.
92 Kapitel 4: Textausgabe
4.3 Schrifteinbettung und Schriftuntergruppen
4.3.1 Wie PDFlib nach Fonts sucht
Quellen für Fontdaten. PDFlib bezieht Fontdaten aus verschiedenen Quellen:
> Fontdateien im Dateisystem, die statisch über eine UPR-Konfigurationsdatei (siehe
Abschnitt 3.1.5, »Ressourcenkonfiguration und Dateisuche«, Seite 56) oder dyna-
misch über PDF_set_parameter( ) und die Ressourcenkategorie FontOutline konfigu-
riert wurden.
> Systemschriften (siehe Abschnitt 4.2.1, »Unterstützung von Systemschriften auf
Windows und Mac«, Seite 87) sind ohne jede Konfiguration einsetzbar. Um die Such-
reihenfolge zu definieren, sind sie über die UPR-Ressourcenkategorie HostFont aber
auch explizit konfigurierbar. Diese Möglichkeit kann zum Beispiel genutzt werden,
um bevorzugt Systemschriften statt der integrierten Standardschriften zu verwen-
den.
> Fontdaten, die vom Client mittels virtueller PVF-Dateien direkt in den Speicher über-
tragen werden. Dies ist bei komplexeren Anwendungen nützlich, bei denen die Font-
daten bereits im Speicher geladen und unnötige Festplattenzugriffe durch PDFlib zu
vermeiden sind. (Einzelheiten über virtuelle Dateien finden Sie in Abschnitt 3.1.4,
»Das PDFlib Virtual File System (PVF)«, Seite 55.)
Alias-Namen für Schriften. Da es nicht immer ganz einfach ist, den genauen internen
Namen einer Schrift zu ermitteln, unterstützt PDFlib Alias-Namen für PostScript-, True-
Type- und OpenType-Schriften. Der Alias-Name ist ein beliebiger selbst definierter
Name für eine Schrift, der in einer UPR-Datei oder zur Laufzeit als Ressource vom Typ
HostFont, FontOutline, FontAFM oder FontPFM angegeben werden kann. Das folgende Bei-
spiel definiert einen Alias-Namen für eine Schrift, die im Dateisystem gespeichert ist:
PDF_set_parameter(p, "FontOutline", "x=DFHSMincho-W3.ttf");
font = PDF_load_font(p, "x", 0, "winansi", "");
> Soll eine PostScript-Schrift eingebettet werden, werden nacheinander die folgenden
Endungen an den Schriftnamen angefügt und es wird versucht, die Fontdatei zu er-
mitteln:
.pfa .pfb
.PFA .PFB
> Alle der oben beschriebenen Namen werden erst so wie sie konstruiert wurden und
dann mit vorangestellten Verzeichnisnamen, die der Ressourcekategorie SearchPath
entnommen werden, zur Suche herangezogen.
Damit findet PDFlib eine Schrift ohne jede manuelle Konfiguration, sofern die Font-
datei aus dem Schriftnamen sowie der dem Schrifttyp entsprechenden Standard-Datei-
namenerweiterung besteht und sich in einem der in SearchPath festgelegten Verzeich-
nisse befindet.
4.3.2 Schrifteinbettung
Die PDF-Standardschriften. PDF-Viewer unterstützen standardmäßig 14 Schriften, die
immer vorhanden sind. PDFlib enthält alle Metrikdaten für die Standardschriften, so
dass keine zusätzlichen Fontdateien erforderlich sind (es sei denn, der Font soll einge-
bettet werden). Die Standardschriften sind:
Hinweis PDFlib enthält derzeit nur die Metriken von Glyphen, die in den Standardschriften von Acrobat
4 und 5 enthalten sind. Seit Version 6 enthalten die Standardschriften von Acrobat weitere (z.B.
polnische) Zeichen, für die PDFlib jedoch keine korrekten Zeichenbreiten zur Verfügung stellt.
Um eine der Standardschriften durch eine auf dem System installierte Schrift (host font)
zu ersetzen, müssen Sie sie in der Ressourcenkategorie HostFont festlegen. Die folgende
Zeile gewährleistet zum Beispiel, dass die Schrift »Symbol« anstatt aus den integrierten
Standardfontdaten direkt vom System abgerufen wird:
PDF_set_parameter(p, "HostFont", "Symbol=Symbol");
PDF unterstützt Schriften jenseits der 14 Standardschriften auf verschiedene Art und
Weise. PDFlib kann Zeichenbeschreibungen in die generierte PDF-Ausgabe einbetten.
94 Kapitel 4: Textausgabe
Die Schrifteinbettung wird über die Option embedding von PDF_load_font( ) gesteuert (in
manchen Situationen bettet PDFlib eine Schrift jedoch auf jeden Fall ein).
font = PDF_load_font(p, "WarnockPro", 0, "winansi", "embedding");
Alternativ dazu kann ein Fontdeskriptor eingebettet werden, der nur die Metrik der
Zeichen (ohne die eigentlichen Zeichenbeschreibungen) sowie allgemeine Schriftinfor-
mationen enthält. Wird eine Schrift nicht ins PDF-Dokument eingebettet, versucht
Acrobat, sie vom Zielsystem zu beziehen. Ist sie dort nicht vorhanden, wird gemäß den
Angaben des Fontdeskriptors eine Ersatzschrift konstruiert. Tabelle 4.1 zeigt die ver-
schiedenen Situationen bei der Schriftverwendung und die jeweils erforderlichen Font-
und Metrikdateien.
Wird eine Schrift mit fontspezifischem Zeichensatz (Symbolschrift) oder mit Gly-
phen verwendet, die nicht in Adobes Liste lateinischer Standardzeichen (Standard Latin
Character Set) verzeichnet sind, und ist diese Schrift nicht in die PDF-Ausgabe eingebet-
tet, so ist das PDF-Dokument unbrauchbar, sofern die Schrift nicht bereits auf dem Ziel-
system installiert ist (denn Acrobat kann nur lateinische Textschriften simulieren).
Solche PDF-Dokumente sind von Natur aus nicht portierbar, wenngleich sie in be-
schränktem Rahmen wie zum Beispiel beim innerbetrieblichen Dokumentenaustausch
sinnvoll sein können.
Tabelle 4.1 Verschiedene Situationen beim Schrifteinsatz und jeweils erforderliche Metrik- und
Fontdateien
Schrifteinsatz Muss Metrikdatei explizit Muss Fontdatei explizit
konfiguriert werden? konfiguriert werden?
Eine der 14 Standardschriften nein nur bei
Schrifteinbettung
TrueType-, OpenType- oder PostScript-Type-1-Systemschrift, nein nein
die auf Windows oder Mac installiert ist
PostScript-Nichtstandardschrift yes nur bei
Schrifteinbettung
TrueType-Fonts n/a yes
OpenType-Fonts einschließlich CJK-TrueType- und CJK- n/a yes
OpenType-Fonts
Standard-CJK-Fonts1 nein nein
1. Informationen über CJK-Fonts finden Sie in Abschnitt 4.7, »Chinesischer, japanischer und koreanischer Text«, Seite 120.
Beachten Sie dabei, dass die Einbettung bei OpenType-Fonts mit PostScript-Zeichenbe-
schreibungen nicht unbedingt erzwungen wird. Das liegt an der internen Konvertie-
Rechtliche Aspekte der Schrifteinbettung. Es ist wichtig anzumerken, dass der bloße
Besitz einer Fontdatei nicht unbedingt dazu berechtigt, die Schrift in ein PDF-Doku-
ment einzubetten, selbst wenn eine gültige Schriftlizenz vorhanden ist. Zahlreiche
Schriftanbieter lassen die Schrifteinbettung nur eingeschränkt zu, manche verbieten
die Einbettung von Schriften in PDF vollständig, und wieder andere offerieren besonde-
re Online- oder Einbettungslizenzen. Schließlich gibt es auch noch die Variante, die Ein-
bettung nur bei Verwendung von Untergruppen zu erlauben. Überprüfen Sie deshalb
die rechtlichen Aspekte, bevor Sie Schriften mit PDFlib einbetten. PDFlib hält sich an
Einbettungsbeschränkungen, falls diese in einem TrueType- oder OpenType-Font spezi-
fiziert sind. Dies wird über ein Einbettungsflag bewerkstelligt, das auf no embedding1 ge-
setzt sein kann. In diesem Fall kommt PDFlib der Aufforderung des Herstellers nach
und weist jeden Versuch zurück, die Schrift einzubetten.
Wird ein Font, für den die Untergruppenbildung angefordert wurde, in einem Doku-
ment verwendet, so merkt sich PDFlib, welche Zeichen in der Textausgabe verwendet
wurden. Die Untergruppenbildung lässt sich auf verschiedene Art beeinflussen:
> Der Parameter autosubsetting bestimmt das Standardverhalten bezüglich Untergrup-
penbildung. Ist dieser Parameter gleich true, so wird die Untergruppenbildung für
alle Fonts aktiviert, für die eine Untergruppenbildung möglich ist. Der Standardwert
ist true.
> Wenn der Parameter autosubsetting gleich false ist, Untergruppen aber für einen be-
stimmten Font gebildet werden sollen, so muss PDF_load_font( ) mit der Option
subsetting aufgerufen werden:
font = PDF_load_font(p, "WarnockPro", 0, "winansi", "subsetting");
> Der Parameter subsetlimit enthält einen Prozentwert. Werden in einem Dokument
prozentual zur Gesamtzahl der Glyphen im Font mehr Glyphen verwendet, als durch
den Prozentsatz vorgegeben ist, wird die Untergruppenbildung für den Font deakti-
1. Genauer gesagt: wenn das Flag fsType in der OS/2-Tabelle der Schrift den Wert 2 hat.
96 Kapitel 4: Textausgabe
viert und dieser komplett eingebettet. Dies spart Rechenzeit, die Ausgabe wird je-
doch etwas größer:
PDF_set_value(p, "subsetlimit", 75); /* Untergruppen-Limit auf 75% setzen */
Der Standardwert für subsetlimit beträgt 100 Prozent. Anders ausgedrückt: die Option
subsetting von PDF_load_font( ) wird immer berücksichtigt, außer der Client setzt das
Limit explizit auf weniger als 100 Prozent.
> Mit dem Parameter subsetminsize lässt sich die Untergruppenbildung für kleine Font-
dateien vollständig deaktivieren. Ist die ursprüngliche Fontdatei kleiner als der Wert
von subsetminsize in KB, wird die Untergruppenbildung für diesen Font deaktiviert.
Der Standardwert beträgt 100 KB.
Hinweis Mit PDFlib wird das Beispielprogramm chartab ausgeliefert, mit dem sich bequem Zeichen-
tabellen mit beliebigen Kombinationen aus Font und Zeichensatz ausdrucken lassen.
Zeichensatz host. Der Zeichensatz host spielt eine Sonderrolle, da es sich um keinen
bestimmten Zeichensatz handelt. Je nach aktueller Plattform wird er auf einen speziel-
len 8-Bit-Zeichensatz abgebildet:
> Auf Mac OS Classic wird er auf macroman abgebildet.
> Auf IBM eServer zSeries mit MVS oder USS wird er auf ebcdic abgebildet.
> Auf IBM eServer iSeries wird er auf ebcdic_37 abgebildet.
> Auf Windows wird der auf winansi abgebildet.
> Auf allen anderen Systemen (einschließlich Mac OS X) wird er auf iso8859-1 abgebil-
det.
Automatische Auswahl des Zeichensatzes. PDFlib unterstützt ein Verfahren, mit dem
für bestimmte Umgebungen automatisch der jeweils am besten passende Zeichensatz
bestimmt wird. Das Schlüsselwort auto als Wert für den Parameter encoding legt einen
plattform- und umgebungsspezifischen 8-Bit-Zeichensatz wie folgt fest:
> Unter Windows: aktuelle Codepage des Systems (Einzelheiten siehe unten)
> Unter Unix und Mac OS X: iso8859-1 (mit Ausnahme von LWFN-PostScript-Schriften
auf dem Mac, für die auto auf macroman abgebildet wird)
> Auf Mac OS Classic: macroman
> Auf IBM eServer iSeries: Zeichensatz des aktuellen Jobs (IBMCCSID000000000000)
> Auf IBM eServer zSeries: ebcdic (entspricht Codepage 1047)
98 Kapitel 4: Textausgabe
Tabelle 4.2 Verfügbarkeit von Glyphen für vordefinierte Zeichensätze in verschiedenen Schriftkategorien;
manche Sprachen sind mit Acrobat-Standardschriften nicht darstellbar.
Standardschriften
Acrobat 6/72
»Big Fonts«5
Acrobat 4/51
PS Level 1/2,
PostScript 3
Pro Fonts4
OpenType
TrueType
Fonts3
Codepage Unterstützte Sprachen
4.4 Zeichensätze 99
2. Acrobat 6 verlässt sich auf die Fonts, die im System zur Anzeige von Times und Helvetica verfügbar sind. Die Ergebnisse
sind deswegen sehr unterschiedlich, je nachdem, wie viele und welche Fonts installiert sind. Die Systemschriften in Win-
dows XP enthalten zum Beispiel mehr Glyphen als die mit älteren Windows-Versionen ausgelieferten Schriften.
3. Erweiterter Adobe Latin Zeichensatz (CE-Fonts) (Type-1-Fonts seit PostScript 3)
4. Adobe OpenType Pro Fonts enthalten mehr Glyphen als reguläre OpenType-Schriften.
5. Windows-TrueType-Fonts, die zahlreiche Glyphen enthalten, zum Beispiel Tahoma
Bei Symbolschriften wird das Schlüsselwort auto auf den Zeichensatz builtin abgebildet.
Diese Art der automatischen Zeichensatzwahl mag in vielen Situationen bequem sein,
die Portabilität Ihrer PDFlib-Clientprogramme ist damit aber nicht mehr gewährleistet.
> Auf IBM eServer zSeries mit USS oder MVS kann ein beliebiger Coded Character Set
Identifier (CCSID) verwendet werden. Der CCSID ist als String zu übergeben, und PDF-
lib leitet den übergebenen Codepagenamen unverändert ans System weiter:
PDF_load_font(p, "Helvetica", 0, "IBM-273", "");
In der Encoding-Datei werden einfach zeilenweise alle Glyphennamen und die dazuge-
hörigen Nummern aufgelistet. Das folgende Beispiel zeigt den Anfang einer Zeichen-
satz-Definition:
% Zeichensatz-Definition für PDFlib mittels Glyphennamen
% name code Unicode (optional)
space 32 0x0020
exclam 33 0x0021
...
Formal ausgedrückt ist der Inhalt einer Zeichensatz- oder Codepage-Datei nach folgen-
den Regeln aufgebaut:
> Kommentare beginnen mit einem Prozentzeichen ’%’ und enden am Zeilenende.
> Der erste Eintrag in einer Zeile ist entweder ein PostScript-Zeichenname oder ein
hexadezimaler Unicode-Wert, der sich aus dem Präfix 0x und vier hexadezimalen
Ziffern (in Groß- oder Kleinschreibung) zusammensetzt. Darauf folgen Leer- oder Ta-
bulatorzeichen sowie ein hexadezimaler (0x00–0xFF) oder dezimaler (0–255) Zei-
chencode. Encoding-Dateien mit Glyphennamen können optional eine dritte Spalte
mit dem entsprechenden Unicode-Wert enthalten.
> Zeichencodes, die in der Encoding-Datei nicht vorkommen, gelten als nicht definiert.
Alternativ dazu kann für nicht kodierte Zeichen der Unicode-Wert 0x0000 oder der
Zeichenname .notdef verwendet werden.
Der builtin-Zeichensatz für PostScript-Fonts. Der Name builtin bezieht sich nicht auf
eine bestimmte Anordnung der Zeichen, sondern bedeutet einfach »nimm die Schrift
wie sie ist und ändere den Zeichensatz nicht«. Dieses Konzept wird auch als schriftspezi-
fischer (fontspecific) Zeichensatz bezeichnet und spielt bei Logo- und Symbolfonts eine
entscheidende Rolle. Es ist ebenfalls (teilweise unangemessen) weit verbreitet bei nicht-
lateinischen Fonts (wie Griechisch oder Kyrillisch). Solche Fonts können nicht mithilfe
eines der unterstützten Zeichensätze umkodiert werden, da ihre Zeichennamen nicht
mit denen in den Zeichensätzen übereinstimmen. builtin muss deshalb für alle Symbol-
schriften oder Nicht-Text-PostScript-Schriften verwendet werden. Ob es sich um eine
Nicht-Text-Schrift handelt, lässt sich aus folgendem Eintrag in der AFM-Datei ermitteln:
EncodingScheme FontSpecific
Textfonts können umkodiert (das heißt an eine bestimmte Codepage oder einen be-
stimmten Zeichensatz angepasst) werden. Mit Symbolfonts ist dies nicht möglich, so
dass dort der Zeichensatz builtin verwendet werden muss. Die weit verbreiteten Schrif-
ten Symbol und ZapfDingbats lassen sich jedoch auch mit dem Zeichensatz unicode ver-
wenden.
Der Zeichensatz builtin kann nicht für benutzerdefinierte (Type-3-) Fonts verwendet
werden, da diese keinen Standardzeichensatz enthalten.
Hinweis Leider hat sich das Konzept der schriftspezifischen Zeichensätze bei Schriftentwicklern und
Schriftherstellern nicht vollständig durchgesetzt (dies mag an mangelhaften Entwicklungs-
tools liegen). So findet man viele lateinische Textfonts mit vorgeblich schriftspezifischem Zei-
chensatz und zahlreiche Symbolfonts, die fälschlicherweise als Textschriften gekennzeichnet
sind.
Glyph-IDs (GIDs) werden in TrueType- und OpenType-Fonts intern verwendet. Sie stel-
len eine eindeutige Adressierung der Glyphen in einer Schrift dar. Die GID-Adressierung
befreit den Entwickler von jeder Encoding-bedingten Beschränkung und bietet Zugriff
auf alle Glyphen, die der Schriftentwickler in die Fontdatei aufgenommen hat. Es exis-
tiert aber keinerlei Beziehung zwischen GIDs und gängigeren Adressierungsverfahren
wie Windows-Zeichensatz oder Unicode. Die Konvertierung von anwendungsspezifi-
schen Codes zu GIDs obliegt damit dem PDFlib-Benutzer.
Die GID-Adressierung wird mit dem Schlüsselwort glyphid als encoding-Parameter für
PDF_load_font( ) aktiviert. GIDs werden von 0 bis zum letzten Glyph-ID-Wert, der mit
dem Parameter fontmaxcode abgefragt werden kann, fortlaufend durchnummeriert.
Außerdem müssen Sie eine Schrift wählen, die das Eurozeichen enthält. Dies ist bei vie-
len, aber durchaus nicht allen modernen Schriften der Fall. Auch hier einige Beispiele:
> Die in PostScript-Level-1- und Level-2-Geräten eingebauten Schriften enthalten kein
Eurozeichen, während PostScript-3-Geräte in der Regel über das Eurozeichen verfü-
gen.
> Enthält eine Schrift das Eurozeichen nicht, können Sie ersatzweise den Euro aus dem
Font »Symbol« verwenden, der sich dort an Position 0xA0 (hexadezimal) bzw. 160
Neben dem unicode-Encoding unterstützt PDFlib mehrere andere Methoden zur Aus-
wahl von Unicode-Zeichen.
1. Siehe www.unicode.org
Abb. 4.1
Unicode-Lesezeichen (links) und Uni-
code-Textanmerkungen (rechts)
Ersetzung von Unicode-Zeichen, für die es keine Glyphen gibt. Content-Strings wer-
den immer mit einem bestimmten Font auf der Seite dargestellt. Allerdings gibt es kei-
nen Font mit allen Zeichen des aktuellen Unicode-Standards. Während es Aufgabe des
PDFlib-Anwenders ist, geeignete Fonts zu beschaffen, verhindert PDFlib einige häufige
Probleme, indem bestimmte Zeichen durch grafisch gleichwertige ersetzt werden, falls
die ursprüngliche Glyphe nicht im Font vorhanden ist und die Option glyphwarning den
Wert false hat. The folgende (unvollständige) Liste enthält einige dieser Zeichenpaare.
Falls das erste Zeichen der Liste im Font nicht verfügbar ist, wird es automatisch durch
das zweite ersetzt:
U+00A0 (NO-BREAK SPACE) U+0020 (SPACE)
U+00AD (SOFT HYPHEN) U+002D (HYPHEN-MINUS)
U+2010 (HYPHEN) U+002D (HYPHEN-MINUS)
U+03BC (GREEK SMALL LETTER MU) U+00C5 (MICRO SIGN)
U+212B (ANGSTROM SIGN) U+00B5 (LATIN CAPITAL LETTER A WITH RING ABOVE Å)
U+220F (N-ARY PRODUCT) U+03A0 (GREEK CAPITAL LETTER PI)
U+2126 (OHM SIGN) U+03A9 (GREEK CAPITAL LETTER OMEGA)
Über diese eingebaute Tabelle hinaus werden die Fullwidth-Zeichen U+FF01 bis U+FF5E
durch die zugehörigen Zeichen aus ISO 8859-1 ersetzt (also U+0021 bis U+007E), falls die
Fullwidth-Varianten im Font nicht verfügbar sind.
In diesen Umgebungen ist die Stringbehandlung einfach: Alle Strings werden an den
PDFlib-Kern automatisch als Unicode-Strings im Format UTF-16 übergeben. Vom Client
übergebene Unicode-Strings werden von den Sprachwrappern korrekt verarbeitet, die
In Sprachbindungen ohne integrierten String-Datentyp (z.B. C, Cobol, RPG), ist die Länge
von UTF-16-Strings in einem eigenen Parameter length zu übergeben. Unicode-Text
kann in diesen Sprachen zwar verwendet werden, die Behandlung der verschiedenen
Stringtypen ist aber etwas komplizierter:
> Content-Strings: sind Strings zur Erzeugung von echtem Seiteninhalt. Die Interpreta-
tion solcher Strings wird mit den Parametern textformat (siehe unten) und encoding
für PDF_load_font( ) gesteuert. Ist textformat gleich auto (Standardeinstellung), wird
für die Zeichensätze unicode und glyphid sowie für UCS-2-CMaps das Format utf16 ver-
wendet. Für alle anderen Zeichensätze kommt das Format bytes zum Einsatz. In Spra-
chen ohne integrierten String-Datentyp (siehe oben) ist die Länge der UTF-16-Strings
in einem eigenen Längenparameter zu übergeben.
> Hypertext-Strings: werden anhand der Parameter hypertextformat und hyper-
textencoding interpretiert (siehe unten). Ist hypertextformat gleich auto (Standardein-
stellung), wird das Format utf16 für hypertextencoding=unicode und sonst bytes ver-
wendet. In Sprachen ohne integrierten String-Datentyp (siehe oben), ist die Länge
von UTF-16-Strings in einem eigenen Längenparameter zu übergeben.
Die Standardeinstellung für den Parameter textformat ist utf16 für Unicode-fähige
Sprachbindungen, andernfalls auto.
Die textformat-Einstellung bezieht sich zwar auf alle Zeichensätze, ist aber am nütz-
lichsten beim unicode-Encoding. Tabelle 4.4 zeigt die Interpretation von Text-Strings bei
verschiedenen Kombinationen von Encodings und textformat-Einstellungen.
Hypertext-Format. Ähnlich dem Parameter textformat kann das Format von Hyper-
text-Strings mit dem Parameter hypertextformat bestimmt werden. Die Interpretation
der zulässigen Werte weicht jedoch etwas vom Parameter textformat ab. Die Kodierun-
gen utf8, utf16, utf16be und utf16le haben bei beiden Parametern dieselbe Bedeutung,
bytes und auto werden beim Parameter hypertextformat jedoch anders interpretiert:
> auto: UTF-16-Strings mit Big-Endian-BOM werden erkannt (in C müssen sie mit Dop-
pelnull abschließen) und Unicode-Ausgabe wird generiert. Beginnt der String nicht
mit einem Big-Endian-BOM, wird er als String mit 8-Bit-Kodierung gemäß dem Para-
meter hypertextencoding interpretiert (siehe oben). Falls er Zeichen enthält, die nicht
4.5.5 Character-Referenzen
In manchen Umgebungen dürfen Programmierer Sourcecode nur mit 8-Bit-Zeichensät-
zen (wie winansi, macroman oder ebcdic) schreiben. Es ist entsprechend mühsam, einzel-
ne Unicode-Zeichen in 8-Bit-Text aufzunehmen, ohne gleich alle Zeichen in Multibyte-
Kodierung umzusetzen. Um Entwicklern in dieser Situation unter die Arme zu greifen,
unterstützt PDFlib so genannte Character-Referenzen, ein Verfahren, das in Auszeich-
nungssprachen wie SGML und HTML gebräuchlich ist.
Hinweis Die Codes 128-159 (dezimal) bzw. 0x80-0x9F (hexadezimal) beziehen sich nicht auf Winansi-
Zeichen. Der Unicode-Standard enthält an diesen Positionen keine druckbaren Zeichen, son-
dern nur Steuerzeichen.
Die folgenden Beispiele zeigen gültige Character-Referenzen und die zugehörigen Zei-
chen:
­ weiches Trennzeichen (soft hyphen)
­ weiches Trennzeichen (soft hyphen)
­ weiches Trennzeichen (soft hyphen)
å Buchstabe a mit kleinem Kreis darüber (dezimal)
å Buchstabe a mit kleinem Kreis darüber (hexadezimal, kleines x)
å Buchstabe a mit kleinem Kreis darüber (hexadezimal, großes X)
€ Eurozeichen (hexadezimal)
€ Eurozeichen (dezimal)
€ Eurozeichen (Entity-Name)
< ’kleiner’-Zeichen
> ’größer’-Zeichen
& kaufmännisches ’und’-Zeichen (ampersand)
Α Alpha-Zeichen
1. Siehe www.w3.org/TR/REC-html40/charset.html#h-5.3
Mit der Option charref (direkt oder als Inline-Option) für PDF_create_textflow( ), PDF_fit_
textline( ) oder PDF_fill_textblock( ) lassen sich Character-Referenzen auch für die Text-
flussverarbeitung aktivieren. Sie können dann numerische oder Entity-Referenzen in 8-
Bit-kodiertem Text übergeben:
PDF_set_parameter(p, "charref", "true");
PDF_set_parameter(p, "textformat", "bytes");
font = PDF_load_font(p, "Helvetica", 0, "unicode", "");
PDF_setfont(p, font, 24);
PDF_show_xy(p, "Price: 500€", 50, 500);
Hinweis Mit Character-Referenzen lassen sich zwar beliebige Unicode-Zeichen (wie griechische Buchsta-
ben oder mathematische Symbole) referenzieren, es findet aber kein automatischer Fontwech-
sel statt. Um diese Zeichen tatsächlich nutzen zu können, müssen Sie explizit einen geeigneten
Font auswählen, sofern der aktuell eingestellte die Zeichen nicht unterstützt.
Unicode-kompatible Ausgabe. Zur Erzeugung von Tagged PDF und für die zuverlässi-
ge Extraktion von Text aus dem generierten PDF muss die Ausgabe zu Unicode kompa-
tibel sein. Mit PDFlib generierte PDF-Ausgabe ist zu Unicode kompatibel, sofern folgen-
de Bedingungen erfüllt sind:
Zeichenmetrik. PDFlib verwendet dasselbe System für Zeichen- und Fontmetrik wie
PostScript und PDF. Es soll hier kurz beschrieben werden.
Die Schriftgröße, die von PDFlib-Anwendern angegeben werden muss, ist der Ab-
stand zwischen zwei aufeinander folgenden Textzeilen, der minimal erforderlich ist, da-
mit Zeichen nicht überlappen. Die Schriftgröße ist gewöhnlich höher als die einzelnen
Zeichen der Schrift, da sie auch Ober- und Unterlängen und möglicherweise einen Zwi-
schenraum zwischen den Zeilen umfasst.
Der Zeilenabstand (leading) bezeichnet den vertikalen Abstand zwischen den Grund-
linien benachbarter Textzeilen. Er wird standardmäßig auf den Wert der Schriftgröße
gesetzt. Die Versalhöhe (capheight) bezeichnet die Höhe von Großbuchstaben wie T oder
H in den meisten lateinischen Schriften. Die x-Höhe (xheight) bezeichnet die Höhe von
Kleinbuchstaben wie x in den meisten lateinischen Schriften. Die Oberlänge (ascender)
bezeichnet die Höhe von Kleinbuchstaben wie f oder d in den meisten lateinischen
Schriften. Die Unterlänge (descender) ist der Abstand von der Grundlinie zum unteren
Ende von Kleinbuchstaben wie j oder p in den meisten lateinischen Schriften. Sie ist in
der Regel negativ. Die Werte für x-Höhe, Versalhöhe, Oberlänge und Unterlänge werden
als Bruchteil der Schriftgröße gemessen und müssen deshalb vor der Verwendung mit
der nötigen Schriftgröße multipliziert werden.
PDFlib muss einen oder mehrere der Werte auch schätzen können, da sie in der Font-
oder Metrikdatei nicht zwangsläufig vorhanden sind. Um herauszufinden, ob tatsächli-
che oder geschätzte Werte verwendet werden, können Sie die Parameter xheightfaked
etc. abfragen. Die Zeichenmetriken für eine bestimmte Schrift können von PDFlib wie
folgt abgefragt werden:
float capheight, ascender, descender, fontsize;
...
font = PDF_load_font(p, "Times-Roman", 0, "winansi", "");
PDF_setfont(p, font, fontsize);
Oberlänge
Versalhöhe (ascender)
(capheight)
Schriftgröße
Grundlinie
Unterlänge (descender)
Hinweis Position und Größe von hochgestellten und tiefgestellten Zeichen können von PDFlib nicht ab-
gefragt werden.
bei einem optimalen Zeilenabstand von 12 Punkt. Da ein Zoll (inch) aus 72 Punkt be-
steht, passen genau 10 Zeichen von 12 Punkt Courier in einen Zoll. Mit anderen Worten
stellt 12 Punkt Courier eine 10-cpi-Schrift dar. Für 10 Punkt Text beträgt die Zeichenbrei-
te 6 Punkt, was eine 72/6 = 12 cpi Schrift ergibt; 8 Punkt Courier ergibt 15 cpi.
4.6.2 Kerning
Manche Zeichenkombinationen sehen unter Umständen nicht sehr gut aus. Beispiels-
weise sieht zweimal V hintereinander manchmal wie ein W aus. Ebenso muss der Ab-
stand zwischen T und e oft verringert werden, damit kein hässlicher Leerraum entsteht.
Dieses Ausgleichen wird als Unterschneidung oder Kerning bezeichnet. Viele Schriften
enthalten umfangreiche Kerning-Tabellen, die Abstandsausgleichswerte für zahlreiche
Buchstabenkombinationen enthalten. In PDFlib gibt es zwei Möglichkeiten zur Steue-
rung von Kerning:
Kein Kerning
Kerning
Eine temporäre Deaktivierung von Kerning kann zum Beispiel bei Zahlen in Tabel-
len sinnvoll sein, falls die Kerningdaten bestimmte Ziffernpaare enthalten, so dass
keine einheitliche Anordnung der Zahlen möglich ist.
Kerning erfolgt zusätzlich zu Zeichenabstand, Wortabstand und eventuell aktivierter
horizontaler Skalierung. In PDFlib gibt es keine Beschränkung für die Anzahl der Ker-
ning-Paare in einer Schrift.
4.6.3 Textvarianten
Künstliche Schriftstile. Fette und kursive Varianten einer Schrift sollten durch Aus-
wahl des passenden Fonts verwendet werden. PDFlib unterstützt aber auch künstliche
Schriftstile: auf Basis eines vorhandenen Schriftschnitts simuliert Acrobat fette, kursive
oder fett-kursive Zeichen durch künstliches Verbreitern oder Neigen. In ästhetischer
Hinsicht sind solche künstlichen Schriftstile qualitativ schlechter als echte kursive oder
fette Schriftschnitte, die vom Schriftdesigner sorgfältig gestaltet wurden. In Situatio-
nen aber, in denen ein bestimmter Schriftstil nicht direkt verfügbar ist, können künstli-
che Stile Abhilfe schaffen. Nützlich sind sie insbesondere bei Standard-CJK-Fonts, die
nur den Basisfont, aber keine fetten oder kursiven Varianten unterstützen.
Hinweis Künstliche Schriftstile sollten nur bei Standard-CJK-Schriften zum Einsatz kommen. Beachten
Sie zudem, dass künstliche Schriftstile von anderen PDF-Viewern als Adobe Acrobat unter Um-
ständen nicht angezeigt werden können.
PDFlib überprüft die ersten drei Punkte, die Erfüllung der letzten Bedingung ist jedoch
vom Benutzer sicherzustellen. Künstliche Schriftstile für fette, kursive und fett-kursive
Zeichen können mit den Schlüsselwörtern bold, italic und bolditalic der Option fontstyle
für PDF_load_font( ) angefordert werden:
PDF_load_font(p, "HeiseiKakuGo-W5", 0, "UniJIS-UCS2-H", "fontstyle bold");
Simulation kursiver Schriften. Wenn nur die reguläre Schrift verfügbar ist, lässt sich
alternativ eine kursive Schrift auch mit dem Parameter oder der Option italicangle statt
der fontstyle-Funktion simulieren. Dabei wird eine unechte kursive Schrift erzeugt, in-
dem die reguläre Schrift anhand eines vom Benutzer übergebenen Winkels geneigt
wird, wobei negative Werte den Text nach rechts neigen. Die Einschränkungen der
fontstyle-Funktion spielen hier keine Rolle. Es sei jedoch darauf hingewiesen, dass eine
echte kursive Schrift eine wesentlich gefälligere Ausgabe ergibt. Ist sie jedoch nicht vor-
handen, kann sie mit dem Parameter italicangle mühelos simuliert werden. Besonders
nützlich ist dies bei CJK-Fonts. Übliche Werte für den Parameter italicangle liegen zwi-
schen -12 und -15 Grad:
PDF_set_value(p, "italicangle", -12); /* unechte kursive Schrfit erzeugen */
Unterstreichen, Überstreichen und Durchstreichen von Text. PDFlib kann Linien unter,
über oder auf Text zeichnen. Die Breite des Strichs und sein Abstand zur Grundlinie
werden der Metrikdatei des Fonts entnommen. Außerdem fließen in die Berechnung
der Strichstärke die aktuellen Werte des horizontalen Skalierungsfaktors sowie der
Textmatrix ein. Mit PDF_set_parameter( ) lässt sich das Unter-, Über- oder Durchstrei-
chen wie folgt ein- und ausschalten:
PDF_set_parameter(p, "underline", "true"); /* Unterstreichen aktivieren */
Die Striche erhalten die aktuelle Zeichenfarbe; die aktuellen Parameter für Linienenden
und Strichmuster werden ignoriert. Warnung für Ästheten: In den meisten Schriften
werden beim Unterstreichen Unterlängen berührt und beim Überstreichen diakritische
Zeichen über den Oberlängen.
Hinweis Unter-, Über- und Durchstreichen wird für Standard-CJK-Fonts nur unterstützt, wenn eine Uni-
code-CMap verwendet wird.
Modi der Textdarstellung. PDFlib unterstützt mehrere Darstellungsmodi, die das Er-
scheinungsbild von Text beeinflussen. Dazu gehört Text, der durch Umrisslinien darge-
stellt wird, sowie die Möglichkeit, Text als Clipping-Pfad zu verwenden. Text lässt sich
auch unsichtbar darstellen. Dies kann zum Beispiel sinnvoll sein, um Text auf einge-
scannten Bildern zu platzieren, so dass er zwar indiziert und durchsucht werden kann,
aber nicht direkt sichtbar ist. Die Darstellungsmodi werden in Tabelle 8.18 beschrieben.
Sie können mit PDF_set_value( ) und dem Parameter textrendering gesetzt werden.
PDF_set_value(p, "textrendering", 1); /* Umrisslinien zeichnen */
Hinweis Darstellungsmodus 7 (verwende Text als Clipping-Pfad) hat keinen Effekt, wenn die Textausga-
be mit PDF_fit_textline( ) oder PDF_fit_textflow( ) erfolgt.
Drucken von PDF-Dokumenten mit CJK-Text. Das Drucken von CJK-Dokumenten wirft
eine Reihe von Fragen auf, deren Beantwortung über den Rahmen dieses Handbuchs hi-
naus ginge. Wir möchten jedoch einige Hinweise geben, die dem PDFlib-Benutzer nütz-
lich sein können. Wenn Sie beim Drucken von CJK-Dokumenten mit Acrobat Probleme
haben (insbesondere bei Dokumenten mit Standard-CJK-Fonts), sollten Sie folgende Ur-
sachen in Betracht ziehen:
> Aufgrund der immensen Anzahl von Zeichen benötigen CJK-Fonts enormen Dru-
ckerspeicher, wenn keine Schriftuntergruppen gebildet wurden. Nicht alle Drucker
verfügen jedoch über ausreichend Speicher zur Ausgabe solcher Schriften.
> Nicht-japanische PostScript-Drucker haben keine japanischen Schriften installiert.
Aus diesem Grund müssen Sie im Druckdialog von Acrobat die Option Asiatische
Schriften herunterladen aktivieren.
> Wenn der Ausdruck auch mit heruntergeladenen Schriften nicht funktioniert, akti-
vieren Sie die Option Als Bild drucken. Acrobat sendet dann eine Rasterbildversion der
Seite an den Drucker (allerdings mit 300 dpi).
1. Bei dieser Gelegenheit soll das grundlegende Werk »CJKV information processing – Chinese, Japanese, Korean & Vietna-
mese Computing« (O’Reilly 1999, ISBN 1-56592-224-7) von Ken Lunde hervorgehoben werden sowie seine Arbeit bei Adobe,
wo er eine der treibenden Kräfte hinter der CJK-Unterstützung in PostScript und PDF ist.
2. Siehe www.adobe.com/products/acrobat/acrrasianfontpack.html
Hinweis Die Standard-CJK-Fonts umfassen keine kursiven oder fetten Fonts. Solche Fonts lassen sich mit
künstlichen Schriftstilen simulieren (siehe Abschnitt 4.6.3, »Textvarianten«, Seite 117).
Wie aus Tabelle 4.6 hervorgeht, unterstützen die standardmäßig vorhandenen CMaps
die meisten CJK-Zeichensätze, die auf Mac-, Windows- und Unix-Systemen verwendet
werden, sowie einige andere herstellerspezifische Zeichensätze. Dabei werden inbeson-
dere die wichtigen japanischen Zeichensätze Shift-JIS, EUC, ISO 2022 und Unicode
(UCS-2 und UTF-16) unterstützt. Tabellen mit allen unterstützten Zeichen sind bei Ado-
be1 erhältlich; CMap-Beschreibungen finden Sie in Tabelle 4.7.
Tabelle 4.7 Vordefinierte CMaps für japanisch/chinesisch/koreanisch (aus der »PDF Reference«)
Sprache CMap-Name Zeichensatz und Textformat
Vereinfachtes UniGB-UCS2-H Unicode-Encoding (UCS-2) für die Character Collection Adobe GB1
Chinesisch UniGB-UCS2-V
UniGB-UTF16-H Unicode-Encoding (UTF-16BE) für die Character Collection Adobe GB1.
UniGB-UTF16-V Enthält Zuordnungen für alle Zeichen des GB-18030-2000-Zeichensatzes.
GB-EUC-H Microsoft Codepage 936 (Charset 134), GB 2312-80-Zeichensatz, EUC-CN-
GB-EUC-V Encoding
GBpc-EUC-H Macintosh, GB-2312-80-Zeichensatz, EUC-CN-Encoding, Script Manager
GBpc-EUC-V Code 2
GBK-EUC-H, -V Microsoft Codepage 936 (Charset 134), GBK-Zeichensatz, GBK-Encoding
GBKp-EUC-H Wie GBK.EUC-H, ersetzt aber lateinische Zeichen halber Breite durch
GBKp-EUC-V proportionale Zeichen und ordnet dem Zeichencode 0x24 das
Dollarzeichen ($) statt des Yuan-Symbols (¥) zu.
GBK2K-H, -V GB-18030-2000-Zeichensatz, gemischtes 1-, 2- und 4-Byte-Encoding
Traditionelles UniCNS-UCS2-H Unicode-Encoding (UCS-2) für die Character Collection Adobe CNS1
Chinesisch UniCNS-UCS2-V
UniCNS-UTF16-H Unicode-Encoding (UTF-16BE) für die Character Collection Adobe CNS1.
UniCNS-UTF16-V Enthält Zuordnungen für alle HKSCS-2001 (2- und 4-Byte-Zeichencodes)
B5pc-H, -V Macintosh, Big-Five-Zeichensatz, Big-Five-Encoding, Script Manager Code 2
HKscs-B5-H Hong Kong SCS (Supplementary Character Set), eine Erweiterung von Big-
HKscs-B5-V Five-Zeichensatz und -Encoding
ETen-B5-H, -V Microsoft Codepage 950 (Charset 136), Big-Five mit ETen-Erweiterungen
ETenms-B5-H Wie ETen-B5-H, ersetzt aber lateinische Zeichen halber Breite durch
ETenms-B5-V proportionale Zeichen
CNS-EUC-H, -V CNS-11643-1992-Zeichensatz, EUC-TW-Encoding
Japanisch UniJIS-UCS2-H Unicode-Encoding (UCS-2) für die Character Collection Adobe Japan1
UniJIS-UCS2-V
UniJIS-UCS2-HW-H Wie UniJIS-UCS2-H, ersetzt aber proportionale lateinische Zeichen durch
UniJIS-UCS2-HW-V Zeichen halber Breite
UniJIS-UTF16-H Unicode-Encoding (UTF-16BE) für die Character Collection Adobe Japan1.
UniJIS-UTF16-V Enthält Zuordnungen für alle Zeichen im JIS-X-0213:1000-Zeichensatz.
83pv-RKSJ-H Mac, JIS-X-0208 mit KanjiTalk6-Erweiterungen, Shift-JIS, Script Manager Code 1
90ms-RKSJ-H Microsoft Codepage 932 (Charset 128), JIS-X-0208-Zeichensatz mit NEC-
90ms-RKSJ-V und IBM-Erweiterungen
90msp-RKSJ-H Wie 90ms-RKSJ-H, ersetzt aber lateinische Zeichen halber Breite durch
90msp-RKSJ-V proportionale Zeichen
90pv-RKSJ-H Mac, JIS-X-0208 mit KanjiTalk7-Erweiterungen, Shift-JIS, Script Manager Code 1
Add-RKSJ-H, -V JIS-X-0208-Zeichensatz mit Fujitsu FMR-Erweiterungen, Shift-JIS-Encoding
EUC-H, -V JIS-X-0208-Zeichensatz, EUC-JP-Encoding
Ext-RKSJ-H, -V JIS-C-6226-Zeichensatz (JIS78) mit NEC-Erweiterungen, Shift-JIS-Encoding
Hinweis Manche PDFlib-Funktionen ändern ihre Bedeutung mit der Schreibrichtung. Beispielsweise soll-
te PDF_continue_text( ) nicht bei vertikaler Schreibrichtung verwendet werden. Außerdem
muss der Zeichenabstand negativ sein, um die Zeichen bei vertikaler Schreibrichtung weiter
voneinander zu trennen. Einzelheiten hierzu finden Sie bei den jeweiligen Funktionsbeschrei-
bungen.
Diese Einschränkungen beziehen sich auf Standard-CJK-Fonts. Beachten Sie, dass die
Länge von CJK-Text zwar nicht abgefragt werden kann, in der PDF-Ausgabe aber trotz-
dem korrekt generiert wird. Für benutzerspezifische CJK-Fonts gelten diese Einschrän-
kungen nicht.
Hinweis Die CMaps UniJIS-UCS2-HW-H/V werden fälschlicherweise als äquidistant behandelt. Dieses
Problem wird in zukünftigen Versionen behoben sein.
Die Option monospace sollte nur bei Standard-CJK-Schriften zum Einsatz kommen.
Hinweis Vertikale Schreibrichtung wird für benutzerspezifische CJK-Fonts im TrueType-Format nicht un-
terstützt.
Tabelle 4.8 Beispiele für CJK-Codepages in Windows (muss mit textformat=auto verwendet werden)
Sprache Codepage Format Zeichensatz
Einfaches Chinesisch cp936 GBK GBK
Traditionelles cp950 Big Five Big Five mit Microsoft-Erweiterungen
Chinesisch
Japanisch cp932 Shift-JIS JIS X 0208:1997 mit Microsoft-Erweiterungen
Koreanisch cp949 UHC KS X 1001:1992, restliche 8822 Hangul als Erweiterung
cp1361 Johab Johab
Zugriff auf einzelne Schriften einer TrueType Collection (TTC). TTC-Dateien enthalten
viele einzelne Schriften. Auf jede Schrift können Sie über den korrekten Namen zugrei-
fen. Wenn Sie jedoch nicht wissen, welche Schriften in einer TTC-Datei enthalten sind,
können Sie diese numerisch adressieren, indem Sie einen Doppelpunkt sowie den Index
der Schrift in der TTC-Datei (beginnend bei 0) anhängen. Die TTC-Datei msgothic.ttc ent-
hält beispielsweise mehrere Schriften, die sich in PDF_load_font( ) wie folgt adressieren
lassen (alle Einträge in einer Zeile können äquivalent benutzt werden):
msgothic:0 MS Gothic msgothic:
msgothic:1 MS PGothic
msgothic:2 MS UI Gothic
Beachten Sie, dass msgothic (ohne Suffix) keinen Schriftnamen darstellt, da er die Schrift
nicht eindeutig bezeichnet. In Kombination mit TTC-Indizierung können Alias-Namen
für Schriften verwendet werden (siehe Abschnitt 4.3.1, »Wie PDFlib nach Fonts sucht«,
Seite 93). Ist eine Schrift mit dem angegebenen Index nicht auffindbar, wird eine Excep-
tion ausgelöst, sofern fontwarning=true.
Die TTC-Schriftdatei muss nur einmal konfiguriert werden; alle in der TTC-Datei in-
dizierten Schriften werden automatisch gefunden. Mit folgendem Code lassen sich alle
in msgothic.ttc indizierten Schriften konfigurieren:
PDF_set_parameter(p, "FontOutline", "msgothic=msgothic.ttc")
Dieses Codefragment platziert die Textbox in der Mitte unten (position {50 0}) auf dem
Referenzpunkt (297, 0).
Platzieren rechts oben. Nun platzieren wir den Text am Referenzpunkt so, dass die
Textbox mit der oberen rechten Ecke auf dem Punkt zu liegen kommt (siehe Abbildung
4.5).
PDF_fit_textline(p, text, 595, 842, "position 100");
Kraxi
128 Kapitel 4: Textausgabe
Dieses Codefragment platziert die Textbox mit der rechten oberen Ecke (position 100)
auf dem Punkt (595, 842).
Platzieren mit Rand. Wir können das vorige Beispiel erweitern und den Text zusätz-
lich in der Breite mit einem Rand versehen, um einen definierten Abstand nach rechts
zu gewährleisten. Dies kann sinnvoll sein, um Text in Tabellenspalten zu platzieren.
PDF_fit_textline(p, text, 595, 842, "position 100 margin {20 0}");
Dieses Codefragment platziert den Text mittig (position 50) in einer Box, die ihre linke
untere Ecke am Punkt (10, 200) hat und 500 Punkt breit und 220 Punkt hoch ist (boxsize
{500 220}).
Proportionales Einpassen in eine Box. Wir erweitern das vorige Beispiel und passen
den Text zusätzlich in die Box ein (siehe Abbildung 4.7):
PDF_fit_textline(p, text, 10, 200, "boxsize {500 220} position 50 fitmethod meet");
Beachten Sie, dass sich die Schriftgröße ändert, wenn Sie den Text mit fitmethod meet in
die Box einpassen. Um dies zu verhindern, können Sie auto statt meet verwenden.
Vollständiges Einpassen in eine Box. Das vorige Beispiel lässt sich etwas modifizieren,
indem der Text nicht proportional, sondern so in die Box eingepasst wird, dass er diese
vollständig ausfüllt. Da der Text dabei in der Regel seine Proportionen verliert, kommt
dieser Fall eher selten zur Anwendung (siehe Abbildung 4.8):
PDF_fit_textline(p, text, 10, 200, "boxsize {500 220} position 50 fitmethod entire");
Dieses Codefragment richtet den Text nach Westen aus (90 Grad gegen den Uhrzeiger-
sinn) und verschiebt dann die linke untere Ecke des gedrehten Texts auf den Referenz-
punkt (5, 5).
Ausrichtung an einer vertikalen Strecke. Ein extremer Fall, der aber durchaus sinnvoll
sein kann, besteht darin, den Text entlang einer Strecke zu positionieren (siehe Abbil-
dung 4.10):
PDF_fit_textline(p, text, 0, 0, "boxsize {0 600} position {0 50} orientate west");
Dieses Codefragment dreht den Text und platziert ihn an die Mitte der Strecke von (0, 0)
bis (0, 600).
Abb. 4.11
Formatierung von
Textflüssen
Kraxi Systems, Inc.
Paper Planes
17, Aviation Road
Paperfield
Phone 7079-4301
Fax 7079-4302
info@kraxi.com
Kraxi Systems, Inc. 17, Aviation Road Paperfield www.kraxi.com
John Q. Doe
255 Customer Lane
Suite B
12345 User Town
Everland
INVOICE 14.03.2004
hortabmethod ruler
tabalignment right left right right right
ruler 30 45 275 375 475
ITEM DESCRIPTION QUANTITY PRICE AMOUNT
1 Super Kite 2 20,00 40,00
2 Turbo Flyer 5 40,00 200,00
3 Giga Trash 1 180,00 180,00
4 Bare Bone Kit 3 50,00 150,00
5 Nitty Gritty 10 20,00 200,00
6 Pretty Dark Flyer 1 75,00 75,00
7 Free Gift 1 0,00 0,00
845,00
leftindent Terms of payment: 30 days net. 30 days warranty starting at the day of sale. This
warranty covers defects in workmanship only. Kraxi Systems, Inc., at its option, repairs or alignment
= 55 replaces the product under warranty. This warranty is not transferable. Returns or = left
exchanges are not possible for wet products.
3. C one H e a d R oc ke t
This paper arrow can be thrown with big swing. We launched it from
the roof of a hotel. It stayed in the air a long time and covered a
considerable distance.
4. Super Dart
The super dart can fly giant loops with a radius of 4 or 5 meters and
cover very long distances. Its heavy cone point is slightly bowed
upwards to get the lift required for loops.
Ein mehrzeiliger Textfluss wird in eines oder mehrere Rechtecke – die so genannte Fit-
box – auf einer oder mehreren Seiten platziert. Zur Platzierung des Textflusses sind fol-
gende Schritte erforderlich:
> Die Funktion PDF_create_textflow( ) analysiert den Text, erzeugt ein Textflussobjekt
und gibt ein Handle zurück. Dabei wird noch kein Text auf der Seite platziert.
> Die Funktion PDF_fit_textflow( ) platziert den Textfluss ganz oder teilweise in der
übergebenen Fitbox. Um den Textfluss vollständig zu platzieren, muss dieser Schritt
möglicherweise mehrmals wiederholt werden, wobei jeweils eine neue Fitbox – ent-
weder auf derselben oder einer neuen Seite – übergeben wird.
> Die Funktion PDF_delete_textflow( ) löscht das Textflussobjekt nach seiner vollständi-
gen Platzierung.
Die Funktion PDF_create_textflow( ) zur Erzeugung eines Textflusses bietet eine Fülle
von Optionen zur Steuerung der Formatierung. Diese können entweder in der Options-
liste übergeben oder aber als »Inline«-Optionen in den Text eingebettet werden. Die
Platzierung eines Textflusses wird im Folgenden anhand einiger häufig vorkommender
Anwendungsbeispiele erläutert. Eine vollständige Auflistung aller Optionen finden Sie
in Tabelle 8.24.
Viele der Optionen, die in PDF_create_textflow( ) genutzt werden können, sind mit de-
nen für PDF_fit_textline( ) identisch. Sie sollten sich deshalb bereits die Beispiele in Ab-
schnitt 4.8, »Platzieren und Einpassen von einzeiligem Text«, Seite 128, angesehen ha-
ben. Wir werden hier nur Optionen beschreiben, die sich auf mehrzeiligen Text
beziehen.
Platzierung über mehrere Seiten. Passt ein mit PDF_fit_textflow( ) ausgegebener Text-
fluss nicht vollständig in die Fitbox, muss unter Umständen eine neue Seite erzeugt
werden. Ein Codefragement zur Platzierung eines Textflusses über mehrere Seiten hat
generell folgendes Aussehen:
textflow = PDF_create_textflow(p, text, 0, optlist);
do
{
PDF_begin_page_ext(p, pagewidth, pageheight, "");
result = PDF_fit_textflow(p, textflow, left_x, left_y, right_x, right_y, "");
PDF_end_page_ext(p, "");
} while (strcmp(result, "_stop"))
PDF_delete_textflow(p, textflow);
Abb. 4.13 Terms of payment: 30 days net. 30 days warranty starting at the day of
Einfache Platzierung sale. This warranty covers defects in workmanship only. Kraxi Systems,
eines Textflusses Inc., at its option, repairs or replaces the product under warranty. This
warranty is not transferable. Returns or exchanges are not possible for
wet products.
rechts um 10 Einheiten. Die erste Zeile jedes Absatzes soll zusätzlich um 20 Einheiten
eingerückt sein. Als Textausrichtung wählen wir Blocksatz, und den Abstand zwischen
den einzelnen Zeilen erhöhen wir auf 140%. Außerdem reduzieren wir die Schriftgröße
auf 8 Einheiten. Der erweitere Code mit Optionsliste lautet dann wie folgt (das Ergebnis
sehen Sie in Abbildung 4.15):
/* Stelle Optionsliste zusammen */
char optlist[256] =
"leftindent=15 rightindent=10 parindent=20 alignment=justify "
"leading=140% fontname=Helvetica fontsize=8 encoding=winansi"
Die Zeichen zur Klammerung von Optionslisten können mit den Optionen begoptlist-
char und endoptlistchar umdefiniert werden (siehe Tabelle 8.24). Wenn Sie für die Option
begoptlistchar das Schlüsselwort none übergeben, wird die Ermittlung von Optionslisten
unterbunden. Dies ist zum Beispiel sinnvoll, wenn der Text keine Inline-Optionslisten
enthält und Sie gewährleisten möchten, dass »<« und »>« als normale Zeichen interpre-
tiert werden.
Explizites Setzen von Optionen. Beachten Sie, dass alle Optionen, die in Makros nicht
gesetzt werden, ihren alten Wert beibehalten. Um Nebenwirkungen durch unerwünsch-
te »Vererbung« von Optionen zu vermeiden, sollten Sie daher alle gewünschten Einstel-
lungen explizit in Makros festlegen. Dadurch stellen Sie sicher, dass sich die Makros un-
abhängig von der Reihenfolge oder Kombination mit anderen Optionslisten immer
gleich verhalten.
Andererseits können Sie diese Eigenschaft auch für Makros nutzen, um bestimmte
Einstellungen bewusst aus dem jeweiligen Kontext übernehmen, anstatt sie explizit
festzulegen. So könnte ein Makro zum Beispiel die Schriftart festlegen, ohne die Option
fontsize anzugeben. Die Schriftgröße entspricht dann automatisch der des vorangehen-
den Textes.
Inline-Optionen oder Optionen als Funktionsparameter? Bei der Ausgabe von Text-
flüssen ist es wichtig zu unterscheiden, ob der Text im Programm selbst kodiert ist oder
aus einer externen Quelle stammt und ob die Formatierung und der Text getrennt ge-
halten werden. Der reine Textinhalt stammt in der Regel aus einer externen Quelle,
etwa einer Datenbank. In der Praxis sind also die folgenden Anwendungsfälle zu be-
rücksichtigen:
> Inhalt aus externer Quelle, Formatierungsoptionen im Programm: Aus einer exter-
nen Datenbank kommen kleinere Textfragmente, die im Programmcode zusam-
mengesetzt und erst zur Laufzeit mit Formatierungsoptionen (im Funktionsaufruf)
angereichert werden.
> Inhalt und Formatierungsoptionen aus externer Quelle: Größere Textmengen ein-
schließlich der Formatierungsoptionen kommen aus einer externen Quelle. Die For-
matierung wird dabei durch Inline-Optionen im Text bereitgestellt, die einfache Op-
tionen oder Makros sein können. Bei der Verwendung von Makros ist zwischen
Makrodefinitionen und Makroaufrufen zu trennen. Daraus ergibt sich eine interes-
sante Mischform. Der Inhalt kommt von einer externen Quelle mit Makroaufrufen
zur Formatierung; die Makrodefinitionen werden aber erst zur Laufzeit zugemischt.
Mischt man die Markodefinitionen erst zur Laufzeit hinzu, kann man die Formatie-
rung mit minimalem Aufwand beeinflussen, ohne dass der extern zugelieferte Text
geändert werden muss. Zum Erstellen von Grußkarten könnte man zum Beispiel
verschiedene Stile definieren (via Makros), die der Karte einen romantischen, nüch-
ternen oder anderen Touch geben.
Das folgende Codefragment platziert die Tabelle, und zwar anhand der Optionen ruler
zur Definition der Tabulatorabstände, tabalignment für die Tabulatorausrichtung und
hortabmethod für die Methode zum Umgang mit Tabulatoren (das Ergebnis sehen Sie in
Abbildung 4.17):
/* Stelle Optionsliste zusammen */
char optlist[256] =
"ruler {30 150 250 350} "
"tabalignment {left right right right} "
"hortabmethod ruler leading=120% fontname=Helvetica fontsize=9 encoding=winansi";
hortabmethod ruler
tabalignment left right right right
ruler 30 150 250 350
Das Setzen und Zurücksetzen des Einzugs ist mühsam, zumal es in jedem Absatz erfor-
derlich ist. Die elegantere Variante arbeitet mit dem Makro list, das der Bequemlichkeit
halber das Makro indent verwendet, das als Konstante dient. Die Makros sind wie folgt
definiert:
<macro {
indent {25}
Mit der Option leftindent wird der linke Einzug festgelegt. Mit der Option parindent, die
genau dem negativen leftindent entspricht, wird der linke Einzug für die jeweils erste
Zeile eines Absatzes rückgängig gemacht. Mit den Optionen hortabsize, hortabmethod
und ruler wird der Tabulator festgelegt, der leftindent entspricht und bewirkt, dass der
Text nach der Nummer genau um leftindent eingerückt wird. Abbildung 4.19 zeigt die
Funktionsweise von parindent und leftindent.
leftindent = &indent
parindent = – &indent 1. Long Distance Glider: With this paper rocket you can send all your
messages even when sitting in a hall or in the cinema pretty near
the back.
2. Giant Wing: An unbelievable sailplane! It is amazingly robust and
can even do aerobatics. But it is best suited to gliding.
Abb. 4.19 3. Cone Head Rocket: This paper arrow can be thrown with big swing.
Nummerierte We launched it from the roof of a hotel. It stayed in the air a long
Liste mit Makros time and covered a considerable distance.
Ersetzung von Zeichen oder gleichartigen Zeichenfolgen. Mit der Option charmapping
können die Zeichen eines Textes bei der Ausgabe durch andere Zeichen ersetzt werden.
Beginnen wir mit einem einfachen Fall, in dem wir alle Tabulatorzeichen durch Leerzei-
chen ersetzen. Die charmapping-Option hierfür lautet:
charmapping {hortab space}
Dabei sind hortab und space symbolische Namen. Eine Liste aller unterstützten symboli-
schen Namen finden Sie in Tabelle 4.5. Für mehrere Ersetzungen können wir folgende
Ergänzung vornehmen, die jeden Tabulator und Zeilenumbruch durch ein Leerzeichen
ersetzt:
charmapping {hortab space CRLF space LF space CR space}
Jede beliebig lange Folge von Linefeed-Zeichen wird auf ein einziges Linefeed-Zeichen
reduziert:
charmapping {linefeed {linefeed -1}}
Jede Folge von CRLF-Kombinationen wird durch ein einziges Leerzeichen ersetzt:
charmapping {CRLF {space -1}}
Führen wird das letzte Beispiel etwas genauer aus. Angenommen, man erhält einen
Text, dessen Zeilen von anderer Software durch feste Zeilenumbrüche getrennt wurden
und deswegen nicht mehr richtig umbrechen. Man möchte die Umbrüche durch Leer-
zeichen ersetzen, um wieder einen Umbruch am Rand der Fitbox zu erhalten. Dazu er-
setzen wir beliebig lange Folgen von Zeilenumbrüchen durch ein einziges Leerzeichen.
Der zu verbessernde Text lautet:
To fold the famous rocket looper proceed as follows:
Take a sheet of paper. Fold it
lengthwise in the middle.
Then, fold down the upper corners. Fold the
To fold the famous rocket looper proceed as follows: Take a sheet of Unten: Umwandlung der Umbrü-
paper. Fold it lengthwise in the middle. Then, fold down the upper che mit der Option charmapping
corners. Fold the long sides inwards that the points A and B meet on
the central fold.
Das folgende Codefragment zeigt die Ersetzung der überflüssigen Umbrüche und For-
matierung des derart korrigierten Textes:
/* Stelle Optionsliste zusammen */
strcpy(optlist, "fontname=Helvetica fontsize=9 encoding=winansi alignment=justify ");
strcat(optlist, "charmapping {CRLF {space -1}}");
/* Platziere Textfluss in Fitbox */
textflow = PDF_create_textflow(p, text, 0, optlist);
PDF_fit_textflow(p, textflow, left_x, left_y, right_x, right_y, "");
PDF_delete_textflow(p, textflow);
Abbildung 4.20 zeigt die Ausgabe des unveränderten Textes und seine »Reparatur« mit
Hilfe der Option charmapping.
Der folgende Text enthält zwischen lateinischen Zeichen ein Zeichen aus der Schrift
Symbol:
<fontname=Helvetica fontsize=12 encoding=winansi>Der griechische Buchstabe
<fontname=Symbol encoding=builtin textlen=1>A
<fontname=Helvetica encoding=winansi> steht für den Anfang.
Our paper planes are the ideal way of Our paper planes are the ideal way of
passing the time. We offer revolu- passing the time. We offer revolutionary
tionary brand new developments of the brand new developments of the
traditional common paper planes. If traditional common paper planes. If
your lesson, conference, or lecture turn your lesson, conference, or lecture turn
out to be deadly boring, you can have out to be deadly boring, you can have
a wonderful time with our planes. All a wonderful time with our planes. All
our models are folded from one paper our models are folded from one paper
sheet. They are exclusively folded sheet. They are exclusively folded
without using any adhesive. Several without using any adhesive. Several
models are equipped with a folded models are equipped with a folded
landing gear enabling a safe landing landing gear enabling a safe landing
on the intended location provided that on the intended location provided that
you have aimed well. Other models are you have aimed well. Other models are
able to fly loops or cover long dist- able to fly loops or cover long
ances. Let them start from a vista point distances. Let them start from a vista
in the mountains and see where they point in the mountains and see where
touch the ground. they touch the ground.
Fehlt die Option textlen bei Symbolsequenzen oder wird keine Inline-Optionsliste direkt
nach der Symbolsequenz übergeben, wird eine Exception ausgelöst.
4.9.7 Trennung
PDFlib trennt Text nicht automatisch, kann Wörter aber an Stellen trennen, die im Text
explizit mit weichen Trennzeichen (soft hyphen) markiert sind. Das weiche Trennzei-
chen befindet sich in Unicode an Position U+00AD. In von Unicode verschiedenen Um-
gebungen kann das weiche Trennzeichen unterschiedlich festgelegt werden:
> In den Zeichensätzen cp1250 – cp1258 (einschließlich winansi) und iso8859-1 – iso8859-
16 entspricht das weiche Trennzeichen dezimal 173, oktal 255 bzw. hexadezimal
0xAD.
> Im Zeichensatz ebcdic entspricht das weiche Trennzeichen dezimal 202, oktal 312 bzw.
hexadezimal 0xCA.
> Wenn ein Zeichensatz (z.B. macroman) über keine weichen Trennzeichen verfügt,
kann eine Entity-Referenz verwendet werden: ­ (siehe Abschnitt 4.5.5, »Charac-
ter-Referenzen«, Seite 111)
Außer an den Trennstellen, die durch weiche Trennzeichen gekennzeichnet sind, müs-
sen Wörter manchmal gewaltsam getrennt werden, wenn andere Methoden der Anpas-
sung, etwa das Ändern des Wortabstands oder Stauchen des Textes, nicht durchführbar
sind.
Blocksatz mit und ohne Trennzeichen. Im ersten Beispiel soll der folgende Text, der be-
reits mit Softhyphens versehen ist, im Blocksatz ausgegeben werden (die Softhyphen-
Zeichen sind hier der Deutlichkeit halber als kleine Balken dargestellt):
Our paper planes are the ideal way of pas sing the time. We offer revolu tionary
brand new dev elop ments of the tradi tional common paper planes. If your lesson,
Abbildung 4.21 zeigt die Ausgabe des Textes mit Standardeinstellungen für den Block-
satz. Die Ausgabe ist tadellos, da die Voraussetzungen optimal sind: Die Fitbox ist breit
genug und es sind explizit im Text gesetzte Trennzeichen vorhanden. Wie Abbildung
4.22 zeigt, erhalten Sie in einer breiten Fitbox mit Standardeinstellungen auch dann
eine gute Ausgabe, wenn im Text keine expliziten Trennzeichen vorhanden sind. Die
Optionsliste lautet in beiden Fällen einfach:
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify
1. Für interessierte Leser sei darauf hingewiesen, dass sich PDFlib an die Empfehlungen in »Unicode Standard Annex #14:
Line Breaking Properties« anlehnt (siehe www.unicode.org/reports/tr14). PDFlib berücksichtigt keine combining marks.
Umruchregeln. Wenn ein Wort bzw. eine andere Zeichenfolge zwischen zwei Leerzei-
chen nicht vollständig in die Zeile passt, muss es in die nächste Zeile umgebrochen wer-
den. Dabei entscheidet der Umbruchalgorithmus, nach welchen Zeichen innerhalb ei-
ner Zeilenfolge ein Umbruch möglich ist.
Eine Formel wie -12+235/8*45 wird zum Beispiel nie umgebrochen, während der
String PDF-345+LIBRARY nach dem Minuszeichen in die nächste Zeile gestellt werden
kann. Nach weichen Trennzeichen (soft hyphen), sofern sie im Text bereits vorhanden
sind, kann ebenfalls ein Umbruch erfolgen.
Bei Klammern wird zwischen schließender und öffnender Klammer unterschieden,
wobei auch Anführungszeichen wie Klammern behandelt werden. Nach einer öffnen-
den Klammer wie »(« wird nicht umgebrochen. Bei Anführungszeichen wird mittels Bi-
lanzierung ermittelt, ob es sich um ein öffnendes oder schließendes Zeichen handelt.
Unter einem potentiellen Zeilenumbruch verstehen wir eine Stelle im Text, an der
die Textflow-Engine bei Bedarf eine Zeile beenden und den nachfolgenden Text in die
nächste Zeile schieben kann. Leerzeichen zwischen Text stellen immer einen potentiel-
len Zeilenumbruch dar. Inline-Optionslisten stellen grundsätzlich keinen potentiellen
Zeilenumbruch dar (damit man Optionen auch innerhalb eines Worts ändern kann). Be-
finden sich jedoch vor und nach der Optionsliste Leerzeichen, kann zu Beginn der Opti-
onsliste ein Umbruch erfolgen. Wird vor der Optionsliste umgebrochen und ist
alignment=justify, werden Leerzeichen vor der Optionsliste entfernt. Leerzeichen nach
der Optionsliste bleiben erhalten und werden an den Anfang der nächsten Zeile positio-
niert.
Blocksatz in schmaler Fitbox. Mit den Optionen zur Steuerung des Blocksatzes müs-
sen Sie sich in der Regel um so mehr auseinander setzen, je schmaler die Fitbox ist. Ab-
bildung 4.23 illustriert an einer schmalen Fitbox, an welchen Stellen die Blocksatz-
Methoden und Optionen besondere Wirkung zeigen. In Abbildung 4.23 sind die Einstel-
lungen der drei Optionen an sich in Ordnung, lediglich maxspacing legt einen etwas
großzügigen maximalen Wortabstand fest. Dies sollte man bei sehr schmaler Fitbox je-
doch belassen, da sonst die hässliche (durch die Methode split verursachte) Zwangstren-
nung häufiger zur Anwendung kommt.
Ist die Fitbox so schmal, dass hin und wieder zwangsweise getrennt wird, sollten Sie
entweder das Einfügen expliziter »weicher« Trennzeichen erwägen oder die Blocksatz-
Optionen verändern.
Blocksatz-Option shrinklimit. Am unauffälligsten für das Auge ist es, die Option
shrinklimit zu verkleinern, die festlegt, auf wieviel Prozent seiner normalen Breite Text
durch die Methode shrink maximal gestaucht werden darf. Abbildung 4.24 zeigt, wie sich
Zwangstrennungen durch Stauchung auf bis zu 50% vermeiden lassen. Die Optionsliste
lautet:
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify shrinklimit=50%
Blocksatz-Option spreadlimit. Das Sperren von Text, das mit der Methode spread be-
werkstelligt und durch die Option spreadlimit zum Ändern des Zeichenabstands kon-
trolliert wird, ist ein weiteres Verfahren zur Beeinflussung des Zeilenumbruchs. Dieses
optisch sehr auffällige Verfahren kommt aber nur selten zum Einsatz. Abbildung 4.25
zeigt einen der Deutlichkeit halber sehr auffälligen maximalen Zeichenabstand von 5
Einheiten. Die Optionsliste lautet:
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify spreadlimit=5
Blocksatz-Option nofitlimit. Mit der Option nofitlimit schließlich können Sie bestim-
men, wie kurz der Text in einer Zeile minimal werden darf, wenn die Methode nofit zur
Anwendung kommt. Eine Verkleinerung des Standardwertes von 75% ist bei sehr
schmalen Zeilen einer Zwangstrennung vorzuziehen. Abbildung 4.26 zeigt die Ausgabe
des Textes mit einer minimalen Textbreite von 50%. Die Optionsliste lautet:
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify nofitlimit=50
PDF_fit_image( ) erhält als letztes Argument eine Optionsliste mit verschiedenen Optio-
nen zur Positionierung, Skalierung und Rotation des Bildes. Weitere Informationen
hierzu finden Sie in Abschnitt 5.3, »Platzieren von Bildern und importierten PDF-Sei-
ten«, Seite 159.
Skalierung und dpi-Berechnung. PDFlib ändert die Pixelanzahl eines importierten Bil-
des nie. Beim Skalieren werden die Bildpunkte entweder vergrößert oder verkleinert, es
findet jedoch keinerlei Downsampling statt (die Pixelanzahl des Bildes bleibt immer
gleich). Der Skalierungsfaktor 1 bewirkt eine Pixelgröße von einer Einheit in benutzer-
spezifischen Koordinaten. Anders ausgedrückt: das Bild wird mit seiner Originalauflö-
sung (oder 72 dpi, falls das Bild keine Auflösungsangabe enthält) importiert, wenn das
benutzerspezifische Koordinatensystem nicht skaliert wurde (da ein Zoll 72 Punkt ent-
spricht).
Farbraum importierter Bilder. Außer beim Hinzufügen oder Entfernen von ICC-Profi-
len oder Anwenden einer Schmuckfarbe unter Verwendung der Optionen für PDF_load_
image( ), versucht PDFlib in der Regel, den Farbraum importierter Bilder zu erhalten.
Dies ist jedoch bei einigen seltenen Kombinationen nicht möglich, zum Beispiel bei
YCbCr in TIFF.
PDFlib führt keine Konvertierung zwischen RGB und CMYK durch. Wo dies erforder-
lich ist, muss die Konvertierung vor dem Laden des Bildes in PDFlib erfolgen.
PNG-Bilder. PDFlib unterstützt alle Varianten von PNG-Bildern (ISO 15948). PNG-Bilder
werden meistens im Pass-Through-Modus verarbeitet. PNG-Bilder, die das Zeilen-
sprungverfahren (Interlacing) nutzen oder einen Alphakanal enthalten (der in jedem Fall
verlorengeht, siehe unten), müssen dekomprimiert werden, was bedeutend länger dau-
ert als der Pass-Through-Modus. Enthält ein PNG-Bild Transparenzinformationen, so
JPEG-Bilder. JPEG-Bilder (ISO 10918-1) sind immer komprimiert, aber manche Varian-
ten müssen für die korrekte Anzeige in Acrobat transkodiert werden. Bei wichtigen Ty-
pen von JPEG-Bildern erfolgt die Transkodierung in PDFlib automatisch, sie kann aber
auch über die Option passthrough für PDF_load_image( ) gesteuert werden. PDFlib unter-
stützt folgende Varianten von JPEG-Bildern:
> Graustufen, RGB-Farbe (gewöhnlich als YCbCr kodiert) und CMYK-Farbe
> Baseline-Kompressionsmodus von JPEG, der in der überwiegenden Mehrheit der
JPEG-Bilder verwendet wird
> Progressive-Kompressionsmodus von JPEG
JPEG2000-Bilder. JPEG2000-Bilder (ISO 15444-2) erfordern PDF ab Version 1.5 und wer-
den immer im Pass-Through-Modus verarbeitet. PDFlib unterstützt JPEG2000-Bilder
wie folgt:
> Es werden JP2- und JPX-Baseline-Bilder (üblicherweise *.jp2 oder *.jpf) unterstützt,
wobei die Bedingungen bezüglich des Farbraums berücksichtigt werden (siehe un-
ten). Alle gültigen Werte für die Farbtiefe werden unterstützt.
> Es werden folgende Farbräume unterstützt: sRGB, sRGB-grey, ROMM-RGB, sYCC,
e-sRGB, e-sYCC, CIELab, ICC-basierte Farbräume (eingeschränktes und vollständiges
ICC-Profil) und CMYK. PDFlib verändert den ursprünglichen Farbraum der
JPEG2000-Bilddatei nicht.
> Auf Bilder, die eine Maske enthalten, kann die Option mask angewandt werden. Eine
derart vorbereitete Maske kann dann auf andere Bilder angewandt werden.
> Externe ICC-Profile können auf ein JPEG2000-Bild nicht angewendet werden, d.h. die
Option iccprofile darf nicht benutzt werden. In der JPEG2000-Bilddatei vorhandene
ICC-Profile bleiben immer erhalten, d.h. die Option honoriccprofile ist immer true.
> Die Option colorize wird für JPEG2000-Bilder nicht unterstützt.
Hinweis Reine JPEG2000-Codestreams ohne JPX-Wrapper (oft *.j2k) und JPM-Bilddateien gemäß
ISO 15444-6 (meist *.jpm) werden nicht unterstützt.
GIF-Bilder. PDFlib unterstützt alle GIF-Varianten (insbesondere GIF 87a und 89a) mit
interlaced und non-interlaced Pixeldaten sowie jede Palettengröße. GIF-Bilder werden im-
mer mit Flate-Kompression komprimiert.
TIFF-Bilder mit mehreren Streifen (multi-strip) werden zu mehreren Bildern in der PDF-
Datei konvertiert, die genau wie das Original aussehen, aber mit dem TouchUp-
Objektwerkzeug getrennt selektiert werden können. Diese Art von TIFF-Bildern lässt
sich mit dem Befehlszeilenprogramm tiffcp aus dem TIFFlib-Paket1 in Bilder mit einem
Streifen (»single-strip«) umwandeln. Das Tool ImageMagick2 erzeugt prinzipiell single-
strip TIFF-Bilder.
PDFlib interpretiert normalerweise das orientation-Tag, mit dem in TIFF-Dateien die
gewünschte Bildorientierung festgelegt wird. Durch Setzen der Option ignoreorientation
auf true kann PDFlib angewiesen werden, dieses Tag zu ignorieren (was in vielen An-
wendungen der Fall ist). Manche TIFF-Eigenschaften (zum Beispiel Schmuckfarbe) und
bestimmte Merkmalskombinationen (zum Beispiel CMYK-Bilder mit Maske) werden
nicht unterstützt. TIFF-Bilder mit JPEG-Kompression werden zwar generell unterstützt,
manche so genannte Old-Style-Varianten sind davon jedoch ausgenommen.
1. Siehe www.libtiff.org
2. Siehe www.imagemagick.org
Hinweis Die Maske muss die selbe Ausrichtung wie das zugrundeliegende Bild haben; anderenfalls wird
sie zurückgewiesen. Da die Ausrichtung vom Dateiformat des Bildes sowie anderen Faktoren
abhängt, ist sie nicht einfach zu entdecken. Aus diesem Grund ist es empfehlenswert, die Maske
und das Bild mit derselben Software in demselben Dateiformat zu erstellen.
Explizite Transparenz. Im expliziten Fall sind zwei Schritte erforderlich, die jeweils
auch Bildoperationen erfordern. Zuerst muss ein Bild zur späteren Verwendung als
Transparenzmaske vorbereitet werden. Dies lässt sich durch Öffnen des Bildes mit der
Option mask bewerkstelligen. In PDF 1.3, wo nur 1-Bit-Masken unterstützt werden, ist
diese Option zwingend erforderlich; in PDF 1.4 dagegen ist sie optional. Die folgende Art
von Bildern kann zum Anlegen einer Maske verwendet werden:
> PNG-Bilder
> TIFF-Bilder (nur single-strip)
Überall dort, wo sich in der Maske der Pixelwert o (null) befindet, wird der entsprechen-
de Bereich des maskierten Bildes gezeichnet, während der Wert 1 den Hintergrund
durchscheinen lässt. Sind mehr als 1 Bit pro Pixel vorhanden, mischen die zwischenlie-
genden Werte das Vordergrundbild mit dem Hintergrund und bewirken so einen Trans-
parenzeffekt. Im zweiten Schritt wird diese Maske auf ein anderes Bild angewandt, das
über eine der Bildfunktionen bezogen wurde:
mask = PDF_load_image(p, "png", maskfilename, 0, "mask");
if (mask == -1)
return;
sprintf(optlist, "masked %d", mask);
image = PDF_load_image(p, type, filename, optlist)
if (image == -1)
return;
PDF_fit_image(p, image, x, y, "");
Hinweis PDFlib konvertiert »multi-strip« TIFF-Bilder in mehrere PDF-Bilder, die dann einzeln maskiert
würden. Da dies in der Regel aber nicht beabsichtigt ist, wird diese Art von Bildern sowohl als
Maske als auch zur Maskierung abgelehnt. Außerdem ist es wichtig, implizite und explizite Fäl-
le nicht zu vermischen, das heißt keine Bilder mit transparenten Farbwerten als Maske zu ver-
wenden.
Bildmasken. Bildmasken sind Bilder mit einer Bittiefe von 1 (Bitmaps), in denen die
Bits mit dem Wert 0 als transparent behandelt werden: Der auf der Seite vorhandene In-
halt scheint durch die transparenten Bestandteile des Bildes hindurch. Pixel mit dem
Wert 1 dagegen werden mit der aktuellen Füllfarbe eingefärbt. Die folgenden Arten von
Bildern können als Bildmasken verwendet werden:
> PNG-Bilder
> TIFF-Bilder
> JPEG-Bilder (nur als Transparenzmasken, siehe unten)
> BMP; beachten Sie, dass Ausrichtung von BMP-Bildern anders als bei den übrigen
Bildtypen ist. BMP-Bilder müssen deshalb erst an der X-Achse gespiegelt werden, be-
vor Sie als Maske einsetzbar sind.
> Bildrohdaten
Bildmasken werden einfach mit der Option mask geöffnet und auf der Seite platziert,
nachdem die gewünschte Füllfarbe gesetzt wurde:
mask = PDF_load_image(p, "tiff", maskfilename, 0, "mask");
PDF_setcolor(p, "fill", "rgb", (float) 1, (float) 0, (float) 0, (float) 0);
if (mask != -1) {
PDF_fit_image(p, mask, x, y, "");
}
Bei Bildern, die mit RGB-Farbpalette arbeiten, ist ein Einfärben nur sinnvoll, wenn die
Palette ausschließlich Graustufenwerte enthält und der Palettenindex dem Graustufen-
wert entspricht.
Um ein Bild mit einer Schmuckfarbe einzufärben, müssen Sie beim Laden des Bildes
den Parameter colorize und ein Handle für die gewünschte Schmuckfarbe übergeben,
welches von PDF_makespotcolor( ) zurückgegeben wurde:
PDF_setcolor(p, "both", "cmyk", 1, .79, 0, 0);
spot = PDF_makespotcolor(p, "PANTONE Reflex Blue CV", 0);
sprintf(optlist, "colorize %d", spot);
image = PDF_load_image(p, "tiff", "image.tif", 0, optlist)
if (image != -1) {
PDF_fit_image(p, image, x, y, "");
}
Die Option page zeigt an, dass eine Datei mit mehreren Bildern verwendet werden soll.
Der letzte Parameter legt die Nummer des zu verwendenden Bildes fest, wobei das erste
Bild die Nummer 1 hat. Dieser Parameter kann so lange hochgesetzt werden, bis PDF_
load_image( ) den Wert -1 (bei imagewarning=false) zurückgibt, der anzeigt, dass keine
weiteren Bilder in der Datei vorhanden sind.
Mit einem Codefragment ähnlich dem Folgenden können Sie alle Bilder einer TIFF-
Datei in ein mehrseitiges PDF-Dokument konvertieren:
for (frame = 1; /* */ ; frame++) {
sprintf(optlist, "page %d", frame);
image = PDF_load_image(p, "tiff", filename, 0, optlist);
if (image == -1)
break;
PDF_begin_page(p, width, height);
PDF_fit_image(p, image, 0.0, 0.0, "");
PDF_close_image(p, image);
PDF_end_page(p);
}
5.1.6 OPI-Unterstützung
Beim Laden eines Bildes können im Aufruf von PDF_load_image( ) weitere Informatio-
nen für OPI (Open Prepress Interface) Version 1.3 oder 2.0 übergeben werden. PDFlib ak-
zeptiert alle Standard-PostScript-Kommentare für OPI 1.3 und 2.0 als Optionen (nicht als
PDF-Schlüsselwörter!) und reicht die übergebenen OPI-Informationen unverändert an
die generierte PDF-Ausgabe weiter. Das folgende Beispiel ergänzt ein Bild um OPI-Infor-
mationen:
optlist13 =
"OPI-1.3 { ALDImageFilename grosse_datei.tif "
"ALDImageDimensions {400 561} "
"ALDImageCropRect {10 10 390 550} "
"ALDImagePosition {10 10 10 540 390 540 390 10} }";
Hinweis Bei manchen OPI-Servern, wie zum Beispiel dem in Helios EtherShare, ist die OPI-Verarbeitung
für XObjects vom Typ Image, die PDFlib standardmäßig erzeugt, nicht sauber implementiert. In
solchen Fällen kann mit der Option template an PDF_load_image( ) die Generierung von XOb-
jects vom Typ Form erzwungen werden.
5.2 Import von PDF-Seiten mit PDI (PDF Import Library) 155
sen. Enthalten mehrere importierte Dokumente eingebettete Fontdaten derselben
Schrift, so werden die mehrfach vorhandenen Fonts von PDI nicht entfernt. Fehlen die
Schriften dagegen in einem importierten PDF, dann fehlen sie auch in der generierten
PDF-Ausgabe. Zur Optimierung sollten Sie das importierte Dokument so lange offen
halten, wie Sie noch Seiten daraus benötigen, damit dieselben Schriften nicht mehrmals
im Ausgabedokument eingebettet werden.
PDI lässt Farbinformationen des importierten PDF-Dokuments unverändert. Enthält
das PDF zum Beispiel ICC-Farbprofile, so werden diese auch in das generierte Ausgabe-
dokument übernommen.
PDFlib platziert importierte PDF-Seiten auf der Ausgabeseite mittels der Template-
Funktion. Da einige PDF-Programme von Drittanbietern die Template-Funktion nicht
korrekt unterstützen, kann es in von Acrobat verschiedenen Umgebungen gewisse Ein-
schränkungen geben (siehe Abschnitt 3.2.4, »Templates«, Seite 67).
Von PDFlib generierte Ausgabe, die importierte Seiten aus anderen PDF-Dokumen-
ten enthält, kann auch ein weiteres Mal mit PDFlib/PDI bearbeitet werden. Aufgrund
von Einschränkungen beim PostScript-Druck sollte die Verschachtelung nicht über
mehr als zehn Ebenen gehen.
Codefragmente zum Importieren von PDF-Seiten. Der Umgang mit Seiten aus vorhan-
denen PDF-Dokumenten ist mit sehr einfach strukturiertem Code möglich. Das folgen-
de Fragment öffnet eine vorhandene Dokumentseite und kopiert den Seiteninhalt auf
eine neue Seite des PDF-Ausgabedokuments (das vorher geöffnet werden muss):
int doc, page, pageno = 1;
char *filename = "input.pdf";
...
PDF_fit_pdi_page( ) erhält als letztes Argument eine Optionsliste, die zahlreiche Optio-
nen zur Positionierung, Skalierung und Drehung der importierten Seite unterstützt.
Weitere Informationen hierzu finden Sie in Abschnitt 5.3, »Platzieren von Bildern und
importierten PDF-Seiten«, Seite 159.
Alternativ dazu können Sie PDI mit der Option pdiusebox explizit anweisen, zur Ermitt-
lung der Größe der importierten Seite eine der Angaben MediaBox, CropBox, BleedBox,
TrimBox oder ArtBox zu verwenden, falls vorhanden (Einzelheiten hierzu finden Sie in
Tabelle 8.46).
Viele wichtige Eigenschaften, wie zum Beispiel die Seitengröße einer importierten
PDF-Seite, alle Box-Angaben oder die Anzahl der Seiten in einem Dokument können
über PDFlib-Parameter abgefragt werden. Alle relevanten Parameter sind in Tabelle 8.45
und Tabelle 8.46 aufgeführt. Diese Eigenschaften können bei Entscheidungen über die
Platzierung importierter PDF-Seiten auf der Ausgabeseite hilfreich sein. Auch die in Ab-
schnitt 5.3.1, »Skalierung, Ausrichtung und Drehung«, Seite 159, beschriebenen Funkti-
onsaufrufe können zur Skalierung importierter PDF-Seiten herangezogen werden.
Importierte PDF-Seiten mit Layern. In Acrobat 6 (PDF 1.5) wurde die Layer-Funktion
eingeführt (der technische Begriff ist optional content). PDI ignoriert alle in einer Datei
vorhandenen Layer-Informationen. Alle in der importierten Seite vorhandenen Layer
einschließlich der unsichtbaren sind in der generierten Ausgabe sichtbar.
PDF_open_pdi( ) und PDF_open_pdi_page( ) lösen dann eine Exception aus, wobei der Text
der Exception eine genauere Fehlerbeschreibung enthält. Folgende Arten von Doku-
menten können mit PDI nicht importiert werden:
> PDF-Dokumente, die eine höhere PDF-Versionsnummer aufweisen als die aktuell
generierte PDF-Ausgabe. Der Grund besteht darin, dass PDFlib nach dem Import
5.2 Import von PDF-Seiten mit PDI (PDF Import Library) 157
eines solchen Dokuments nicht mehr gewährleisten könnte, dass die Ausgabe auch
tasächlich der geforderten PDF-Version entspricht. Lösung: Setzen Sie die Version
der PDF-Ausgabe mit der Option compatibility in PDF_begin_document( ) entspre-
chend herauf.
> PDF-Dokumente mit einer PDF/X-Kompatibilitätsstufe, die nicht zum aktuellen
Ausgabedokument passt.
> Dateien mit beschädigter Querverweistabelle. Solche Dokumente erkennen Sie an
der Acrobat-Warnung Diese Datei ist beschädigt, wird jedoch repariert. Lösung: Öffnen
Sie die Datei in Acrobat und speichern Sie sie erneut.
Außerdem werden die folgenden Arten von PDF-Dokumenten abgelehnt; aus ihnen las-
sen sich keine Seiten importieren, mit der Option infomode gleich true können aber In-
formationen abgefragt werden:
> Verschlüsselte PDF-Dokumente ohne passendes Passwort.
> Tagged PDF, wenn die Option tagged in PDF_begin_document( ) gleich true ist.
In diesem Codefragement wird das Objekt mit der linken unteren Ecke am Punkt (80,
100) des Benutzerkoordinatensystems platziert. Diesen Punkt bezeichnen wir als Refe-
renzpunkt. Die Optionsliste (der letzte Funktionsparameter) ist leer, das heißt das Ob-
jekt wird in Originalgröße am angegebenen Punkt positioniert.
Platzierung mit Skalierung. Auch einfach verwendbar ist folgende Variation (siehe Ab-
bildung 5.2). Wir positionieren wie oben, variieren aber die Skalierung des Objekts:
PDF_fit_image(p, image, 80, 100, "scale 0.5");
Dieses Codefragment platziert das Objekt mit der linken unteren Ecke am Punkt (80,
100) des Benutzerkoordinatensystems. Das Objekt wird außerdem in x- und y-Richtung
um den Faktor 0,5 skaliert, das heißt auf 50% verkleinert.
Platzierung mit Ausrichtung. Im nächsten Codefragment richten wir obiges Objekt zu-
sätzlich nach Westen aus (siehe Abbildung 5.3).
PDF_fit_image(p, image, 80, 100, "scale 0.5 orientate west");
Dieses Codefragment richtet das Objekt nach Westen aus (90 Grad gegen den Uhrzeiger-
sinn) und verschiebt dann die linke untere Ecke des gedrehten Objekts auf den Refe-
renzpunkt (x, y). Das Objekt wird »in sich gedreht«.
Platzierung mit Drehung. Die Drehung eines Objekts (siehe Abbildung 5.4) vollzieht
sich ganz ähnlich wie die Ausrichtung. Sie wirkt sich aber nicht nur auf das platzierte
Objekt, sondern auf das ganze Koordinatensystem aus. Vor der Platzierung des Objekts
wird das Koordinatensystem im Referenzpunkt (x, y) um 90 Grad gegen den Uhrzeiger-
sinn gedreht. In (x, y) liegt dann die rechte untere Ecke des gedrehten Objekts (also die
linke untere Ecke des nicht gedrehten Objekts). Der Funktionsaufruf sieht in diesem Fall
wie folgt aus:
PDF_fit_image(p, image, 80, 100, "scale 0.5 rotate 90");
Da hier keine Verschiebung stattfindet, wird das Bild teilweise aus der Seite hinausge-
dreht.
Das folgende Codefragment legt die Seite in x- und y-Richtung um 40 Punkt größer an
als das Objekt. Man erhält eine Umrandung um das Objekt:
PDF_fit_image(p, image, 40, 40, "adjustpage");
Das folgende Codefragment wiederum legt die Seite in x- und y-Richtung um 40 Punkt
kleiner an als das Objekt. Das Objekt wird an den Seitenrändern beschnitten. Innerhalb
des Bildes bleibt so ein Rand von 40 Punkt Breite unsichtbar:
PDF_fit_image(p, image, -40, -40, "adjustpage");
Abb. 5.5
Option orientate
Abb. 5.6
Option rotate
Einpassen eines Objekts in eine Box. Betrachten wir zur Anwendung der Box zunächst
die Ausgabe eines Firmen-Logos auf der Seite rechts oben (siehe Abbildung 5.8). Die Ab-
messungen des Rechtecks, die das Logo ausfüllen soll, sind bekannt. Man weiß jedoch
nicht, wie das Logo skaliert werden muss, um das Rechteck unter Beibehaltung seiner
Proportionen möglichst gut auszufüllen (das Verhältnis von Breite zu Höhe soll nicht
verändert werden). Folgendes Fragment löst diese Aufgabe:
PDF_fit_image(p, image, 350, 700, "boxsize {200 100} position 0 fitmethod meet");
Dieses Codefragment platziert am Punkt (350, 700) die linke untere Ecke einer Box, die
200 Punkt breit und 100 Punkt hoch ist (boxsize {200 100}). Das Objekt wird mit der lin-
ken unteren Ecke in der Box links unten platziert (position 0) und so weit skaliert, bis es
in der Höhe und/oder der Breite exakt in die Box passt (fitmethod meet).
Dieses Konzept bietet ein breites Spektrum an Variationsmöglichkeiten. So kann mit
der Option position festgelegt werden, welcher Punkt innerhalb des Objekts als Refe-
renzpunkt (als prozentualer Anteil der Höhe bzw. der Breite) verwendet werden soll. Die
Option position legt auch den Referenzpunkt der Box fest. Sind die prozentualen Anga-
ben für Höhe und Breite gleich, so genügt es, nur einen Wert anzugeben. So kann mit
position 50 zum Beispiel der Mittelpunkt des Objekts sowie der Box als Referenzpunkt
für die Platzierung gewählt werden.
Beschneiden eines Objekts beim Einpassen in die Box. Durch zusätzliche Variation der
Option fitmethod können wir das Objekt so beschneiden, dass es genau in die Box passt
(siehe Abbildung 5.9). In diesem Fall findet keine Skalierung statt.
PDF_fit_image(p, image, 50, 80, "boxsize {100 400} position 50 fitmethod clip");
Dieses Codefragment platziert am Punkt (50, 80) eine Box, die 100 Punkt breit und 400
Punkt hoch ist (boxsize {100 400}). Das Objekt wird in der Box mittig (position 50) in Origi-
nalgröße platziert und beschnitten, wenn es über den Boxrand hinausreicht (fitmethod
clip).
Abb. 5.7
Anpassen der Seitengröße. Von links nach
rechts: exakt, vergrößert, verkleinert.
Anpassen eines Objekts an die Seite. Ein Objekt lässt sich problemlos an eine vorgege-
bene Seitengröße anpassen, indem die Seite als Box zur Platzierung des Objekts verwen-
det wird. Das folgende Codefragment zeigt ein Beispiel für eine A4-Seite, deren Größe
595 x 842 Punkt beträgt:
PDF_fit_image(p, image, 0, 0, "boxsize {595 842} position 0 fitmethod slice");
In diesem Codefragment wird eine Box in der linken unteren Ecke platziert, die genau
die Größe einer A4-Seite besitzt. Das Objekt wird links unten in die Box gelegt und so
weit proportional skaliert, bis es die Box und somit die Seite komplett ausfüllt. Wo das
Objekt über die Ränder der Box hinausreicht, wird es beschnitten. Man beachte, dass
hier im Gegensatz zu fitmethod clip mit der Option fitmethod slice eine Skalierung des
Objekts durchgeführt wird. Natürlich ließen sich auch hier die Optionen position und
fitmethod variieren.
Einpassen eines Logos in die Seite. Wie erstellen wir das gedrehte Firmen-Logo in Ab-
bildung 5.10? Das Logo ist um 90 Grad gegen den Uhrzeigersinn gedreht, beginnt in der
linken unteren Ecke und deckt die volle Seitenhöhe ab:
PDF_fit_image(p, image, 0, 0, "boxsize {595 842} orientate west fitmethod meet");
Abb. 5.10
Einpassen eines
Objekts in die Seite
Hinweis Zur Blockverarbeitung ist der PDFlib Personalization Server (PPS) erforderlich. PPS ist zwar in al-
len kommerziellen PDFlib-Paketen enthalten, Sie müssen dafür aber einen eigenen Lizenz-
schlüssel erwerben; ein Lizenzschlüssel für PDFlib oder PDFlib+PDI reicht nicht aus. Außerdem
ist das Block-Plugin für Adobe Acrobat erforderlich, um Blöcke in PDF-Templates interaktiv
anzulegen.
Hinweis Das Plugin enthält die Benutzeroberfläche in verschiedenen Sprachversionen und verwendet,
soweit möglich, dieselbe Sprache wie Acrobat selbst. Wird diese Sprache vom Plugin nicht un-
terstützt, verwendet es stattdessen Englisch.
Installation der Block-Plugins für Acrobat 5/6/7 unter Windows. Zur Installation des
Block-Plugins sowie des Plugins zur Konvertierung von PDF-Formularfeldern in Acrobat
5, 6 oder 7 kopieren Sie die Plugin-Dateien in ein Unterverzeichnis des Acrobat-Plugin-
Verzeichnisses. Dies wird von der Installationsroutine des Plugins automatisch durch-
geführt, kann aber auch manuell erfolgen. Unter Windows heißen die Dateien Block.api
und AcroFormConversion.api. Das Verzeichnis für die PDFlib-Plugins lautet üblicherweise
in etwa:
C:\Programme\Adobe\Acrobat 7.0\Acrobat\plug_ins\PDFlib Block Plugin
Installation der Block-Plugins für Acrobat 6/7 auf dem Mac. Bei Acrobat 6/7 ist der Plu-
gin-Ordner im Finder nicht sichtbar. Statt die Plugin-Dateien in den Plugin-Ordner zu
ziehen, gehen Sie wie folgt vor (beenden Sie Acrobat, falls geöffnet):
> Durch Doppelklick auf das Laufwerkssymbol extrahieren Sie die Plugin-Dateien in
einen Ordner.
> Suchen Sie im Finder nach dem Symbol für die Acrobat-Anwendung. Normalerweise
befindet es sich in einem Verzeichnis, das in etwa folgendermaßen lautet:
/Programme/Adobe Acrobat 7.0 Professional
Installation der Block-Plugins für Acrobat 5 auf dem Mac. Zur Installation der Plugins
für Acrobat 5 doppelklicken Sie auf das Laufwerkssymbol. Ziehen Sie den Ordner PDFlib
Block Plugin Acro 5-6 auf den Plugin-Ordner von Acrobat 5, der üblicherweise wie folgt
lautet:
/Programme/Acrobat 5.0/Plug-Ins
Fehlerbehebung. Falls das Block-Plugin nicht zu funktionieren scheint, stellen Sie si-
cher, dass unter Bearbeiten, Grundeinstellungen..., [Allgemein...], Programmstart (Acrobat 6/
7) bzw. Bearbeiten, Grundeinstellungen, Allgemein..., Optionen (Acrobat 5) das Kontrollkäst-
chen »Nur zertifizierte Zusatzmodule verwenden« deaktiviert ist. Die Plugins funktio-
nieren sonst nicht.
Anders ausgedrückt ist der vom Programmierer entwickelte Code »datenblind«, das
heißt, er ist generisch und hängt nicht von blockspezifischen Eigenschaften ab. Ange-
nommen, der Designer beschließt, in einem Serienbrief statt des Nachnamens den Vor-
namen des Empfängers zu verwenden. Der generische Code zur Blockverarbeitung
braucht dann nicht geändert zu werden. Die Ausgabe wird korrekt generiert, sobald der
Designer die Blockeigenschaften mit dem Acrobat-Plugin entsprechend geändert hat.
Beispiel: Hinzufügen von variablem Text zu einem Template. Eine häufige Aufgabe be-
steht darin, ein PDF-Template mit dynamischem Text anzureichern. Das folgende Code-
fragment öffnet eine Seite in einem Eingabe-Dokument (dem PDF-Template), platziert
diese auf der Ausgabeseite und füllt einen Textblock namens firstname mit variablem
Text:
doc = PDF_open_pdi(p, filename, "", 0);
if (doc == -1) {
printf("PDF-Template '%s' konnte nicht geöffnet werden\n", filename);
return (1);
}
page = PDF_open_pdi_page(p, doc, pageno, "");
if (page == -1) {
printf("Seite %d von PDF-Template '%s' konnte nicht geöffnet werden\n",
pageno, filename);
return (2);
}
Ein Block verfügt abhängig vom jeweiligen Typ über bestimmte Standardeigenschaften.
So kann für einen Textblock zum Beispiel die Schriftart und -größe des Texts und für ei-
nen Bild- oder PDF-Block der Skalierungsfaktor oder die Drehung festgelegt werden. Für
jeden Blocktyp bietet das PDFlib-API eine eigene Verarbeitungsfunktion. Anhand des
Blocknamens suchen die Funktionen in einer importierten PDF-Seite nach dem Block,
analysieren seine Eigenschaften und platzieren die vom Client übergebenen Daten
(Text, Rasterbild oder PDF-Seite) entsprechend der jeweiligen Blockeigenschaften auf
der neuen Seite.
Blockeigenschaften können überschrieben werden, indem man den Namen der Block-
eigenschaft und die gewünschten Werte in der Optionsliste der PDF_fill_*block( )-Funk-
tionen wie folgt angibt:
PDF_fill_textblock(p, page, "firstname", "Serge", 0, "fontsize 12");
Diese Anweisung überschreibt die interne Eigenschaft fontsize des Blocks mit dem ange-
gebenen Wert 12. Fast alle Namen allgemeiner Blockeigenschaften können als Optionen
benutzt werden; außerdem die Eigenschaften für den jeweiligen Blocktyp. So ist zum
Beispiel die Option underline nur bei PDF_fill_textblock( ) erlaubt, während die Option
scale sowohl bei PDF_fill_imageblock( ) als auch bei PDF_fill_pdfblock( ) erlaubt ist, da scale
sowohl für Image- als auch PDF-Blöcke eine gültige Blockeigenschaft ist.
Das Überschreiben von Blockeigenschaften wirkt sich nur auf den jeweiligen Funk-
tionsaufruf aus. Die Änderung wird nicht in der Blockdefinition gespeichert.
Koordinatensysteme. Die Koordinaten für einen Block beziehen sich auf das Standard-
koordinatensystem von PDF. Wird die Seite, die den Block enthält, auf der Ausgabeseite
platziert, können an PDF_fit_pdi_page( ) verschiedene Optionen zur Positionierung und
Skalierung übergeben werden. Diese Parameter werden bei der Verarbeitung des Blocks
berücksichtigt. Damit wird es möglich, eine Template-Seite mehrfach auf der Ausgabe-
seite zu platzieren, wobei deren Blöcke jedes Mal mit Daten gefüllt werden. So könnte
das Template für eine Visitenkarte zum Beispiel vier Mal auf ein Blatt montiert werden.
Die Blockfunktionen kümmern sich um Transformationen des Koordinatensystems
und die korrekte Platzierung des Texts für alle Blöcke bei allen Aufrufen der Seite. Vor-
ausgesetzt wird hier lediglich, dass der Client die Seite platziert und alle Blöcke auf der
platzierten Seite verarbeitet. Die Seite kann dann auf der Ausgabeseite an anderer Stelle
erneut platziert werden, wobei weitere Blockverarbeitung an der neuen Position statt-
findet usw.
Hinweis Das Block-Plugin zeigt die Blockkoordinaten anders an, als sie intern in der PDF-Datei gespei-
chert werden. Während das Plugin mit der Acrobat-üblichen Notation arbeitet und den Koordi-
natenursprung in der linken oberen Ecke hat, beziehen sich die internen Koordinaten (die im
Block gespeichert werden) auf die PDF-Konvention und haben den Ursprung in der linken unte-
ren Ecke der Seite.
Anlegen und Ändern von Blöcken. Nach der Auswahl des Blockwerkzeugs legen Sie ei-
nen Block an, indem Sie mit dem Fadenkreuz-Zeiger einfach an der gewünschten Positi-
on auf der Seite ein Rechteck geeigneter Größe aufziehen. Blöcke sind immer Rechtecke,
deren Kanten parallel zu den Seitenrändern verlaufen. Bei der Erstellung eines neuen
Blocks erscheint das Dialogfeld PDFlib-Blockeigenschaften, in dem Sie verschiedene Ein-
stellungen vornehmen können (siehe Abschnitt 6.3.2, »Bearbeiten von Blockeigenschaf-
ten«, Seite 174). Der Blockname wird automatisch angelegt, kann aber nachträglich ge-
ändert werden. Er muss innerhalb einer Seite eindeutig sein. Im oberen Bereich legen
Sie den Blocktyp auf Text, Image oder PDF fest. Die Registerkarten Allgemein und Spezial
sind immer verfügbar. Die Registerkarten Text, Image und PDF werden nur bei Auswahl
des entsprechenden Blocktyps eingeblendet. Die Registerkarte Textflow wird nur bei Blö-
cken vom Typ Text angezeigt, sofern die Eigenschaft textflow auf true gesetzt ist. Die Re-
gisterkarte Tabs (Tabulatorpositionen) ist nur verfügbar, wenn die Eigenschaft
hortabmethod auf der Registerkarte Textflow auf ruler gesetzt ist.
Hinweis Benutzen Sie nach dem Hinzufügen neuer Blöcke oder Bearbeiten existierender Blöcke den
Acrobat-Befehl »Speichern unter« (und nicht »Speichern«), um die Dateigröße zu minimieren.
Hinweis Wenn Sie mit dem Acrobat-Plugin Enfocus PitStop Dokumente bearbeiten, die PDFlib-Blöcke
enthalten, erhalten Sie unter Umständen die Meldung »Dieses Dokument enthält anwen-
dungsspezifische Informationen von PDFlib. Klicken Sie auf ’OK’ zum Fortfahren oder ’Abbre-
chen’ zum Beenden.« Sie brauchen dieser Meldung keine weitere Beachtung zu schenken und
können problemlos OK drücken.
Einstellen von Blockgröße und -position. Mit dem Blockwerkzeug können Sie einen
oder mehrere Blöcke an eine andere Position bewegen. Wenn Sie die Umschalttaste
(Shift) während des Ziehens gedrückt halten, sind nur horizontale und vertikale Bewe-
gungen möglich, was die exakte Ausrichtung von Blöcken erleichtert. Wenn Sie den Zei-
ger in die Nähe einer Blockecke bewegen, verwandelt er sich in einen Pfeil, mit dem Sie
die Blockgröße ändern können. Um die Position oder Größe mehrerer Blöcke anzupas-
sen, wählen Sie diese aus und wählen im Menü PDFlib Block oder im Kontextmenü die
Befehle aus den Untermenüs Ausrichten, Zentrieren, Verteilen und Skalieren. Die Position
eines oder mehrerer Blöcke lässt sich auch mit den Pfeiltasten ändern.
Alternativ dazu können Sie im Eigenschaftendialog numerische Blockkoordinaten
eingeben. Der Ursprung des Koordinatensystems liegt in der linken oberen Ecke der Sei-
te. Die Koordinaten werden in der Einheit angezeigt, die in Acrobat gerade eingestellt
ist. Zum Ändern der Einheit gehen Sie wie folgt vor:
> In Acrobat 6/7 wählen Sie Bearbeiten, Grundeinstellungen..., [Allgemein...], Einheiten und
Hilfslinien, [oder Seiteneinheiten] und selektieren Punkt, Millimeter, Zoll, Pica oder Zen-
timeter. Sie können auch Anzeige, Navigationsregisterkarten, Info wählen und eine Ein-
heit aus dem Menü Optionen selektieren.
> In Acrobat 5 wählen Sie Bearbeiten, Grundeinstellungen, Allgemein..., Anzeigen,
Seiteneinheiten und selektieren Punkt, Millimeter oder Zoll. Sie können auch Fenster,
Info wählen und eine Einheit aus dem Menü Info selektieren.
Beachten Sie, dass die gewählte Einheit ausschließlich auf die Eigenschaft Rect und
sonst keine numerische Eigenschaft angewandt wird.
Anlegen von Blöcken durch Auswahl eines Rasterbildes oder einer Vektorgrafik. Statt
das Rechteck für einen Block manuell aufzuziehen, können Sie die Blockgröße auch an-
hand von vorhandenem Seiteninhalt definieren. Dazu müssen Sie zunächst sicherstel-
len, dass der Menüpunkt PDFlib Block, Zur Blockdefinition Objekt anklicken aktiv ist. Wenn
Sie nun mit dem Blockwerkzeug auf ein Rasterbild auf der Seite klicken, wird ein Block
in der Größe dieses Bildes erzeugt. Sie können ebenso auf andere grafische Objekte kli-
cken. Das Blockwerkzeug versucht, die umgebende Grafik (zum Beispiel ein Logo) zu se-
lektieren. Diese Objekt-Klick-Funktion ist als Hilfsmittel zur Definition von Blöcken ge-
dacht. Sie können einen Block auch nachträglich ohne Einschränkungen verschieben
oder in der Größe verändern. Der Block ist nicht an das Rasterbild oder das grafische Ob-
jekt gebunden, das als Hilfsmittel verwendet wurde.
Die Objekt-Klick-Funktion versucht zu erkennen, welche Vektorgrafiken oder Raster-
bilder ein logisch zusammengehörendes Element auf der Seite bilden. Wenn Sie auf ei-
nen Seiteninhalt klicken, so wird dessen Boundingbox (das umschließende Rechteck)
ermittelt und selektiert, sofern das Objekt nicht weiß oder sehr groß ist. Im nächsten
Schritt werden weitere Objekte, die sich teilweise im ermittelten Rechteck befinden,
zum selektierten Bereich hinzugenommen und so weiter. Auf der Grundlage des end-
gültigen Bereichs wird das Blockrechteck generiert. Die Objekt-Klick-Funktion versucht
letztendlich, vollständige Grafiken und nicht nur einzelne Linien zu selektieren.
Die Funktion ist aber nicht perfekt und selektiert unter Umständen (je nach Seiten-
inhalt) nicht immer das Gewünschte. Schließlich ist sie nur als Hilfsmittel zur schnellen
Platzierung und Bemaßung von Rechtecken gedacht.
Automatische Erkennung von Fonteigenschaften. Das Block-Plugin ist in der Lage, den
Font zu analysieren, der sich an der Stelle befindet, an der der Block positioniert wird.
Darauf aufbauend kann es die folgenden entsprechenden Blockeigenschaften automa-
tisch füllen:
fontname, fontsize, fillcolor, charspacing, horizscaling, wordspacing,
textrendering, textrise
Dieses Problem lässt sich beheben, indem die Dateien mit Acrobat in die erforderliche
PDF-Version konvertiert werden. Weitere Informationen hierzu finden Sie im Abschnitt
»Ändern der PDF-Version eines Dokuments«, Seite 196.
Um den Wert einer Eigenschaft zu ändern, geben Sie die gewünschte Zahl oder den ge-
wünschten String in das Eingabefeld der Eigenschaft ein (z.B. bei linewidth), selektieren
den Wert aus einer Dropdown-Liste (z.B. bei fontname, fitmethod) oder selektieren mit
dem »...«-Button rechts einen Farbwert oder Dateinamen (z.B. bei backgroundcolor). Bei
der Eigenschaft fontname können Sie die Schrift aus einer Liste mit allen im System in-
stallierten Schriften auswählen oder einen Schriftnamen eingeben. Unabhängig von
der Auswahlmethode muss der gewählte Font auf dem System vorhanden sein, auf dem
die Blöcke mit dem PDFlib Personalization Server gefüllt werden.
Nachdem Sie die gewünschten Einstellungen vorgenommen haben, schließen Sie
den Eigenschaften-Dialog durch Klicken auf OK. Die soeben definierten Eigenschaften
werden als Bestandteil der Blockdefinition in der PDF-Datei gespeichert.
Übereinander liegende Blöcke. Überlappende Blöcke lassen sich oft nur schwer selek-
tieren, da beim Klicken in einen Bereich nur der oberste Block selektiert wird. In solchen
Fällen kann der Befehl Block auswählen im Kontextmenü genutzt werden, um einen der
Blöcke anhand seines Namens zu selektieren. Die nächste Aktion, die im Bereich des se-
lektierten Blocks durchgeführt wird (z.B. ein Doppelklick), bezieht sich dann nur auf die-
sen Block. Auf diese Weise lassen sich Blöcke problemlos bearbeiten, selbst wenn sie teil-
weise oder vollständig von anderen Blöcken verdeckt werden.
Gemeinsame Eigenschaften. Mit dem Blockwerkzeug können Sie bei gedrückter Um-
schalttaste mehrere Blöcke auf der Seite selektieren. Wenn Sie dann auf einen der Blö-
cke doppelklicken oder die Eingabetaste drücken, öffnet sich der Eigenschaften-Dialog,
der sich jetzt auf alle selektierten Blöcke bezieht. Es können jedoch nur solche Eigen-
schaften editiert werden, die auf alle selektierten Blöcke anwendbar sind. Abschnitt 6.4,
»Standardeigenschaften zur automatischen Verarbeitung«, Seite 180, beschreibt, wel-
che Eigenschaften mehreren Blöcken gemeinsam sein können. Selbstdefinierte Eigen-
schaften können nicht gemeinsam genutzt werden.
Verschieben und Kopieren von Blöcken. Sie können Blöcke verschieben oder kopieren,
indem Sie einen oder mehrere Blöcke selektieren und bei gedrückter Strg-Taste (Win-
dows) bzw. Alt-Taste (Mac) an eine neue Position ziehen. So lange die Taste gedrückt ist,
nimmt der Mauszeiger eine andere Form an. Ein kopierter Block hat die gleichen Eigen-
schaften wie der ursprüngliche Block mit Ausnahme des Namens, der automatisch ge-
ändert wird.
Ebenso können Sie Blöcke mit Copy&Paste an eine andere Position auf der selben
Seite, auf einer anderen Seite des selben Dokuments oder eines anderen in Acrobat ge-
öffneten Dokuments kopieren:
> Wählen Sie das Blockwerkzeug und selektieren Sie die zu kopierenden Blöcke.
> Kopieren Sie die selektierten Blöcke mit Strg-C (Windows) bzw. Cmd-C (Mac) oder
Bearbeiten, Kopieren in die Zwischenablage.
Duplizieren von Blöcken auf andere Seiten. Sie können einen oder mehrere Blöcke
gleichzeitig auf eine beliebige Anzahl von Seiten im Dokument duplizieren:
> Wählen Sie das Blockwerkzeug und selektieren Sie die zu duplizierenden Blöcke.
> Wählen Sie Import und Export, Duplizieren... im Menü PDFlib Block oder im Kontext-
menü.
> Wählen Sie aus, ob nur die selektierten oder alle Blöcke auf der Seite und auf welchen
Seitenbereich die Blöcke dupliziert werden sollen.
Import und Export von Blöcken. Mit den Funktionen zum Import und Export von Blö-
cken können alle Blockdefinitionen auf der Seite oder in einem Dokument über mehre-
re PDF-Dateien verteilt werden. Dies ist zum Beispiel bei der Aktualisierung des Seiten-
inhalts sinnvoll, wenn vorhandene Blockdefinitionen erhalten bleiben sollen. Um die
Blockdefinitionen in eine eigene Datei zu exportieren, gehen Sie wie folgt vor:
> Wählen Sie das Blockwerkzeug und selektieren Sie die zu exportierenden Blöcke.
> Wählen Sie den Befehl Import und Export, Export... im Menü PDFlib Block oder im Kon-
textmenü.
> Geben Sie den Seitenbereich sowie einen Namen für die Datei ein, die die Blockdefi-
nitionen enthalten soll.
Mit dem Befehl Import und Export, Import... im Menü PDFlib Block oder im Kontextmenü
importieren Sie Blockdefinitionen. Dabei können Sie auswählen, ob die importierten
Blöcke auf alle Seiten oder nur einen Seitenbereich im Dokument platziert werden. Bei
mehreren selektierten Seiten werden die Blockdefinitionen unverändert auf diese ko-
piert. Enthält der Seitenbereich des Zieldokuments mehr Seiten als die Datei mit den zu
importierenden Blockdefinitionen, können Sie die Checkbox Vorlage wiederholen selek-
tieren. Die Blöcke in der zu importierenden Datei werden dann so lange wiederholt auf
das Zieldokument übertragen, bis das Dokumentende erreicht ist.
Kopieren von Blöcken in ein anderes Dokument beim Export. Beim Exportieren von
Blöcken können Sie diese unmittelbar auf die Seiten eines anderen Dokuments übertra-
gen. Dazu wählen Sie ein bereits existierendes Dokument als Exportdatei. Wenn Sie die
Checkbox Vorhandene Blöcke löschen selektieren, werden alle im Zieldokument bereits
vorhandenen Blöcke gelöscht, bevor die neuen Blöcke in das Dokument kopiert werden.
Tabelle 6.3 Selbstdefinierte Eigenschaften zur Identifizierung des einem Block zugrunde liegenden
Formularfelds
Selbstdefinierte Eigenschaft Bedeutung
PDFlib:field:name Vollständig qualifizierter Name des Formularfelds.
PDFlib:field:pagenumber Nummer der Seite (als String) im Originaldokument, auf der sich das Formularfeld
befand.
PDFlib:field:type Typ des Formularfelds; mögliche Werte sind pushbutton, checkbox, radiobutton,
listbox, combobox, textfield, signature.
PDFlib:field:value (Nur für type=checkbox) Exportwert des Formularfelds.
Es wird nichts beschnitten; um sicherzustellen, dass der Blockinhalt nicht über das
Blockrechteck hinausreicht, wählen Sie fitmethod nofit.
Wird in einer Blockeigenschaft eine Schmuckfarbe verwendet, muss der definierte
Schmuckfarbname entweder PDFlib-intern bekannt sein (siehe Abschnitt 3.3.3,
»Schmuckfarben«, Seite 70) oder er muss im PDFlib-Clientprogramm bereits früher mit
PDF_makespotcolor( ) festgelegt worden sein. Andernfalls scheitern die Blockfunktionen.
Generelle Eigenschaften für Textblöcke. Textblöcke können abhängig von der Eigen-
schaft textflow aus einer oder mehreren Zeilen bestehen. Tabelle 6.5 zeigt alle Eigen-
schaften, die sich generell auf beide Textblockarten anwenden lassen.
Ermitteln der Anzahl und Namen von Blöcken. Die Namen und die Anzahl der Blöcke
auf einer importierten Seite brauchen dem Clientcode nicht bekannt zu sein, da sie ab-
gefragt werden können. Die folgende Anweisung gibt die Anzahl der Blöcke auf der Seite
zurück:
blockcount = PDF_get_pdi_value(p, "vdp/blockcount", doc, page, 0);
Die folgende Anweisung gibt den Namen von Block Nummer 5 auf der Seite (die Zäh-
lung beginnt bei 0) oder einen Leerstring zurück, wenn kein entsprechender Block exis-
tiert (hat der Parameter oder die Option pdiwarning den Wert true, wird jedoch eine Ex-
ception ausgelöst):
blockname = PDF_get_pdi_parameter(p, "vdp/Blocks[5]/Name", doc, page, 0, &len);
Der zurückgegebene Blockname kann im weiteren Verlauf zur Abfrage von Blockeigen-
schaften oder zum Füllen des Blocks mit Text, Bildern oder PDF-Inhalt verwendet wer-
den.
In der Syntax für den Pfad zur Adressierung der Blockeigenschaft sind folgende Aus-
drücke gleichbedeutend, wobei davon ausgegangen wird, dass der Block mit der Num-
mer <nummer> seine Eigenschaft Name auf <blockname> gesetzt hat:
Blocks[<nummer>]/
Blocks/<blockname>/
Ermitteln von Blockkoordinaten. Die beiden Koordinatenpaare (llx, lly) und (urx, ury),
die die linke untere und die rechte obere Ecke eines Blocks namens foo beschreiben, las-
sen sich wie folgt abfragen:
llx = PDF_get_pdi_value(p, "vdp/Blocks/foo/Rect[0]", doc, page, 0);
lly = PDF_get_pdi_value(p, "vdp/Blocks/foo/Rect[1]", doc, page, 0);
urx = PDF_get_pdi_value(p, "vdp/Blocks/foo/Rect[2]", doc, page, 0);
ury = PDF_get_pdi_value(p, "vdp/Blocks/foo/Rect[3]", doc, page, 0);
Hinweis Mit unserem Produkt PDFlib pCOS können Sie beliebige Informationen aus einem PDF abfra-
gen, unter anderem auch Blockeigenschaften.
Wenn Sie nicht wissen, welche selbstdefinierten Eigenschaften in einem Block eigent-
lich vorhanden sind, können Sie deren Namen zur Laufzeit abfragen. Mit folgendem Co-
defragment ermitteln Sie zum Beispiel den Namen der ersten selbstdefinierten Eigen-
schaft des Blocks b1:
propname = PDF_get_pdi_parameter(p, "vdp/Blocks/b1/Custom[0].key", doc, page, 0, &len);
Wenn Sie den Index 0 erhöhen, erhalten Sie sukzessive die Namen aller weiteren benut-
zerdefinierten Eigenschaften. Wird ein leerer String zurückgegeben, sind keine benut-
zerdefinierten Eigenschaften mehr vorhanden.
Eine Blockliste ist ein Dictionary mit allgemeinen Information zur Blockverarbeitung
sowie einer Liste aller Blöcke auf der Seite. Tabelle 6.11 enthält alle Keys in einem Block-
listen-Dictionary.
Beispiel. Das folgende Fragment zeigt den PDF-Code für zwei Blöcke, einen Textblock
namens job_title und einen Image-Block namens logo. Der Textblock enthält eine selbst-
definierte Eigenschaft namens format:
13 0 obj
<<
/Private <<
/Blocks <<
/job_title 14 0 R
/logo 15 0 R
>>
/Version 6
/PluginVersion (2.2.0)
>>
/LastModified (D:20050813200730)
>>
endobj
14 0 obj
<<
/Type /Block
/Rect [ 70 740 200 800 ]
/Name /job_title
/Subtype /Text
/fitmethod /auto
/fontname (Helvetica)
/fontsize 12
/Custom << /format 5 >>
>>
endobj
15 0 obj
<<
/Type /Block
/Rect [ 250 700 400 800 ]
/Name /logo
/Subtype /Image
/fitmethod /auto
>>
[{ThisPage} <<
/PieceInfo <<
/PDFlib <<
Tabelle 7.1 PDFlib-Funktionen für PDF 1.4, die im Kompatibilitätsmodus zu PDF 1.3 nicht verfügbar sind
Eigenschaft PDFlib-API-Funktionen und Parameter
Farbverläufe PDF_shading_pattern( ), PDF_shfill( ), PDF_shading( )
Transparenzmasken PDF_load_image( ), wenn die Option masked auf ein Bild mit mehr als 1
Bit Pixeltiefe verweist
128-Bit-Verschlüsselung PDF_begin_document( ) mit den Optionen userpassword, masterpassword
und permissions
erweiterte Berechtigungen PDF_begin_document( ) mit der Option permissions, siehe Tabelle 7.3
einige CMaps für CJK-Schriften PDF_load_font( ), siehe Tabelle 4.7
Transparenz und andere Optionen PDF_create_gstate( ) mit den Optionen alphaisshape, blendmode,
für den Grafikzustand opacityfill, opacitystroke, textknockout
einige Optionen für Aktionen PDF_create_action( ), siehe Tabelle 8.49
einige Optionen für Anmerkungen PDF_create_annotation( ), siehe Tabelle 8.51
einige Feldoptionen PDF_create_field( ) und PDF_create_fieldgroup( ), siehe Tabelle 8.52
Tagged PDF Option tagged in PDF_begin_document( )
Tabelle 7.2 In den Kompatibiltätsmodi zu PDF 1.3 und 1.4 nicht verfügbare PDFlib-Funktionen für PDF 1.5
Eigenschaft PDFlib-API-Funktionen und Parameter
einige Feldoptionen PDF_create_field( ) und PDF_create_fieldgroup( ), siehe Tabelle 8.52
einige Anmerkungsoptionen PDF_create_annotation( ) siehe Tabelle 8.51
erweiterte Berechtigungen permissions=plainmetadata in PDF_begin_document( ), siehe Tabelle 7.3
einige CMaps für CJK-Schriften PDF_load_font( ), siehe Tabelle 4.7
Tagged PDF einige Optionen für PDF_begin_item( ), siehe Tabelle 8.57 und Tabelle 8.58
Ebenen PDF_define_layer( ), PDF_begin_layer( ), PDF_end_layer( ), PDF_layer_
dependency( )
JPEG2000-Bilder imagetype=jpeg2000 in PDF_load_image( )
Ändern der PDF-Version eines Dokuments. Wenn Sie Ausgabe in einer bestimmten
PDF-Version zu erstellen und dazu PDFs in einer höheren Version zu importieren ha-
ben, müssen Sie die Dokumente vor dem PDI-Import in die niedrigere PDF-Version kon-
vertieren. Dies lässt sich in Acrobat bewerkstelligen, die genaue Vorgehensweise ist aber
von der jeweiligen Acrobat-Version abhängig:
> Acrobat 7: Mit Erweitert, PDF Optimierung..., Kompatibel mit können Sie die Datei in den
Formaten PDF 1.3 - PDF 1.6 speichern.
> Acrobat 6: Mit Datei, Dateigröße verringern... können Sie die Datei in den Formaten
PDF 1.3 - PDF 1.5 speichern.
> Acrobat 5: Zur Konvertierung eines Dokuments nach PDF 1.3 können Sie das Plugin
pdfSaveAs1.3 von callas software einsetzen. Voll funktionsfähige Demoversionen sind
auf der Web-Site von callas1 verfügbar. Dieses Konvertierungs-Plugin kann insbeson-
dere beim Umgang von Blöcken mit PDF/X nützlich sein, da PDF 1.3 von manchen
PDF/X-Versionen gefordert wird (siehe »Einsatz von Blöcken mit PDF/X«, Seite 173,
und Abschnitt 7.4.2, »Erzeugung PDF/X-kompatibler Ausgabe«, Seite 202).
1. Siehe www.callassoftware.com
Verfügt eine Datei über ein Benutzer- oder Hauptkennwort oder irgendwelche Sicher-
heitseinstellungen, so wird sie verschlüsselt.
Knacken geschützter PDF-Dokumente. Die Länge der zum Schutz von Dokumenten
verwendeten Chiffrierschlüssel hängt von dem PDF-Kompatibilitätslevel ab, der vom
Client gewählt wurde:
> Bei PDF-Versionen bis einschließlich 1.3 (das heißt Acrobat 4) beträgt die Schlüssel-
länge 40 Bit.
> Ab PDF-Version 1.4 beträgt die Schlüssellänge 128 Bit. Dies erfordert Acrobat ab Versi-
on 5. Bei PDF 1.5 beträgt die Schlüssellänge ebenfalls 128 Bit, das Verschlüsselungsver-
fahren unterscheidet sich jedoch ein wenig, was den Einsatz von Acrobat 6 erforder-
lich macht.
Die übergebenen Kennwörter werden für alle nachfolgend generierten Dokumente ver-
wendet.
Tabelle 7.3 Schlüsselwörter für Berechtigungen für die Option permissions in PDF_begin_document( )
Schlüsselwort Erklärung
noprint Acrobat verhindert das Drucken der Datei.
nomodify Acrobat verhindert, dass Benutzer Formularfelder hinzufügen oder irgendwelche anderen
Änderungen vornehmen.
nocopy Acrobat verhindert, dass Text oder Grafik kopiert oder extrahiert wird und deaktiviert außerdem
die Accessibility-Schnittstelle (zur Gewährleistung von Barrierefreiheit).
noannots Acrobat verhindert das Hinzufügen oder Ändern von Kommentaren oder Formularfeldern.
noforms (PDF 1.4) Acrobat verhindert das Ausfüllen von Formularfeldern, auch wenn noannots nicht
angegeben wurde.
noaccessible (PDF 1.4) Acrobat verhindert die Extraktion von Text oder Grafik im Rahmen der Accessibility (zum
Beispiel für Screenreader-Programme)
noassemble (PDF 1.4) Acrobat verhindert das Einfügen, Löschen oder Drehen von Seiten und die Erstellung von
Lesezeichen und Piktogrammen, auch wenn nomodify nicht angegeben wurde.
nohiresprint (PDF 1.4) Acrobat verhindert den Ausdruck mit hoher Auflösung. Wurde noprint nicht angegeben,
wird der Ausdruck mit der Option »Als Bild drucken« durchgeführt und die Seite in niedriger
Auflösung ausgegeben.
plain- (PDF 1.5) Die Metadaten des Dokuments bleiben auch bei verschlüsselten Dokumenten
metadata unverschlüsselt. Dieses Schlüsselwort bezieht sich nur auf XMP-Metadaten und nicht auf
Dokumentinfofelder.
Hinweis Wenn PDFs über das WEb bereitsgestellt werden, können Clients mit dem Browser immer eine
lokale Kopie des Dokuments erstellen. Es gibt keine Möglichkeit für das PDF zu verhindern, dass
Benutzer eine lokale Kopie speichern.
> Der Benutzer muss Acrobat als Browser-Plugin installiert und in Acrobat seitenwei-
ses Herunterladen aktiviert haben. Dies ist standardmäßig der Fall (Acrobat 6:
Bearbeiten, Grundeinstellungen..., [Allgemein...,] Internet, Schnelle Web-Anzeige zulassen;
Acrobat 5: Bearbeiten, Grundeinstellungen, Allgemein..., Optionen, Schnelle Web-Anzeige
zulassen).
Je größer eine PDF-Datei (in Seiten oder MB gemessen) ist, desto mehr wird sie bei der
Übertragung über das Web von der Linearisierung profitieren.
Hinweis Die Linearisierung eines PDF-Dokuments vergrößert die Datei geringfügig, da spezielle Lineari-
sierungsinformationen hinzugefügt werden.
Temporärer Speicher für die Linearisierung. PDFlib muss das Dokument erst vollstän-
dig erstellen, bevor es in einem nachfolgenden eigenen Verarbeitungsschritt linearisi-
ert wird. Dafür benötigt PDFlib temporär zusätzlichen Speicher, der in etwa der Größe
des generierten Dokuments (ohne Linearisierung) entspricht. Je nach Einstellung der
Option inmemory für PDF_begin_document( ) speichert PDFlib die für die Linearisierung
erforderlichen Daten entweder im Speicher oder in einer temporären Datei auf der Fest-
platte.
PDF/X-1:2001 und PDF/X-1a:2001, definiert in ISO 15930-1. Diese Standards für den
»blinden Datenaustausch« (Austausch von Druckdaten ohne vorherige technische Ab-
sprache) basieren auf PDF 1.3 und unterstützen CMYK- und Schmuckfarben. RGB und
geräteabhängige Farben (ICC-basiert, Lab) sind explizit ausgeschlossen. PDF/X-1:2001
unterstützt ein Verfahren zur Integration von veralteten Dateiformaten (zum Beispiel
TIFF/IT) in einem PDF-Workflow und gilt als veraltet. PDF/X-1a:2001 enthält keine derar-
tige Unterstützung und ist (insbesondere in Nordamerika) ein gängiger Standard für
den Austausch von Zeitschriftenanzeigen und andere Anwendungen.
PDF/X-1a:2003, definiert in ISO 15930-4. Dieser Standard ist der Nachfolger von PDF/
X-1a:2001. Er basiert auf PDF 1.4, wobei einige Funktionen (zum Beispiel Transparenz)
unzulässig sind. PDF/X-1a:2003 ist eine Teilmenge von PDF/X-3:2003, unterstützt
CMYK- und Schmuckfarbe sowie CMYK-Ausgabegeräte.
PDF/X-2:2003, definiert in ISO 15930-5. Dieser Standard zielt auf einen »abgesproche-
nen Datenaustausch« ab, bei dem sich Lieferant und Empfänger einer Datei absprechen
müssen. PDF-Dokumente, die diesem Standard entsprechen, können auf externe Ele-
mente (andere PDF-Seiten außerhalb des aktuellen Dokuments) verweisen. PDF/X-
2:2003 basiert auf PDF 1.4. Als Obermenge von PDF/X-3:2003 unterstützt er geräteunab-
hängige Farben.
PDF/X-3:2002, definiert in ISO 15930-3. Dieser Standard basiert auf PDF 1.3 und unter-
stützt moderne Workflows mit geräteunabhängigen Farben, Graustufen, CMYK und
Schmuckfarben. Er ist insbesondere in Europa verbreitet. Zulässig sind Monochrom-,
RGB- und CMYK-Ausgabegeräte.
PDF/X-3:2003, definiert in ISO 15930-6. Dieser Standard ist der Nachfolger von PDF/X-
3:2002. Er basiert auf PDF 1.4, wobei einige Funktionen (zum Beispiel Transparenz) un-
zulässig sind.
Hinweis PANTONE®-Farben werden gegenwärtig nicht in den Modi PDF/X-1:2001, PDF/X-1a:2001 und
PDF/X-1a:2003 unterstützt.
Zwingend erforderliche Operationen. Tabelle 7.4 zeigt alle Operationen, die zur Gene-
rierung PDF/X-kompatibler Ausgabe erforderlich sind. Die angeführten Punkte bezie-
hen sich auf alle PDF/X-Kompatibilitätsstufen, sofern es nicht anderweitig angemerkt
ist. Fehlt im PDF/X-Modus ein erforderlicher Funktionsaufruf, wird eine Exception aus-
gelöst.
Unzulässige Operationen. Tabelle 7.5 führt alle Operationen auf, die bei der Erzeugung
von PDF/X-kompatibler Ausgabe untersagt sind. Die angeführten Punkte beziehen sich
auf alle PDF/X-Kompatibilitätsstufen, sofern es nicht anderweitig angemerkt ist. Der
Aufruf einer im PDF/X-Modus unzulässigen Funktion löst eine Exception aus. Unzuläs-
sige Bilder lösen abhängig vom Parameter imagewarning keine Exception aus. Wenn
eine importierte PDF-Seite nicht der aktuellen PDF/X-Kompatibilitätsstufe entspricht,
scheitert der betreffende PDI-Aufruf, ohne eine Exception auszulösen (abhängig vom
Parameter pdiwarning).
Bei PDF/X-3-Ausgabe mit HKS-, Pantone-, ICC-basierten oder Lab-Farben dürfen Sie kei-
ne Standard-Druckausgabebedingungen verwenden, sondern müssen stattdessen ein
ICC-Profil des Ausgabegeräts einbetten.
Tabelle 7.7 Zulässige PDF/X-Eingabestufen für verschiedene PDF/X-Ausgabestufen; andere Kombinationen sind
unzulässig.
PDF/X-Kompatibilitätsstufe für das importierte Dokument
PDF/X-Ausgabestufe PDF/X-1:2001 PDF/X-1a:2001 PDF/X-1a:2003 PDF/X-2:2003 PDF/X-3:2002 PDF/X-3:2003
PDF/X-1:2001 zulässig zulässig
PDF/X-1a:2001 zulässig
PDF/X-1a:2003 zulässig zulässig
PDF/X-2:2003 zulässig zulässig zulässig zulässig zulässig
PDF/X-3:2002 zulässig zulässig
PDF/X-3:2003 zulässig zulässig zulässig zulässig
Diese Anweisung gibt einen String zurück, der die PDF/X-Kompatibilitätsstufe des im-
portierten Dokuments bezeichnet, sofern diese einem PDF/X-Level entspricht, anderen-
falls none. Mit dem zurückgegebenen String kann mit der Option pdfx in PDF_begin_
document( ) die entsprechende PDF/X-Kompatibilitätsstufe für das Ausgabedokument
gesetzt werden.
Neben der Abfrage der PDF/X-Kompatibilitätsstufe können Sie die PDF/X-Druckaus-
gabebedingung wie folgt aus einem importierten Dokument kopieren:
doc = PDF_process_pdi(p, doc, -1, "action copyoutputintent");
Hinweis PDFlib unterstützt gegenwärtig keine selbstdefinierten Typen für Strukturelemente (das heißt,
es können nur die in PDF definierten Standardtypen für Strukturelemente verwendet werden),
Rollenzuordnungen (role maps) und Strukturelementattribute.
Tabelle 7.8 Operationen, die zur Generierung von Tagged-PDF-Ausgabe erforderlich sind
Thema Für Tagged-PDF-Kompatibilität erforderliche PDFlib-Funktionen und -Parameter
Tagged-PDF-Ausgabe In PDF_begin_document( ) muss die Option tagged auf true gesetzt sein.
Dokumentsprache In PDF_begin_document( ) muss mit der Option lang die Dokumentsprache gesetzt
werden. Diese muss anfangs für das Gesamtdokument festgelegt werden, lässt sich aber
später für einzelne Elemente in beliebigen Strukturebenen ändern.
Strukturinformation Strukturinformationen und Artefakte müssen als solche erkennbar sein. Alle API-
Funktionen, die Inhalte erzeugen, sollten in PDF_begin_item( ) und PDF_end_item( )
eingeschlossen werden.
Unicode-kompatible Textausgabe. Bei der Erzeugung von Tagged PDF, dürfen bei der
Textausgabe nur Unicode-kompatible Schriften verwendet werden (siehe Abschnitt
4.5.6, »Unicode-kompatible Fonts«, Seite 113). Das bedeutet, dass alle Zeichen der benutz-
ten Fonts Unicode-Werten zugeordnet sein müssen. Nicht Unicode-kompatible Fonts
sind nur zulässig, wenn in PDF_begin_item( ) mit den Optionen ActualText oder Alt alter-
nativer Textinhalt angegeben wird. PDFlib löst eine Exception aus, wenn bei der Gene-
rierung von Tagged PDF Text ohne korrektes Unicode-Mapping verwendet wird.
Hinweis Manchmal erkennt PDFlib Probleme mit falsch kodierten Schriften nicht, zum Beispiel bei Sym-
bolfonts, die als Textfonts kodiert sind. Auch PostScript-Schriften mit bestimmten typografi-
schen Eigenheiten (zum Beispiel Expert-Fonts) werden aufgrund historisch bedingter Probleme
aller Wahrscheinlichkeit nach nicht akzeptiert.
Anordnung des Seiteninhalts. Die Reihenfolge der Text-, Vektorgrafik- und Rasterbild-
Operatoren, die den Seiteninhalt definieren, wird als physische Anordnung der Inhalte
bezeichnet; die durch den logischen Strukturbaum definierte Reihenfolge wird logische
Anordnung genannt. Bei der Generierung von Tagged PDF muss der Client bestimmte
Regeln bezüglich der Anordnung der Inhalte beachten.
Importieren von Seiten mit PDI. Seiten aus Tagged-PDF- oder PDF-Dokumenten mit
Strukturinformationen können im Tagged-PDF-Modus nicht importiert werden, da die
importierte Dokumentstruktur und die generierte Struktur nicht zusammenpassen.
Seiten aus nicht strukturierten Dokumenten lassen sich dagegen importieren. Be-
achten Sie, dass diese von der Zugriffsfunktion von Acrobat »wörtlich« genommen wer-
den, sofern sie nicht mit passendem ActualText versehen sind.
Artefakte. Grafik- oder Textobjekte, die nicht zum vom Autor selbst verfassten Inhalt
gehören, werden Artefakte genannt. Artefakte sollten mit dem Pseudo-Tag Artifact als
solche gekennzeichnet und in eine der folgenden Kategorien eingeordnet werden:
> Pagination: Eigenschaften wie laufende Kopfzeile oder Seitenzahlen
> Layout: typografische oder Designelemente wie Linien oder Tabellenschattierungen
> Page: Produktionshilfen wie Beschnittmarken oder Farbauszüge
Die Kennzeichnung von Artefakten ist zwar nicht zwingend notwendig, aber doch rat-
sam, da sie beim Umfließen von Text und zur Barrierefreiheit (Accessibility) hilfreich
ist.
Mit der Option inline in PDF_begin_item( ) entscheidet der Client, ob ASpan-Elemente re-
gulär oder inline sind. Ein Accessilibility-Span sollte zum Beispiel regulär (inline=false)
sein, wenn ein Absatz, der sich über mehrere Seiten erstreckt, verschiedene Sprachen
enthält. Alternativ dazu könnte das Element beendet und auf der nächsten Seite ein
Optionale Operationen. Tabelle 7.10 zeigt alle Operationen, die bei Bedarf zur Generie-
rung von Tagged-PDF-Ausgabe verwendet werden können. Diese Funktionen sind nicht
unbedingt erforderlich, aber empfehlenswert, da sie die Qualität der generierten
Tagged-PDF-Ausgabe erhöhen.
Tabelle 7.10 Bei der Erzeugung von Tagged PDF optionale Operationen
Thema Für Tagged-PDF-Kompatibilität optionale PDFlib-Funktionen und -Parameter
Trennung Wortumbrüche (Aufspaltung eines Wortes in zwei Teile am Zeilenende) sollten durch ein
weiches Trennzeichen (soft hyphen, U+00A0) und nicht durch ein hartes Trennzeichen
(U+002D) dargestellt werden.
Wortgrenzen Wörter sollten durch Leerzeichen (U+0020) getrennt werden, auch wenn dies zur
Positionierung nicht unbedingt erforderlich ist. Mit dem Parameter autospace können
nach jedem Aufruf einer der show-Funktionen automatisch Leerzeichen erzeugt werden.
Artefakte Um tatsächlichen Inhalt von Seitenartefakten zu unterscheiden, sollten Artefakte auch
als solche gekennzeichnet werden, und zwar mit PDF_begin_item( ) und tag=Artifact.
Unzulässige Operationen. Tabelle 7.11 zeigt alle Operationen, die bei der Generierung
von Tagged-PDF-Ausgabe unzulässig sind. Beim Aufruf einer unzulässigen Funktion im
Tagged-PDF-Modus wird eine Exception ausgelöst.
Tabelle 7.11 Bei der Generierung von Tagged PDF unzulässige Operationen
Thema Für Tagged-PDF-Kompatibilität unzulässige PDFlib-Funktionen und -Parameter
nicht Unicode- Schriften, die nicht Unicode-kompatibel sind gemäß Abschnitt 4.5.6, »Unicode-kom-
kompatible Schriften patible Fonts«, Seite 113, dürfen nicht verwendet werden.
PDF-Import Seiten aus PDF-Dokumenten, die Strukturinformationen enthalten (speziell Tagged-PDF-
Dokumente), dürfen nicht importiert werden.
PDF_end_page_ext(p, "");
PDF_end_item(p, id);
PDF_end_document(p, "");
Erzeugung von Tagged PDF mit Textflüssen. Textflüsse (siehe Abschnitt 4.9, »Mehrzei-
lige Textflüsse«, Seite 131) bietet leistungsfähige Funktionen zur Textformatierung. Da
sich einzelne Textfragmente nicht mehr unter Clientkontrolle befinden, sondern auto-
matisch von PDFlib formatiert werden, muss bei der Generierung von Tagged PDF mit
Textflüssen besondere Sorgfalt aufgewendet werden:
> Textflüsse können keine einzelnen Strukturelemente enthalten, aber ein Textfluss
kann in einem Strukturelement enthalten sein.
> Alle Teile eines Textflusses (alle Aufrufe von PDF_fit_textflow( ) mit einem bestimm-
ten Textfluss-Handle) sollten sich innerhalb desselben Strukturelements befinden.
> Da sich ein Textfluss über mehrere Seiten erstrecken kann, die unterschiedliche
Strukturelemente enthalten, sollte das Elternelement mit Bedacht gewählt und
nicht einfach der Parameterwert -1 verwendet werden, der auf das falsche Elternele-
ment verweisen könnte.
Das Aktivierungsverfahren bietet dafür eine verbesserte Technik zur Generierung des
Seiteninhalts, indem zwischen den logischen Zweige des Baumes hin- und hergeschal-
tet wird. Dies ist um einiges effizienter als erst einen Baum komplett abzuarbeiten, be-
vor mit dem nächsten begonnen wird. Betrachten Sie zur Veranschaulichung des Akti-
vierungsverfahrens Abbildung 7.1. Sie enthält zweispaltigen Haupttext, der durch eine
Tabelle und eingeschobene Anmerkungen in einem Kasten (mit dunklem Hintergrund)
unterbrochen wird. Außerdem gibt es eine Kopf- und eine Fußzeile.
Erzeugung von Seiteninhalt in logischer Reihenfolge. Von der logischen Struktur her
sollte der Seiteninhalt in folgender Reihenfolge erzeugt werden: linke Spalte, rechte
Spalte (auf der Seite unten rechts), Tabelle, Einschub, Kopfzeile und Fußzeile. Der fol-
gende Pseudo-Code implementiert diese Anordnung:
/* Seitenlayout in logischer Reihenfolge erzeugen */
Bei dieser Reihenfolge der Strukturelemente wird der Haupttext (der sich über andert-
halb Spalten erstreckt) zweimal unterbrochen, einmal durch die Tabelle und einmal
durch den Einschub. Deswegen muss er auch zweimal mit PDF_activate_item( ) aktiviert
werden.
Dasselbe Verfahren kommt zum Einsatz, wenn sich der Inhalt über mehrere Seiten
erstreckt. In diesem Fall können die Kopfzeile und andere Einschübe zuerst erzeugt und
dann das Inhaltselement der Hauptseite erneut aktiviert werden.
Zugriffsprüfung von Acrobat. Mit der Zugriffsprüfung von Acrobat lässt sich feststel-
len, ob Tagged-PDF-Dokumente für den Einsatz mit Hilfsmitteln wie Sprachausgabe-
geräte geeignet sind.
> Elemente, die ein importiertes Bild enthalten, sollten die Eigenschaft Alt verwenden.
Die Eigenschaft ActualText kann die Zugriffsprüfung zum Absturz bringen. Ein weite-
rer Vorteil von Alt gegenüber ActualText ist, dass die Sprachausgabe den tatsächli-
chen Text erhält.
> Ist das erste Element auf der Seite ein Form-Tag für eine importierte PDF-Seite, kann
dies zu Problemen bei der Zugriffsprüfung führen.
> Ist das Lbl-Tag innerhalb des TOCI-Tags gesetzt (so wie in der PDF-Referenz beschrie-
ben), gibt die Zugriffsprüfung eine Warnung darüber aus, dass das Lbl-Tag nicht in-
nerhalb eines LI-Tags gesetzt wurde.
Export in andere Formate mit Acrobat. Mit Tagged PDF werden PDF-Dokumente in
Acrobat erheblich besser in andere Formate exportiert.
Wird dieselbe Funktion jedoch von Java aus verwendet, dann sieht der Aufruf folgen-
dermaßen aus:
pdflib p;
p.begin_document(String filename, String optlist);
8.1.2 Optionslisten
Optionslisten bieten einen ebenso leistungsfähigen wie einfachen Mechanismus,
um PDFlib-Operationen zu steuern. Sie werden von vielen PDFlib-API-Methoden unter-
stützt, damit man es sich ersparen kann, unzählige Funktionsparameter zu übergeben.
Optionslisten (optlists) sind Strings, die beliebig viele Optionen enthalten können. Da sie
von links nach rechts ausgewertet werden, kann eine Option in der Liste mehrmals auf-
treten; in solchen Fällen wird der zuletzt eingestellte Wert genommen. Optionslisten
unterstützen verschiedene Datentypen und zusammengesetzte Datenstrukturen wie
Arrays. In den meisten Sprachen lassen sich Optionslisten problemlos durch Konkate-
nieren der erforderlichen Schlüsselwörter und Werte bilden. C-Programmierer können
dazu die Funktion sprintf( ) nutzen.
Eine Optionsliste ist ein String, der ein oder mehrere Paare folgender Form enthält:
name wert
Name und Wert sowie Name-Wert-Paare können durch Leerzeichen, Tabulator, Carriage
Return oder Newline getrennt werden. Ein Wert wiederum kann aus mehreren Werten
bestehen. Sie können zwischen Name und Wert auch ein Gleichheitszeichen ’=’ setzen.
name=wert
Besteht der Wert aus einem String mit Leer- oder Gleichheitszeichen, muss der String in
geschweifte Klammern eingeschlossen werden:
key={mehrere Wörter}
key={wert=enthält=Gleichheitszeichen}
Optionslisten, die Listen aus Suboptionen enthalten, benötigen ein zusätzliches Paar
geschweifter Klammern, auch wenn die innere Liste nur aus einem einzigen Element
besteht:
Da Optionslisten von links nach rechts ausgewertet werden, kann eine Option in der
Liste mehrfach übergeben werden. In diesem Fall hat das letzte Auftreten der Option
Vorrang vor früheren Auftritten. Im folgenden Beispiel wird die erste Wertzuweisung
an die Option key durch die zweite überschrieben, und key besitzt nach Verarbeitung der
Optionsliste den Wert 2:
key=1 key=2
Optionslisten unterstützen die Datentypen in Tabelle 8.2. Die Datentypen werden aus-
führlich weiter unten erläutert.
Abhängig vom Typ und von der Interpretation kann eine Option weiteren Einschrän-
kungen unterliegen. Optionen vom Typ Integer oder Float sind manchmal auf be-
Listenwerte. Listenwerte bestehen aus mehreren Werten, die einfache Werte oder wie-
derum Listenwerte sein können. Listen werden mit { und } geklammert. Beispiele für Lis-
tenwerte sind:
PDF_fit_image( ): boxsize {500 600} position {50 0}
PDF_create_gstate( ): dasharray {11 22 33}
PDF_create_annotation( ): polylinelist={{10 20 30 40}}
Rechtecke. Ein Rechteck besteht aus einer Liste von vier Float-Werten, die die Koordi-
naten der linken unteren und der rechten oberen Ecke des Rechtecks festlegen. Das Ko-
ordinatensystem zur Interpretation der Rechteckskoordinaten (Standard- oder Benut-
zerkoordinatensystem) kann je nach Option unterschiedlich sein und wird deswegen
bei der jeweiligen Option beschrieben. Beispiel:
PDF_begin_document( ): cropbox {0 0 500 600}
Aktionslisten. Eine Aktionsliste legt eine oder mehrere Aktionen fest. Jeder Listenein-
trag besteht aus einem Ereignis-Schlüsselwort (Auslöser) und einer Liste von Action-
Handles, die mit PDF_create_action( ) zurückgegeben wurden. Aktionen werden in der
genannten Reihenfolge ausgeführt. Die Menge zulässiger Ereignisse (zum Beispiel
docopen) und der Aktionstyp (zum Beispiel JavaScript) werden bei der jeweiligen Option
beschrieben. Beispiele (unter der Annahme, dass die Werte 0, 1 und 2 von vorangehen-
den Aufrufen von PDF_create_action( ) zurückgegeben wurden:
PDF_begin_document( ): action {open 0}
PDF_create_bookmark( ): action {activate {0 1 2}}
PDF_create_field( ): action {keystroke 0 format 1 validate 2}
Farbe. Eine Farboption besteht aus einer Liste, die ein Farbraum-Schlüsselwort sowie
eine Liste aus Float-Werten enthalten, deren Anzahl vom jeweiligen Farbraum abhängt.
Farbraum-Schlüsselwörter werden dabei wie in PDF_setcolor( ) festgelegt (siehe Ab-
schnitt 8.5.1, »Festlegen von Farbe und Farbraum«, Seite 286), mögliche Werte werden in
Abschnitt 3.3.1, »Farben und Farbräume«, Seite 69, beschrieben:
> Die Farbraum-Schlüsselwörter gray, rgb und cmyk können mit einem, drei oder vier
Float-Werten angegeben werden.
> Das Farbraum-Schlüsselwort lab kann mit drei Float-Werten angegeben werden.
> Das Farbraum-Schlüsselwort spot kann mit einem Schmuckfarben-Handle und ei-
nem Wert für den Farbauftrag angegeben werden. Alternativ dazu kann das Far-
braum-Schlüsselwort spotname mit einem Schmuckfarbnamen und einem Float-
Wert für den Farbauftrag angegeben werden.
Wie bei den jeweiligen Funktionen in Kapitel 8 beschrieben, enthält eine Optionsliste
immer nur eine Teilmenge der oben dargestellten Schlüsselwörter. Beispiele für Farb-
werte sind:
PDF_fill_textblock( ): strokecolor={ rgb 1 0 0 }
PDF_fill_textblock( ): bordercolor=none
PDF_fill_textblock( ): fillcolor={ spotname {PANTONE 281 U} 0.5 }
PDF_fill_textblock( ): fillcolor={ spotname 1 0.8 }
C void PDF_boot(void)
void PDF_shutdown(void)
Gültigkeit null
Bindungen C: Wird für die C-Sprachbindung empfohlen, wenngleich gegenwärtig nicht unbedingt
erforderlich.
Andere: Bei allen anderen Sprachbindungen wird das Starten und Beenden automatisch
vom Wrappercode durchgeführt. Daher sind diese Funktionen nicht verfügbar.
Details Diese Funktion erzeugt ein neues PDFlib-Objekt, wobei es die PDFlib-internen Standard-
routinen zur Fehlerbehandlung und Speicherallozierung verwendet.
Rückgabe Handle auf ein PDFlib-Objekt, das dann in nachfolgenden PDFlib-Aufrufen verwendet
werden kann. Schlägt diese Funktion aufgrund von mangelndem Speicher fehl, wird
NULL (in C) zurückgegeben oder eine PDFlib-Exception ausgelöst.
Gültigkeit null; mit dieser Funktion beginnt der Geltungsbereich object, der immer mit einem
entsprechenden Aufruf von PDF_delete( ) beendet werden muss.
Bindungen Der Datentyp für das PDFlib-Objekt-Handle ist von der jeweiligen Sprachbindung ab-
hängig und für PDFlib-Clients an sich nicht weiter interessant, da diese das PDF-Handle
einfach unbesehen an alle Funktionen als erstes Argument weiterreichen.
C: Wenn Sie die PDFlib-DLL dynamisch zur Laufzeit laden möchten, verwenden Sie PDF_
new_dl( ) (siehe Abschnitt 2.4.3, »Einsatz von PDFlib als DLL, die zur Laufzeit geladen
wird«, Seite 27). PDF_new_dl( ) gibt einen Zeiger auf eine PDFlib_api-Struktur zurück, die
opaque Zeiger auf Benutzerdaten, der mit PDF_get_opaque( ) abgefragt werden kann.
Rückgabe Handle auf ein PDFlib-Objekt, das dann in nachfolgenden PDFlib-Aufrufen verwendet
werden kann. Schlägt diese Funktion aufgrund von mangelndem Speicher fehl, wird
NULL (in C) zurückgegeben oder eine PDFlib-Exception ausgelöst.
Details Diese Funktion erzeugt ein neues PDFlib-Objekt mit benutzerdefinierten Funktionen
zur Fehlerbehandlung und Speicherverwaltung. Im Gegensatz zu PDF_new( ) kann der
Aufrufer bei Bedarf eigene Prozeduren zur Fehlerbehandlung und Speicherverwaltung
übergeben. Die Funktionszeiger für den Error-Handler oder die Speicherverwaltungs-
routinen können NULL sein. Es werden dann die PDFlib-Standardroutinen verwendet.
Es müssen entweder alle drei oder es darf keine Speicherverwaltungsroutine übergeben
werden.
Gültigkeit null; mit dieser Funktion beginnt der Geltungsbereich object, der immer mit einem
entsprechenden Aufruf von PDF_delete( ) beendet werden muss. Nach Aufruf dieser
Funktion darf keine andere PDFlib-Funktion mit demselben PDFlib-Objekt aufgerufen
werden.
Löscht ein PDF-Objekt und gibt alle zugehörenden internen Ressourcen frei.
Details Diese Funktion löscht ein PDF-Objekt und gibt alle zum Dokument gehörenden PDFlib-
internen Ressourcen frei. Wenngleich es zur Generierung einzelner Dokumente nicht
erforderlich ist, sollte das PDF-Objekt jedoch in allen Serveranwendungen nach abge-
schlossener PDF-Erstellung unbedingt gelöscht werden. Diese Funktion darf für ein
PDF-Objekt nur einmal aufgerufen werden. PDF_delete( ) sollte außerdem zur Bereini-
gung nach einer Exception aufgerufen werden. PDF_delete( ) selbst löst unter keinen
Umständen eine Exception aus. Bei der Generierung mehrerer PDF-Dokumente muss
PDF_delete( ) nicht nach jedem einzelnen Dokument aufgerufen werden, sondern dies
kann auch nach der Generierung aller PDF-Dokumente erfolgen.
Gültigkeit beliebig; mit dieser Funktion beginnt der Geltungsbereich null, das heißt, es sind keine
weiteren Aufrufe von API-Funktionen mehr erlaubt.
Bindungen C: Wurde die PDFlib-DLL mit PDF_new_dl( ) dynamisch zur Laufzeit geladen, so ver-
wenden Sie PDF_delete_dl( ) zum Löschen des PDFlib-Objekts.
C++: Diese Funktion ist indirekt über den PDFlib-Destruktor verfügbar.
Java: Diese Funktion wird automatisch vom Wrappercode aufgerufen. Um Unzuläng-
lichkeiten im Finalizer-System von Java zu umgehen, kann sie jedoch auch explizit aus
dem Clientcode heraus aufgerufen werden.
PHP: diese Funktion wird automatisch für die objektorientierte PHP-5-Schnittstelle auf-
gerufen, wenn das PDFlib-Objekt den Geltungsbereich verlässt.
C++ void begin_document_callback(size_t (*writeproc) (PDF *p, void *data, size_t size),
string optlist)
C void PDF_begin_document_callback(PDF *p,
size_t (*writeproc) (PDF *p, void *data, size_t size), const char *optlist)
len (Nur C-Sprachbindung) Länge von filename (in Bytes) für UTF-16-Strings. Ist len
gleich 0, muss ein null-terminierter String übergeben werden.
writeproc (Nur C und C++) C-Callback-Funktion, die von PDFlib aufgerufen wird, um
die generierten PDF-Daten vollständig oder teilweise zu übertragen.
optlist Optionsliste mit Dokumentoptionen gemäß Tabelle 8.5 oder Tabelle 8.7. Optio-
nen, die für PDF_end_document( ) festgelegt werden, haben Vorrang vor gleichnamigen
Optionen in PDF_begin_document( ).
Rückgabe -1 (in PHP: 0) im Fehlerfall, sonst 1. Ist filename leer, ist die Funktion in jedem Fall erfolg-
reich und gibt nie den Fehlercode -1 (in PHP: 0) zurück.
Details Diese Funktion erzeugt eine neue PDF-Datei mit dem Namen filename. PDFlib versucht,
eine Datei mit dem übergebenen Namen zu öffnen und schließt die Datei, sobald das
PDF-Dokument fertig ist.
PDF_begin_document_callback( ) öffnet ein neues PDF-Dokument direkt im Speicher,
ohne dabei in eine Datei zu schreiben. Die in writeproc übergebene Callback-Funktion
Gültigkeit object; mit dieser Funktion beginnt der Geltungsbereich document, sofern die Datei
erfolgreich geöffnet werden konnte. Diese Funktion muss immer paarweise mit PDF_
end_document( ) auftreten.
Bindungen C, C++, Java, JScript: Achten Sie darauf, die Sonderbedeutung des Gegenschrägstrichs im
Pfadseparator korrekt aufzuheben. Folgendes Beispiel bezeichnet eine Datei auf einem
Netzlaufwerk: \\\\malik\\rp\\foo.pdf.
PDF_begin_document_callback( ) ist nur in C und C++ verfügbar. Die mit writeproc überge-
bene Funktion darf keine C++-Methode, sondern muss eine C-Funktion sein.
optlist Liste mit Dokumentoptionen gemäß Tabelle 8.6. Optionen, die für PDF_end_
document( ) festgelegt werden, haben Vorrang vor gleichnamigen Optionen in PDF_
begin_document( ).
Details Diese Funktion beendet die Generierung des PDF-Dokuments, gibt alle dokumentspezi-
fischen Ressourcen frei und schließt die Ausgabedatei, sofern das PDF-Dokument mit
PDF_begin_document( ) geöffnet wurde. PDF_end_document( ) muss nach abgeschlossener
Seitengenerierung durch den Client auf jeden Fall aufgerufen werden, unabhängig da-
von, auf welche Art das PDF-Dokument geöffnet wurde.
Wurde das Dokument direkt im Speicher und nicht in einer Datei generiert, bleibt
der Dokumentpuffer auch nach PDF_end_document( ) erhalten, so dass er mit PDF_get_
buffer( ) ausgelesen werden kann. Er wird freigegeben, sobald PDF_begin_document( ) er-
neut aufgerufen wird oder das PDFlib-Objekt mit PDF_delete( ) seine Gültigkeit verliert.
Tabelle 8.7 Unteroptionen für die Option viewerpreferences für PDF_begin_document( ) und PDF_end_
document( )
Option Typ Beschreibung
centerwindow Boolean Legt fest, ob das Dokumentfenster am Bildschirm zentriert wird. Standardwert:
false.
direction Schlüsselwort Leserichtung des Dokuments, die sich auf das Blättern in der Doppelseitenansicht
auswirkt. Standardwert: l2r).
l2r Von links nach rechts
r2l Von rechts nach links (einschließlich der Schriftsysteme mit vertikaler
Laufrichtung)
displaydoctitle Boolean Legt fest, ob in der Titelleiste von Acrobat das Dokumentinfofeld »Titel« (true)
oder der Dateiname (false) angezeigt wird. Standardwert: false.
fitwindow Boolean Legt fest, ob das Dokumentfenster an die Größe der ersten Seite angepasst wird.
Standardwert: false.
hidemenubar Boolean Legt fest, ob die Menüleiste von Acrobat ausgeblendet wird. Standardwert: false.
hidetoolbar Boolean Legt fest, ob die Werkzeugleisten von Acrobat ausgeblendet werden. Acrobat 5
ignoriert diese Einstellung bei der Anzeige von PDFs im Browser. Standardwert:
false.
hidewindowui Boolean Legt fest, ob die Fenstersteuerelemente von Acrobat ausgeblendet werden.
Standardwert: false.
nonfullscreen- Schlüsselwort (Nur relevant, wenn die Option openmode auf fullscreen gesetzt ist) Legt fest, wie
pagemode das Dokument beim Beenden des Vollbildmodus angezeigt wird. Default:
usenone.
bookmarks Lesezeichen-Fenster anzeigen
thumbnails Seiten-Fenster anzeigen
layers Ebenen-Fenster anzeigen
none Nur Dokumentfenster anzeigen
viewarea Schlüsselwort Schlüsselwort zur Auswahl einer Seitengrößenangabe (Box), die den Seitenbereich
viewclip beschreibt, der beim Betrachten des Dokuments am Bildschirm oder beim Drucken
printarea angezeigt oder beschnitten wird. Acrobat ignoriert diese Einstellung zwar, sie
printclip kann aber für andere Anwendungen sinnvoll sein. Standardwert: crop.
art ArtBox wird verwendet.
bleed BleedBox wird verwendet.
crop CropBox wird verwendet.
media MediaBox wird verwendet.
trim TrimBox wird verwendet.
PDF/X: Es sind nur media und bleed zulässig.
size (Nur C- und C++-Sprachbindung) C-Zeiger auf eine Speicherstelle, an der die Länge
der zurückgegebenen Daten in Bytes abgelegt wird.
Tabelle 8.8 Unteroptionen für die Option labels in PDF_begin/end_document( ) und die Option label in PDF_
begin/end_page_ext( )
Option Typ Beschreibung
group String (Nur für PDF_begin_document( ); erforderlich, wenn das Dokument Seitengrup-
pen verwendet und sonst nicht zulässig) Das Label wird auf die Seiten der fest-
gelegten sowie aller nachfolgenden Gruppen angewandt, bis ein neues Label zum
Einsatz kommt.
hypertext- Schlüsselwort Legt den Zeichensatz für die Option prefix fest (siehe Abschnitt 4.5.4, »String-
encoding Behandlung in nicht Unicode-fähigen Sprachen«, Seite 108). Ein leerer String wird
als unicode interpretiert. Standardwert: Wert des globalen Parameters
hypertextencoding.
pagenumber Integer (Nur für PDF_end_document( ); erforderlich, wenn das Dokument keine Seitengru-
ppen verwendet und sonst nicht zulässig) Das Label wird auf die festgelegte sowie
solange auf alle nachfolgenden Seiten angewandt, bis ein neues Label zum Ein-
satz kommt.
prefix Hypertext- Das Präfix für alle Labels des Bereichs. Standardwert: none.
string
start Integer >= 1 Numerischer Wert für das erste Label des Bereichs. Nachfolgende Seiten des
Bereichs werden sequentiell ab diesem Wert durchnummeriert. Standardwert: 1.
style Schlüsselwort Der zu verwendende Nummerierungsstil. Standardwert: none.
none keine Seitennummern; Labels bestehen nur aus dem Präfix.
D Dezimale arabische Ziffern (1, 2, 3, ...)
R Große römische Zahlen (I, II, III, ...)
r Kleine römische Zahlen (i, ii, iii, ...)
A Großbuchstaben (A, B, C, ..., AA, BB, CC, ...)
a Kleinbuchstaben (a, b, c, ..., aa, bb, cc, ...)
Rückgabe Ein Puffer mit binären PDF-Daten zur Weiterverarbeitung durch den Client. Es wird ei-
ner der in Tabelle 8.1 aufgeführten sprachspezifischen Datentypen für Binärdaten zu-
Details Diese Funktion holt den gesamten Puffer mit den PDF-Daten oder einen Teil davon.
Wird diese Funktion zwischen Seitenbeschreibungen aufgerufen, gibt sie die bislang ge-
nerierten PDF-Daten zurück. Werden die PDF-Daten direkt im Speicher erzeugt, muss
sie mindestens nach PDF_end_document( ) aufgerufen werden und gibt dann den Rest
des PDF-Dokuments zurück. Sie kann aber auch früher aufgerufen werden, um nur ei-
nen Teil der Daten abzuholen. Wird diese Funktion nur ein einziges Mal, und zwar nach
PDF_end_document( ) aufgerufen, enthält der Rückgabepuffer garantiert das vollständi-
ge PDF-Dokument in einem Stück.
Da die PDF-Ausgabe binäre Zeichen enthält, muss die Client-Software auf nicht
druckbare Zeichen inklusive Null vorbereitet sein.
Gültigkeit object, document (mit anderen Worten: nach PDF_end_page_ext( ) und vor PDF_begin_
page_ext( ) oder nach PDF_end_document( ) und vor PDF_delete( ). Diese Funktion darf nur
verwendet werden, wenn ein leerer Dateiname an PDF_begin_document( ) übergeben
wurde.
Wurde die Option linearize in PDF_begin_document( ) auf true gesetzt, beschränkt sich der
Geltungsbereich auf object, das heißt, dass diese Funktion nur nach PDF_end_
document( ) aufgerufen werden kann.
Bindungen C und C++: Der size-Parameter wird nur von C- und C++-Clients verwendet.
Andere: Ein Objekt passender Länge wird zurückgegeben, und der size-Parameter muss
weggelassen werden.
Fügt unter Anwendung verschiedener Optionen eine neue Seite zum Dokument hinzu.
width, height Die Parameter width und height geben die Größe der neuen Seite in
Punkt an. Sie können von den gleichnamigen Optionen überschrieben werden (in die-
sem Fall kann für diese Parameter der Dummy-Wert 0 verwendet werden). Eine Liste
häufig benutzter Seitenformate finden Sie in Tabelle 3.4. Einzelheiten hierzu finden Sie
in Tabelle 8.10 bei den Optionen width und height.
optlist Optionsliste gemäß Tabelle 8.9 und Tabelle 8.10. Diese Optionen haben niedri-
gere Prioriät als die Optionen in PDF_end_page_ext( ).
Details Diese Funktion setzt für die neue Seite alle Parameter für Text, Grafik und Farbzustand
auf die Standardwerte zurück.
Gültigkeit document; mit dieser Funktion beginnt der Geltungsbereich page; diese Funktion muss
immer paarweise mit PDF_end_page_ext( ) auftreten.
Parameter Folgende Parameter sind veraltet und werden in dieser Funktion ignoriert: pagewidth,
pageheight, ArtBox, BleedBox, CropBox, TrimBox
Gültigkeit page; mit dieser Funktion endet der Geltungsbereich page; diese Funktion muss immer
paarweise mit PDF_begin_page_ext( ) auftreten.
Unterbricht die Ausgabe der aktuellen Seite. Sie kann später wieder aufgenommen wer-
den.
Details Die aktuelle Seite wird mit all ihren Zuständen (Grafik, Farbe, Text etc.) intern gespei-
chert. Soll mit der Ausgabe fortgefahren werden, kann sie mit PDF_resume_page( ) wie-
der aufgenommen werden. Wurde die Ausgabe einer Seite unterbrochen, muss sie erst
wieder aufgenommen werden, um die Seite zu schließen.
Gültigkeit page; mit dieser Funktion beginnt der Geltungsbereich document. Diese Funktion muss
immer paarweise mit PDF_resume_page( ) auftreten. Sie darf nicht im Tagged-PDF-
Modus verwendet werden.
Details Die Seitenausgabe muss mit PDF_suspend_page( ) unterbrochen worden sein. Die Ausga-
be wird wieder aufgenommen, um weitere Inhalte anzufügen. Wurde die Ausgabe einer
Seite unterbrochen, muss sie erst wieder aufgenommen werden, um die Seite schließen
zu können, auch wenn keine weiteren Inhalte hinzukommen.
Gültigkeit document; mit dieser Funktion beginnt der Geltungsbereich page; diese Funktion muss
immer paarweise mit PDF_suspend_page( ) auftreten.
8.2.3 Parameterbehandlung
PDFlib verwaltet eine Reihe interner Parameter, mit denen sich das Verhalten von
PDFlib bzw. das Aussehen der PDF-Ausgabe steuern lässt. Zum Einstellen und Abfragen
numerischer und String-Parameter stehen vier Funktionen bereit. Bei allen Parametern
(Schlüssel wie Werte) wird zwischen Groß- und Kleinschreibung unterschieden. Bei je-
der Kategorie von Funktionen in diesem Kapitel werden auch die jeweils relevanten Pa-
rameter beschrieben.
modifier Optionaler Modifizierer, der auf den Parameter anzuwenden ist. Ob ein Mo-
difizierer erforderlich ist und worauf er sich gegebenenfalls bezieht, wird in den ver-
schiedenen Parametertabellen erläutert. Wird kein Modifizierer benötigt, muss er auf 0
gesetzt werden.
modifier Optionaler Modifizierer, der auf den Parameter anzuwenden ist. Ob ein Mo-
difizierer erforderlich ist und worauf er sich gegebenenfalls bezieht, wird in den ver-
schiedenen Parametertabellen erläutert. Wird kein Modifizierer benötigt, muss er auf 0
gesetzt werden.
Rückgabe String-Wert des Parameters. Der zurückgegebene String kann bis zum Ende des umge-
benden Geltungsbereichs document verwendet werden. Ist keine Information verfüg-
bar, wird ein Leerstring zurückgegeben.
Bindungen C und C++: C- und C++-Clients dürfen den zurückgegebenen String nicht freigeben, da
PDFlib alle String-Ressourcen intern verwaltet.
C++ void create_pvf(string filename, const void *data, size_t size, string optlist)
Java void create_pvf(String filename, byte[] data, String optlist)
Perl PHP PDF_create_pvf(resource p, string filename, string data, string optlist)
C void PDF_create_pvf(PDF *p,
const char *filename, int len, const void *data, size_t size, const char *optlist)
filename (Name-String) Name der virtuellen Datei; dies ist ein beliebiger String, der in
weiteren PDFlib-Aufrufen zum Referenzieren der virtuellen Datei verwendet werden
kann.
data Verweis auf die Daten, die den Inhalt der virtuellen Datei bilden sollen. In C und
C++ handelt es sich um einen Zeiger auf einen Speicherpuffer. In Java ist es ein Byte-Ar-
ray. In Perl und PHP ist es ein String.
size (Nur C- und C++-Sprachbindung) Länge des Speicherblocks mit den Daten in
Bytes.
Details Der Name der virtuellen Datei kann an alle API-Funktionen übergeben werden, die Ein-
gabedateien verarbeiten (die generierte PDF-Ausgabe kann nicht in eine virtuelle Datei
geschrieben werden; um das zu erreichen, benutzen Sie in PDF_begin_document( ) einen
leeren Dateinamen). Manche Funktionen sperren die virtuelle Datei, solange die Daten
verwendet werden. Virtuelle Dateien werden solange im Speicher gehalten, bis sie mit
PDF_delete_pvf( ) explizit oder durch PDF_delete( ) automatisch gelöscht werden.
PVF-Dateien werden für jedes PDFlib-Objekt getrennt gespeichert. Sie lassen sich
nicht von verschiedenen PDFlib-Objekten gemeinsam nutzen, können aber zur Erstel-
lung mehrerer Dokumente mit demselben PDFlib-Objekt verwendet werden. Arbeiten
Threads mit verschiedenen PDFlib-Objekten, brauchen sie den PVF-Gebrauch nicht zu
synchronisieren. Verweist filename auf eine bereits existierende virtuelle Datei, wird
eine Exception ausgelöst. Diese Funktion überprüft nicht, ob filename bereits für eine
normale auf der Festplatte liegende Datei verwendet wird.
Wird die Option copy nicht angegeben, darf der Aufrufer die übergebenen Daten erst
nach dem erfolgreichen Aufruf von PDF_delete_pvf( ) ändern oder freigeben (löschen).
Bei Nichtbeachtung dieser Regel gibt es aller Wahrscheinlichkeit nach einen Absturz.
Gültigkeit beliebig
Löscht eine benannte virtuelle Datei und gibt die zugehörigen Datenstrukturen (nicht
jedoch den eigentlichen Inhalt) frei.
len (Nur C-Sprachbindung) Länge von filename (in Bytes) für Strings, die Null-Zeichen
enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben werden.
Details Ist die Datei nicht gesperrt, werden die zu filename gehörigen Datenstrukturen sofort
von PDFlib gelöscht. Verweist filename nicht auf eine virtuelle Datei, beendet sich diese
Funktion kommentarlos. Nach einem erfolgreichen Aufruf kann filename wieder ver-
wendet werden. Virtuelle Dateien werden durch PDF_delete( ) automatisch gelöscht.
Das genaue Verhalten hängt davon ab, ob das zugehörige PDF_create_pvf( ) mit der
Option copy aufgerufen wurde: Ist dies der Fall, werden sowohl die administrativen Da-
tenstrukturen der Datei als auch die eigentlichen Daten freigegeben; andernfalls wird
die Freigabe des Inhalts dem Client überlassen.
Gültigkeit beliebig
8.2.5 Ausnahmebehandlung
Tabelle 8.13 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und
Werte.
Ermittelt die Nummer der zuletzt ausgelösten Exception oder die Ursache für einen ge-
scheiterten Funktionsaufruf.
Rückgabe Die Nummer der letzten vom PDFlib-Objekt ausgelösten Exception oder der Code für
die Fehlerursache des Funktionsaufrufs, der zuletzt mit einem Fehlercode scheiterte.
Gültigkeit Zwischen einer von PDFlib ausgelösten Exception und dem Ende der Lebensdauer eines
PDFlib-Objekts. Alternativ dazu kann diese Funktion aufgerufen werden, nachdem eine
Funktion den Fehlercode -1 (in PHP: 0) zurückgegeben hat, aber noch bevor eine
Funktion aufgerufen wird, die nicht in diesem Abschnitt aufgeführt ist.
Bindungen In C++, Java, und PHP 5 ist diese Funktion auch als Methode get_errnum( ) im Objekt
PDFlibException verfügbar.
Ermittelt den beschreibenden Text der zuletzt ausgelösten Exception oder die Ursache
eines gescheiterten Funktionsaufrufs.
Rückgabe Text der letzten vom PDFlib-Objekt ausgelösten Exception oder Code für die Fehlerursa-
che des Funktionsaufrufs, der zuletzt mit einem Fehlercode scheiterte.
Bindungen In C++, Java, und PHP 5 ist diese Funktion auch als Methode get_errmsg( ) im Objekt
PDFlibException verfügbar.
Ermittelt den Namen der API-Funktion, die die letzte Exception ausgelöste oder schei-
terte.
Rückgabe Name der Funktion, die die letzte Exception ausgelöst hat oder zuletzt mit einem Feh-
lercode gescheitert ist.
Gültigkeit Zwischen einer von PDFlib ausgelösten Exception und dem Ende der Lebensdauer eines
PDFlib-Objekts. Alternativ dazu kann diese Funktion aufgerufen werden, nachdem eine
Funktion den Fehlercode -1 (in PHP: 0) zurückgegeben hat, aber noch bevor eine
Funktion aufgerufen wird, die nicht in diesem Abschnitt aufgeführt ist.
Bindungen In C++, Java, und PHP 5 ist diese Funktion auch als Methode get_apiname( ) im Objekt
PDFlibException verfügbar.
Details Diese Funktion gibt den Zeiger auf Benutzerdaten zurück, der im Aufruf von PDF_
new2( ) übergeben und in PDFlib gespeichert wurde. PDFlib reicht den Zeiger ohne jegli-
che Bearbeitung an den Client weiter. Dieser Zeiger kann zum Beispiel in multi-threa-
ded Anwendungen verwendet werden, um private thread-spezifische Daten innerhalb
des PDFlib-Objekts zu speichern. Er ist insbesondere bei thread-spezifischer Ausnahme-
behandlung nützlich.
Gültigkeit beliebig
8.2.6 Hilfsfunktionen
Die folgenden Funktion können in Umgebungen hilfreich sein, in denen die entspre-
chende Funktionalität nicht vorhanden ist.
size (Nur C-Sprachbindung) C-Zeiger auf eine Speicherstelle, an der die Länge des zu-
rückgegebenen Strings in Bytes abgelegt wird.
Rückgabe Der nach UTF-8 konvertierte String, der mit einem BOM (\xEF\xBB\xBF) beginnt. Auf
EBCDIC-Systemen wird das Ergebnis nach EBCDIC konvertiert, außer in der Java-Sprach-
bindung. Der zurückgegebene String ist so lange gültig, bis eine von PDF_utf16_to_utf8( )
oder PDF_utf8_to_utf16( ) verschiedene PDFlib-Funktion aufgerufen oder eine Exception
ausgelöst wird. Benötigen Clients den String länger, müssen sie ihn kopieren. Der für
den konvertierten String verwendete Speicher wird von PDFlib verwaltet.
Gültigkeit beliebig
size (Nur C-Sprachbindung) C-Zeiger auf eine Speicherstelle, an der die Länge des zu-
rückgegebenen Strings in Bytes abgelegt wird.
Rückgabe Der nach UTF-16 konvertierte String. Der zurückgegebene String ist so lange gültig, bis
eine von PDF_utf16_to_utf8( ) oder PDF_utf8_to_utf16( ) verschiedene PDFlib-Funktion
aufgerufen oder eine Exception ausgelöst wird. Benötigen Clients den String länger,
müssen sie ihn kopieren. Der für den konvertierten String verwendete Speicher wird
von PDFlib verwaltet.
Gültigkeit beliebig
Tabelle 8.14 Parameter und Werte für Fontfunktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«, Seite 236)
Funktion Schlüssel Erklärung
set_parameter FontAFM Wie die jeweilige Zeile in der entsprechenden Kategorie der UPR-Ressourcendatei
FontPFM (siehe Abschnitt 3.1.5, »Ressourcenkonfiguration und Dateisuche«, Seite 56). Durch
FontOutline mehrere Aufrufe erhält die interne Liste neue Einträge (siehe auch resourcefile in
Encoding Tabelle 8.3). Geltungsbereich: beliebig.
HostFont
ICCProfile
SearchPath
Standard-
OutputIntent
get_value font Gibt den Identifier des aktuellen mit PDF_setfont( ) gesetzten Fonts zurück oder -1
(in PHP: 0), falls kein Font gesetzt wurde. Geltungsbereich: page, pattern,
template, glyph.
get_value fontmaxcode Gibt die größte Zeichencodenummer des durch den Modifizierer bezeichneten
Font zurück. Bei encoding=glyphid entspricht das der Anzahl der Glyph-IDs.
Geltungsbereich: beliebig.
get_parameter fontname Name des aktuellen Fonts, der mit PDF_setfont( ) gesetzt worden sein muss.
Geltungsbereich: page, pattern, template, glyph.
get_parameter fontencoding Name des Zeichensatzes oder der CMap, die für die aktuelle Schrift verwendet
wird. Der Font muss mit PDF_setfont( ) gesetzt worden sein. Geltungsbereich:
page, pattern, template, glyph.
get_value fontsize Gibt die Größe des aktuellen Fonts zurück, der mit PDF_setfont( ) gesetzt worden
sein muss. Geltungsbereich: page, pattern, template, glyph.
get_parameter fontstyle Stil des aktuellen Fonts, der im Wesentlichen der Option fontstyle entspricht
(normal, bold, italic oder bolditalic). Geltungsbereich: page, pattern, template,
glyph.
get_value capheight Gibt Metrikdaten für den durch den Modifizierer bezeichneten Font zurück.
ascender Weitere Informationen finden Sie in Abschnitt 4.6, »Textmetrik und Text-
descender varianten«, Seite 115. Die Werte werden anteilig zur Schriftgröße angegeben und
müssen daher mit der gewünschten Schriftgröße multipliziert werden.
Geltungsbereich: beliebig.
set_parameter fontwarning Wenn false, gibt PDF_load_font( ) -1 (in PHP: 0) zurück (statt eine Exception
auszulösen), wenn die Font/Zeichensatz-Kombination nicht geladen werden
kann. Standardwert: true. Geltungsbereich: beliebig.
get_value monospace Gibt für den aktuellen Font den Wert der Option monospace zurück, sofern diese
gesetzt wurde, andernfalls 0. Geltungsbereich: page, pattern, template, glyph.
set_value subsetlimit Deaktiviert die Bildung von Fontuntergruppen, wenn das Dokument mehr als den
gegebenen Prozentsatz an Zeichen des Fonts verwendet. Standardwert: 100
Prozent. Geltungsbereich: beliebig.
set_value subsetminsize Fontuntergruppen werden nur bei Fonts gebildet, die größer als die angegebene
Zahl in Kilobyte sind (siehe Abschnitt 4.3, »Schrifteinbettung und
Schriftuntergruppen«, Seite 93). Standardwert: 100 KB. Geltungsbereich: beliebig.
Sucht nach einer Schrift und bereitet sie zur späteren Verwendung vor.
fontname (Name-String) Der tatsächliche oder der Alias-Name der Schrift. Er wird bei
der Suche nach den Fontdaten verwendet (siehe Abschnitt 4.3.1, »Wie PDFlib nach Fonts
sucht«, Seite 93). Es wird zwischen Groß- und Kleinschreibung unterschieden.
len (Nur C-Sprachbindung) Länge von fontname (in Bytes) bei UTF-16-Strings. Ist len
gleich 0, muss ein null-terminierter String übergeben werden.
encoding Zeichensatz, der mit der Schrift verwendet werden soll (es wird zwischen
Groß- und Kleinschreibung unterschieden). Dabei stehen folgende Zeichensätze zur
Auswahl (weitere Informationen finden Sie in Abschnitt 4.4, »Zeichensätze«, Seite 98):
> einer der vordefinierten 8-Bit-Zeichensätze winansi, macroman, macroman_apple,
ebcdic, pdfdoc, iso8859-X, cpXXXX und U+XXXX
> host oder auto für einen automatisch selektierten Zeichensatz
> Name eines benutzerdefinierten Zeichensatzes, der aus einer Datei geladen oder mit
PDF_encoding_set_char( ) definiert wurde
> unicode für auf Unicode basierende Adressierung
> cpXXXX für CJK-Codepages (siehe Tabelle 4.8)
> glyphid für Adressung via Glyphen-ID
> builtin zur Selektion des internen Zeichensatzes der Schrift
> Name einer Standard-CMap (siehe Abschnitt 4.7, »Chinesischer, japanischer und ko-
reanischer Text«, Seite 120)
> ein dem Betriebssystem bekannter Zeichensatzname (nicht auf allen Plattformen
verfügbar)
Der gewählte Zeichensatz muss zur Schrift kompatibel sein. Tabelle 8.16 listet die zuläs-
sigen Kombinationen von Encodings und Fontformaten auf.
Rückgabe Font-Handle zur späteren Verwendung in PDF_setfont( ). Das Verhalten dieser Funktion
ändert sich, wenn der Parameter oder die Option fontwarning auf false gesetzt ist. In die-
sem Fall gibt die Funktion den Fehlercode -1 (in PHP: 0) zurück, statt eine Exception aus-
Details Diese Funktion bereitet eine Schrift zur späteren Verwendung in PDF_setfont( ) vor. Die
Metrikdaten werden aus dem Arbeitsspeicher oder aus einer (virtuellen oder auf der
Festplatte liegenden) Metrikdatei geladen. Ist der Parameter fontwarning auf true ge-
setzt, wird eine Exception ausgelöst, wenn die angeforderte Font/Zeichensatz-Kombina-
tion aufgrund von Konfigurationsproblemen nicht verwendet werden konnte (zum
Beispiel, wenn ein Font, Metrikdaten oder eine Encoding-Datei nicht gefunden werden
konnte oder die gefundenen Informationen nicht zusammenpassen). Andernfalls kann
der von dieser Funktion zurückgegebene Wert als Fontargument in weiteren Funktio-
nen zur Schriftbehandlung verwendet werden.
Details Die Schrift muss auf jeder Seite erneut gesetzt werden, und zwar vor jeglicher Textaus-
gabe. Die Schrifteinstellungen gelten immer nur für die aktuelle Seite. Die aktuelle
Schrift kann auf einer Seite beliebig oft geändert werden.
Parameter Siehe Tabelle 8.14. Die Funktion setzt den Parameter leading automatisch auf fontsize.
fontname (Name-String) Name, unter dem die Schrift registriert und später in PDF_
load_font( ) verwendet werden kann.
Details Diese Funktion setzt alle Text-, Grafik- und Farbzustandsparameter auf ihre Standard-
werte zurück. Die Schrift kann eine beliebige Anzahl von Glyphendefinitionen enthal-
ten, aber über einen Zeichensatz kann nur auf 256 Glyphen zugegriffen werden. Die de-
finierte Schrift gilt bis zum Ende des aktuellen Geltungsbereichs document.
Gültigkeit document, page; mit dieser Funktion beginnt der Geltungsbereich font; diese Funktion
muss immer paarweise mit PDF_end_font( ) auftreten.
Gültigkeit font; mit dieser Funktion endet der Geltungsbereich font; diese Funktion muss immer
paarweise mit PDF_begin_font( ) auftreten.
glyphname Name der Glyphe. Unter diesem Namen muss die Glyphe in allen Enco-
dings, die mit der Schrift verwendet werden, verzeichnet sein. Glyphennamen müssen
innerhalb einer Schrift eindeutig sein.
llx, lly, urx, ury Ist die Option colorized der Schrift gleich false (der Standardwert), be-
zeichnen diese vier Parameter die Koordinaten der linken unteren und der rechten obe-
ren Ecke der Boundingbox der Glyphe. Die Boundingbox-Werte müssen korrekt gesetzt
sein, um Probleme beim PostScript-Druck zu vermeiden. Ist die Option colorized der
Schrift gleich true, müssen alle vier Werte gleich 0 sein.
Details Die Glyphen einer Schrift können mittels Text-, Vektorgrafik- und Rasterbild-Funktio-
nen definiert werden. Rasterbilder dürfen aber nur eingesetzt werden, wenn die Option
colorized der Schrift auf true gesetzt ist, oder sie mit der Option mask geöffnet wurden.
Zur Definition von Bitmaps in Type-3-Schriften sollte mit Inline-Bildern gearbeitet wer-
den (siehe Abschnitt 5.1.1, »Grundlegende Vorgehensweise«, Seite 147).
Da der Grafikzustand der Seite beim Zeichnen der Glyphe vollständig übernommen
wird, sofern die Option colorize auf true gesetzt ist, sollten in der Glyphendefinition alle
relevanten Aspekte des Grafikzustands (zum Beispiel die Strichstärke) explizit einge-
stellt werden.
Gültigkeit page, font; mit dieser Funktion beginnt der Geltungsbereich glyph; diese Funktion muss
immer paarweise mit PDF_end_glyph( ) auftreten.
Gültigkeit glyph; mit dieser Funktion endet der Geltungsbereich glyph; diese Funktion muss
immer paarweise mit PDF_begin_glyph( ) auftreten.
C++ Java void encoding_set_char(String encoding, int slot, String glyphname, int uv)
Perl PHP PDF_encoding_set_char(resource p, string encoding, int slot, string glyphname, int uv)
C void PDF_encoding_set_char(PDF *p,
const char *encoding, int slot, const char *glyphname, int uv)
slot Position des zu definierenden Zeichens, wobei 0 <= slot <= 255 gilt. Jede Position
darf innerhalb eines bestimmten Zeichensatzes nur einmal belegt werden.
Details Diese Funktion kann mehrfach aufgerufen werden. Es können maximal 256 Zeichenpo-
sitionen in einem Zeichensatz definiert werden. Dies ist schrittweise möglich, solange
der Zeichensatz nicht verwendet wird. Danach jedoch wird beim Versuch, weitere Zei-
chen hinzuzufügen, eine Exception ausgelöst. Es müssen nicht alle Zeichenpositionen
festgelegt werden; nicht definierte Positionen werden mit .notdef belegt.
Es sind drei verschiedene Kombinationen aus Glyphenname und Unicode-Wert
möglich:
> glyphname wird übergeben, uv = 0: dies entspricht einer Encoding-Datei ohne Uni-
code-Werte
> uv wird übergeben, glyphname jedoch nicht: dies entspricht einer Codepage-Datei
> glyphname und uv werden übergeben: dies entspricht einer Encoding-Datei mit Uni-
code-Werten
Der definierte Zeichensatz kann bis zum Ende des aktuellen Geltungsbereichs object
verwendet werden.
Tabelle 8.18 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und
Werte.
Setzt die aktuelle Position für die Textausgabe auf der Seite.
Details Zu Beginn jeder Seite wird die Textposition auf den Standardwert (0, 0) gesetzt. Der ak-
tuelle Punkt für die Grafikausgabe und die aktuelle Textposition werden getrennt ver-
waltet.
Gibt Text in der aktuellen Schrift und Größe an der aktuellen Textposition aus.
len (Nur für PDF_show2( )) Länge von text (in Bytes) für UCS-2-Strings, die Nullzeichen
enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben werden.
Details Der Font muss zuvor mit PDF_setfont( ) gesetzt worden sein. Die aktuelle Textposition
wird ans Ende des ausgegebenen Texts verschoben.
Bindungen PDF_show2( ) ist nur in C verfügbar, da in allen anderen Sprachbindungen Strings belie-
bigen Inhalts an PDF_show( ) übergeben werden können.
Gibt Text in der aktuellen Schrift und Schriftgröße aus, aber mit individueller horizon-
taler Positionierung.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings. Ist len gleich 0,
muss ein null-terminierter String übergeben werden.
xadvancelist Array aus horizontalen Versatzwerten für die Glyphen im Text. Jeder
Wert gibt (in Benutzerkoordinaten) den relativen horizontalen Versatz zur Position an,
die nach der Ausgabe der vorangehenden Glyphe erreicht ist. Die Länge des Arrays ent-
Details Die Schrift muss bereits mit PDF_setfont( ) gesetzt worden sein.
Bindungen Nur in der C- und C++-Sprachbindung verfügbar. Andere Bindungen können für diesel-
be Funktionalität PDF_fit_textline( ) mit der Option xadvancelist verwenden.
len (Nur für PDF_show_xy2( )) Länge von text (in Bytes) für UCS-2-Strings, die Null-
zeichen enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben
werden.
Details Der Font muss zuvor mit PDF_setfont( ) eingestellt worden sein. Die aktuelle Textpositi-
on wird ans Ende des ausgegebenen Texts bewegt.
Bindungen PDF_show_xy2( ) ist nur in C verfügbar, da in allen anderen Sprachbindungen Strings be-
liebigen Inhalts an PDF_show_xy( ) übergeben werden können
text (Content-String) Auszugebender Text. Wird ein Leerstring übergeben, wird die
Textposition in die nächste Zeile bewegt. In C darf text in PDF_continue_text( ) keine Null-
zeichen enthalten, da ein null-terminierter String erwartet wird; für Strings, die Nullzei-
chen enthalten können, verwenden Sie PDF_continue_text2( ).
Details Die Textpositionierung (x- und y-Position) und der Zeilenabstand werden durch den Pa-
rameter leading sowie den letzten Aufruf von PDF_fit_textline( ), PDF_show_xy( ) oder
PDF_set_text_pos( ) bestimmt. Die aktuelle Position wird ans Ende des auszugebenden
Texts bewegt; die x-Position wird für nachfolgende Aufrufe dieser Funktion nicht geän-
dert.
Gültigkeit page, pattern, template, glyph; diese Funktion sollte im vertikalen Textausgabemodus
nicht verwendet werden.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings, die Null-Zei-
chen enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben
werden.
optlist Optionsliste mit Optionen zur Formatierung gemäß Tabelle 8.19 und zur Dar-
stellung gemäß Tabelle 8.20.
Details Der aktuelle Grafikzustand ändert sich durch diese Funktion nicht. Insbesondere die ak-
tuelle Textposition sowie der aktuelle Font bleiben unbeeinflusst.
Das Aussehen der Textausgabe wird anhand der aktuellen Text- und Grafikzustandspa-
rameter festgelegt, sofern diese nicht explizit durch entsprechende Optionen über-
schrieben wurden. Der aktuelle Grafikzustand ändert sich durch diese Funktion aber
nicht (insbesondere der aktuelle Font bleibt unbeeinflusst). Die aktuelle Textposition
dagegen wird ans Ende der generierten Textausgabe verschoben.
Diese Funktion generiert bei Standard-CJK-Schriften mit CMaps, die nicht auf Unicode
basieren, keinerlei Ausgabe (siehe »Einschränkungen bei Standard-CJK-Fonts und
CMaps«, Seite 123).
Gültigkeit page, pattern, template, glyph; diese Funktion sollte nicht im vertikalen Textausgabe-
modus verwendet werden.
Tabelle 8.20 Darstellungsoptionen für PDF_fit_textline( ) und direkte oder Inline-Optionen für PDF_
create_textflow( )
Schlüssel Typ Erklärung
charref Boolean Falls true, werden numerische Referenzen und Entity-Referenzen ersetzt (siehe
Abschnitt 4.5.5, »Character-Referenzen«, Seite 111). Standardwert: Wert des
globalen Parameters charref.
charspacing Float oder Zeichenabstand (siehe Tabelle 8.18). Prozentangaben beziehen sich auf fontsize.
Prozentwert Standardwert1 für PDF_create_textflow( ): 0.
dasharray Liste aus Länge der Striche und Zwischenräume zum Zeichnen von Text und
zwei Floats Textauszeichnung. Standardwert1 für PDF_create_textflow( ): {0 0} (d.h. eine
durchgezogene Linie)
fillcolor Farbe Füllfarbe des Texts. Standardwert1 für PDF_create_textflow( ): {gray 0}.
font Font-Handle Font-Handle, das von PDF_load_font( ) zurückgegeben wurde. Standardwert: der
aktuelle Font.
fontsize Float (Für die Option font erforderlich) Schriftgröße in Einheiten des Benutzerkoordi-
natensystems. Standardwert: die aktuelle Schriftgröße.
text (Content-String) Text, dessen Breite abgefragt werden soll. In C darf text in PDF_
stringwidth( ) keine Nullzeichen enthalten, da ein null-terminierter String erwartet wird;
für Strings, die Nullzeichen enthalten können, verwenden Sie PDF_stringwidth2( ).
len (Nur für PDF_stringwidth2( )) Länge von text (in Bytes) für UCS-2-Strings, die Null-
zeichen enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben
werden.
Rückgabe Breite von text in einer beliebigen mit PDF_load_font( ) gewählten Schrift sowie der in
fontsize übergebenen Schriftgröße. Der Wert, der für die Breite zurückgegeben wird,
kann negativ sein (zum Beispiel, wenn eine negative horizontale Skalierung eingestellt
wurde).
Details Bei der Berechnung der Textbreite werden die aktuellen Werte folgender Textparameter
herangezogen: horizontale Skalierung, Kerning, Zeichenabstand und Wortabstand.
Veraltet. Verwenden Sie PDF_fit_textline( ) für einzelne Zeilen und für mehrzeilige Aus-
gaben die Funktionen PDF_*_textflow( ). In zweiterem Fall erhalten Sie mit
minspacing=100%, maxspacing=10000%, nofitlimit=100% und shrinklimit=100% in etwa
das selbe Ergebnis wie mit PDF_show_boxed( ). Die Anzahl der Zeichen, die nach der For-
Bereitet den Text zur späteren Formatierung vor und erzeugt ein Textflussobjekt.
len (Nur C-Sprachbindung) Länge des Texts in Bytes oder 0 für null-terminierte
Strings.
optlist Optionsliste mit Textflussoptionen gemäß Tabelle 8.21 und Tabelle 8.24. Die
Optionen in optlist werden vor den Inline-Optionslisten in text ausgewertet. Inline-Op-
tionen haben somit Vorrang vor den Optionen, die in optlist übergeben werden.
Details Diese Funktion analysiert den übergebenen Text und erzeugt daraus eine interne Da-
tenstruktur. Sie bestimmt Textabschnitte (zum Beispiel Wörter), die später bei der For-
matierung berücksichtigt werden, verarbeitet Inline-Optionslisten, konvertiert den
Text nach Möglichkeit nach Unicode, ermittelt mögliche Zeilenumbrüche und berech-
net die Breite von Textabschnitten anhand von Schrift- und Textoptionen. Die Ermitt-
lung von Inline-Optionslisten kann für einzelne Textabschnitte oder den gesamten
Text deaktiviert werden, indem die Option textlen im Parameter optlist übergeben wird
(siehe »Inline-Optionslisten für Textflüsse«, Seite 263).
Diese Funktion bereitet den Text nur vor und gibt ihn nicht in das generierte PDF-
Dokument aus. Die tatsächliche Textausgabe erfolgt dann mit PDF_fit_textflow( ) und
dem Handle auf den vorbereiteten Textfluss.
Standardmäßig bewirken die Zeichen VT, LS, LF, CR, CRLF, NEL, PS und FF eine neue
Zeile (eine Beschreibung dieser Zeichen finden Sie in Tabelle 4.5). Diese Zeichen, mit
Ausnahme von VT und LS, veranlassen zugleich die Erzeugung eines neuen Absatzes, so
dass die Option parindent zur Anwendung kommt. FF bewirkt die sofortige Unterbre-
chung der Textplatzierung in die Fitbox (die Funktion PDF_fit_textflow( ) beendet sich
mit dem Rückgabestring _nextpage).
Gibt den nächsten Abschnitt eines Textflusses in einen rechteckigen Bereich aus.
llx, lly, urx, ury x- und y-Koordinaten der linken unteren und rechten oberen Ecke des
Ausgaberechtecks (Fitbox) in Benutzerkoordinaten. Die Ecken können auch in umge-
kehrter Reihenfolge festgelegt werden.
Rückgabe String mit der Ursache für das Beenden der Funktion:
> _stop: der Textfluss wurde vollständig verarbeitet.
> _nextpage: die nächste Seite wird erwartet (verursacht durch das formfeed-Zeichen
U+000C). Zur Platzierung des restlichen Texts ist ein weiterer Aufruf von PDF_fit_
textflow( ) erforderlich.
Gibt es mehrere Gründe für das Beenden der Funktion, so wird derjenige gewählt, der in
obiger Liste zuerst aufgeführt ist. Der Rückgabestring ist bis zum nächsten Aufruf der
Funktion gültig.
Details Anders als bei PDF_fit_textline( ) wird die von dieser Funktion erzeugte Textausgabe vom
aktuellen Text- und Grafikzustand nicht beeinflusst. Die Textdarstellung lässt sich mit
fillcolor, strokecolor und anderen Darstellungsoptionen für PDF_create_textflow( ) steu-
ern. Nach der Rückkehr von dieser Funktion ist der Textzustand unverändert. Die aktu-
elle Textposition wird jedoch ans Ende des generierten Ausgabetextes gestellt (sofern
die Option blind nicht auf true gesetzt wurde).
Rückgabe Der Wert des mit keyword abgefragten Textflussparameters. Im Gegensatz zu den Para-
metern textx und texty gibt diese Funktion gibt auch im Blind-Modus korrekte geomet-
rische Informationen zurück .
Gültigkeit beliebig
Enthält der Text Inline-Optionslisten, können Sie den Konflikt zwischen tatsächlichem
Textinhalt und dem mit begoptlistchar definierten Zeichen zur Einleitung einer Inline-
Optionsliste auf eine der folgenden Arten vermeiden:
> Ersetzen Sie das Zeichen < überall im eigentlichen Text durch die entsprechende nu-
merische oder Entity-Referenz (< oder <) und lassen Sie nur Inline-Options-
listen mit dem Zeichen < beginnen.
> Legen Sie mit der Option begoptlistchar im Parameter optlist für PDF_create_textflow( )
ein Zeichen fest, das im Text nicht verwendet wird und starten Sie Inline-Optionslis-
ten mit diesem Zeichen.
> Legen Sie in jeder Inline-Optionsliste mit der Option textlen die Länge des nächsten
Textfragments fest (bis zum Anfang der nächsten Inline-Optionsliste). Dies ist in
manchen Situationen erforderlich, zum Beispiel wenn ein Textfragment zwischen
Inline-Optionslisten nicht in Unicode interpretiert werden kann (Einzelheiten hier-
zu finden Sie in Tabelle 8.24 und Abschnitt 4.9.6, »Steuerzeichen, Zeichenersetzung
und Symbolfonts«, Seite 139).
Hinweis Schließt eine Inline-Optionsliste unmittelbar an die vorangehende Optionsliste an, wird davon
ausgegangen, dass sie ein Textfragment der Länge 0 enthalten. Dies ist von Bedeutung, wenn
in der ersten Optionsliste die Option textlen übergeben wird.
<macro {
comment { Die folgenden Makros werden als Absatzformate verwendet }
Ü1 {fontname=Helvetica-Bold encoding=winansi fontsize=14 }
Text {fontname=Helvetica encoding=winansi fontsize=12 }
}>
Für die Definition und Verwendung von Makros gelten folgenden Regeln:
> Makros können beliebig verschachtelt werden (d.h. in Makrodefinitionen können
andere Makros aufgerufen werden).
Hinweis Keine der Funktionen für den Grafikzustand darf im Geltungsbereich path verwendet werden
(siehe Abschnitt 3.2, »Seitenbeschreibungen«, Seite 62).
b, w Anzahl der sich abwechselnden schwarzen bzw. weißen Einheiten. b und w müs-
sen positive Zahlen sein.
Details Um eine durchgezogene Linie zu erreichen, setzen Sie b = w = 0. Am Anfang jeder Seite
wird das Strichmuster auf diese Standardwerte zurückgesetzt.
optlist Optionsliste entsprechend Tabelle 8.26. Ist optlist leer, wird eine durchgezoge-
ne Linie generiert.
Details Am Anfang jeder Seite wird der Strichmuster-Parameter auf eine durchgezogene Linie
gesetzt.
flatness Positive Zahl, die den maximalen Abstand (in Gerätepixeln) zwischen dem
Pfad und einer Näherung aus geraden Liniensegmenten beschreibt.
Details Am Anfang jeder Seite wird der Flatness-Parameter auf den Standardwert 1 gesetzt.
linejoin Legt die Form der Ecken in zu zeichnenden Pfaden fest (siehe Tabelle 8.27).
Details Am Anfang jeder Seite wird der linejoin-Parameter auf den Standardwert 0 gesetzt.
linecap Steuert die Art der Linienenden beim Zeichnen eines Pfads (siehe Tabelle 8.28).
Details Am Anfang jeder Seite wird der linecap-Parameter auf den Standardwert 0 gesetzt.
Details Ist der linejoin-Parameter auf 0 gesetzt (für eine spitze Ver- Line width
bindung), ergibt sich eine sehr dünne Spitze, wenn die bei-
den Liniensegmente in einem schmalen Winkel zusammenlaufen. Diese Spitze wird ab-
geschnitten (das heißt die spitze Verbindung wird durch eine stumpfe ersetzt), wenn
das Verhältnis zwischen Spitzenbreite und Strichstärke den Wert des miterlimit-Parame-
ters übersteigt. Am Anfang jeder Seite wird miterlimit auf den Standardwert 10 gesetzt.
Dies entspricht einem Winkel von etwa 10,5 Grad.
Details Am Anfang jeder Seite wird der Parameter width auf den Standardwert 1 gesetzt.
Setzt alle Parameter, die sich auf Farbe und Grafikzustand beziehen, auf ihre Standard-
werte zurück.
Details Die Parameter für Farbe (color), Strichstärke (linewidth), Linienende (linecap), Verbin-
dungsart (linejoin), Grenzwert für spitze Verbindungen (miterlimit) und Strichmuster
(dash) sowie die aktuelle Transformationsmatrix (aber nicht die Parameter für den Text-
zustand) werden auf ihre jeweiligen Standardwerte zurückgesetzt. Der aktuelle Clip-
ping-Pfad ist davon nicht betroffen.
Diese Funktion kann in Situationen nützlich sein, wo der Programmablauf keine ein-
fache Verwendung von PDF_save( )/PDF_restore( ) erlaubt.
Details Der Grafikzustand umfasst Parameter, die alle Arten von Grafikobjekten betreffen. Ein
Speichern des Grafikzustands wird von PDF nicht gefordert; dies ist nur notwendig,
wenn die Anwendung später wieder auf einen definierten Zustand zurückgreifen möch-
te (zum Beispiel auf ein benutzerdefiniertes Koordinatensystem), ohne erneut explizit
alle relevanten Parameter einstellen zu müssen. Beim Speichern und Wiederherstellen
des Grafikzustands werden folgende Parameter berücksichtigt:
> Grafikparameter, die mit entsprechenden Funktionen gesetzt wurden: Clipping-
Pfad, Koordinatensystem, aktuelle Position, Flatness, Linienendenstil (linecap),
Strichmuster (dash), Art der Verbindungslinien (linejoin), Strichstärke (line width),
Grenzwert für das Abschneiden spitzer Liniensegmente (miter limit)
> Farbparameter: Linien- und Füllfarben
> Grafikparameter, die mit PDF_set_gstate( ) gesetzt wurden, sowie explizite Grafikzu-
stände (siehe Abschnitt 8.4.4, »Explizite Grafikzustände«, Seite 275)
> Textposition und die meisten anderen auf Text bezogenen Parameter (siehe Liste
unten)
> einige PDFlib-Parameter (siehe Liste unten)
Paare aus PDF_save( ) und PDF_restore( ) können verschachtelt werden. Obwohl es für die-
se Art der Verschachtelung keinen durch die PDF-Spezifikation bedingten Grenzwert
gibt, dürfen Anwendungen nicht mehr als 25 Verschachtelungsebenen nutzen. Andern-
falls können Probleme beim Drucken auftreten, die sich aus Einschränkungen bei der
von PDF-Viewern erzeugten PostScript-Ausgabe ergeben. Außerdem sind einige Ver-
schachtelungsebenen für den internen Gebrauch durch PDFlib reserviert.
Details Der entsprechende Grafikzustand muss innerhalb derselben Seite, desselben Musters,
desselben Templates oder derselben Glyphendefinition gespeichert worden sein.
Gültigkeit page, pattern, template, glyph; diese Funktion muss immer paarweise mit PDF_save( )
auftreten. Genauer gesagt müssen PDF_save( ) und PDF_restore( ) paarweise innerhalb
der Seite, des Musters, des Templates oder der Glyphendefinition auftreten.
tx, ty Der neue Ursprung des Koordinatensystems liegt im Punkt (tx, ty), wobei sich
dessen Werte auf das alte Koordinatensystem beziehen.
Details Diese Funktion skaliert das Koordinatensystem um die Faktoren sx und sy. Ein negati-
ver Skalierungsfaktor bewirkt eine Spiegelung. Eine Einheit in x-Richtung im neuen Ko-
Details Die Winkelmessung beginnt auf der positiven x-Achse des aktuellen Koordinatensys-
tems und erfolgt gegen den Uhrzeigersinn. Die neuen Koordinatenachsen ergeben sich
aus einer Drehung der alten Koordinatenachsen um phi Grad.
Details Bei der Scherung wird das Koordinatensystem in x- und y-Richtung um die angegebe-
nen Winkel geneigt. alpha wird dabei von der positiven x-Achse des aktuellen Koordina-
tensystems ausgehend gegen den Uhrzeigersinn gemessen, und beta von der positiven
y-Achse ausgehend im Uhrzeigersinn. Beide Winkel müssen im Bereich -360˚ < alpha,
beta < 360˚ liegen und dürfen nicht -270˚, -90˚, 90˚ oder 270˚ sein.
Details Diese Funktion konkateniert eine Matrix zur aktuellen Transformationsmatrix (CTM)
für Text und Grafik. Sie erlaubt die allgemeinste Art von Transformationen. Wenn Sie
mit dieser Art von Transformationen keine Erfahrung haben, sollten Sie stattdessen
PDF_translate( ), PDF_scale( ), PDF_rotate( ) und PDF_skew( ) verwenden. Am Anfang jeder
Seite wird die CTM auf die Einheitsmatrix [1, 0, 0, 1, 0, 0] zurückgesetzt.
a, b, c, d, e, f Siehe PDF_concat( ).
Details Diese Funktion entspricht im Wesentlichen PDF_concat( ) mit dem Unterschied, dass sie
die aktuelle Transformationsmatrix verwirft und vollständig durch eine neue Matrix
ersetzt.
Rückgabe gstate-Handle, das in späteren Aufrufen von PDF_set_gstate( ) innerhalb des umgeben-
den Geltungsbereichs document verwendet werden kann.
Details Die Optionsliste kann beliebig viele Optionen für den expliziten Grafikzustand enthal-
ten. Manche Optionen sind jedoch nicht in allen PDF-Versionen zulässig. In der Tabelle
wird die niedrigste erforderliche PDF-Version aufgeführt.
Parameter Die Optionen opacityfill und opacitystroke dürfen nur mit dem Wert 1 verwendet werden.
8.4.5 Pfadkonstruktion
Tabelle 8.30 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und
Werte.
Hinweis Achten Sie darauf, immer eine der Funktionen aus Abschnitt 8.4.6, »Zeichnen und Beschneiden
von Pfaden«, Seite 280, aufzurufen, nachdem Sie die Funktionen im vorliegenden Abschnitt
verwendet haben. Sonst hat der konstruierte Pfad keinerlei Auswirkungen, und nachfolgende
Operationen führen unter Umständen zu einer PDFlib-Exception.
Details Am Anfang jeder Seite wird die aktuelle Position auf den Standardwert undefined ge-
setzt. Die aktuelle Grafikposition sowie die aktuelle Textposition werden getrennt ver-
waltet.
Gültigkeit page, pattern, template, path, glyph; mit dieser Funktion beginnt der Geltungsbereich
path.
Zeichnet eine Linie zwischen dem aktuellen und einem anderen Punkt.
Details Diese Funktion ergänzt den aktuellen Pfad um eine Linie zwischen der aktuellen Positi-
on und (x, y). Die aktuelle Position muss zuvor gesetzt worden sein. Der Punkt (x, y) wird
zur neuen aktuellen Position.
Die Linie wird um die »ideale« Linie herum zentriert, das heißt dass auf jeder Seite
der die beiden Endpunkte verbindenden Linie die halbe Strichstärke (die durch den
linewidth-Parameter vorgegeben ist) gezeichnet wird. Das Verhalten an den Endpunkten
hängt von der Einstellung des linecap-Parameters ab.
Gültigkeit path
Zeichnet eine Bézier-Kurve ausgehend von der aktuellen Position, wobei drei Kontroll-
punkte benutzt werden.
Details Der aktuelle Pfad wird um eine Bézier-Kurve zwischen der aktuellen Position und (x3,
y3) ergänzt, wobei (x1, y1) und (x2, y2) als Kontrollpunkte dienen. Die aktuelle Position
muss zuvor gesetzt worden sein. Der Endpunkt der Kurve wird zur neuen aktuellen Po-
sition.
Gültigkeit path
r Kreisradius.
Details Diese Funktion ergänzt den aktuellen Pfad um einen Kreis, der einen vollständigen Teil-
pfad darstellt. Der Punkt (x + r, y) wird zur neuen aktuellen Position. Die resultierende Fi-
gur ist in Benutzerkoordinaten kreisförmig. Wurde das Koordinatensystem in x- und y-
Richtung unterschiedlich skaliert, ist die resultierende Kurve eine Ellipse.
Gültigkeit page, pattern, template, path, glyph; mit dieser Funktion beginnt der Geltungsbereich
path.
C++ Java void arc(double x, double y, double r, double alpha, double beta)
Perl PHP PDF_arc(resource p, float x, float y, float r, float alpha, float beta)
C void PDF_arc(PDF *p, double x, double y, double r, double alpha, double beta)
Details Diese Funktion ergänzt den aktuellen Pfad um ein gegen den Uhrzeigersinn gezeichne-
tes Kreissegment, das bei alpha Grad beginnt und bei beta Grad endet. Sowohl bei PDF_
arc( ) als auch bei PDF_arcn( ) werden die Winkel gegen den Uhrzeigersinn gemessen, und
zwar ausgehend von der positiven x-Achse des aktuellen Koordinatensystems. Ist der
Gültigkeit page, pattern, template, path, glyph; mit dieser Funktion beginnt der Geltungsbereich
path.
C++ Java void arcn(double x, double y, double r, double alpha, double beta)
Perl PHP PDF_arcn(resource p, float x, float y, float r, float alpha, float beta)
C void PDF_arcn(PDF *p, double x, double y, double r, double alpha, double beta)
Details Mit Ausnahme der Zeichenrichtung verhält sich diese Funktion genau wie PDF_arc( ).
Beachten Sie, dass dies auch impliziert, dass die Winkel ausgehend von der positiven x-
Achse gegen den Uhrzeigersinn gemessen werden.
Details Diese Funktion ergänzt den aktuellen Pfad um ein Rechteck, das einen vollständigen
Teilpfad bildet. Die aktuelle Position muss zuvor nicht gesetzt worden sein. Der Punkt
(x, y) wird zur neuen aktuellen Position. Die Linie wird um die »ideale« Linie herum zen-
triert, das heißt dass auf jeder Seite der die beiden Endpunkte verbindenden Linie die
halbe Strichstärke (die durch den linewidth-Parameter vorgegeben ist) gezeichnet wird.
Gültigkeit page, pattern, template, path, glyph; mit dieser Funktion beginnt der Geltungsbereich
path.
Parameter currentx, currenty
Details Diese Funktion schließt den aktuellen Teilpfad, das heißt sie zeichnet eine Linie zwi-
schen der aktuellen Position und dem Startpunkt des Teilpfads.
Gültigkeit path
Tabelle 8.31 Parameter und Werte für Funktionen zum Zeichnen und Beschneiden von Pfaden (siehe Abschnitt
8.2.3, »Parameterbehandlung«, Seite 236)
Funktion Schlüssel Erklärung
set_parameter fillrule Setzt die aktuelle Füllregel auf winding oder evenodd. Anhand der Füllregel legen
PDF-Viewer das Innere von Formen zum Füllen oder Beschneiden fest. Da die
beiden Algorithmen bei einfachen Formen die selben Ergebnisse liefern, muss die
Füllregel meist nicht geändert werden. Am Anfang jeder Seite wird sie auf den
Standardwert winding gesetzt. Geltungsbereich: page, pattern, template, glyph.
Hinweis Die meisten in diesem Abschnitt beschriebenen Funktionen leeren den Pfad und lassen die ak-
tuelle Position undefiniert. Auf diese Funktionen folgende Zeichenoperationen müssen die ak-
tuelle Position daher explizit setzen (zum Beispiel mit PDF_moveto( )).
Zeichnet den Pfad mit der aktuellen Strichstärke und Linienfarbe und leert ihn.
Details Diese Funktion schließt den aktuellen Teilpfad (ergänzt um eine gerade Linie zwischen
der aktuellen Position und der Startposition des Pfads) und zeichnet den kompletten
aktuellen Pfad mit der aktuellen Strichstärke und Linienfarbe.
Details Diese Funktion füllt das Innere des aktuellen Pfads mit der aktuellen Füllfarbe. Das In-
nere des Pfads wird durch einen von zwei Algorithmen bestimmt (siehe Parameter
fillrule). Offene Pfade werden vor dem Füllen geschlossen.
Parameter fillrule
Zeichnet und füllt den Pfad mit der aktuellen Zeichen- und der aktuellen Füllfarbe.
Parameter fillrule
Details Diese Funktion schließt den aktuellen Teilpfad (ergänzt um eine gerade Linie zwischen
der aktuellen Position und dem Startpunkt des Pfads) und zeichnet und füllt den kom-
pletten aktuellen Pfad.
Parameter fillrule
Details Diese Funktion verwendet den Durchschnitt des aktuellen Pfades und des aktuellen
Clipping-Pfads als Clipping-Pfad für weitere Operationen. Am Anfang jeder Seite wird
dieser auf den Standardwert gesetzt, nämlich die Seitengröße. Der Clipping-Pfad wird
vom PDF_save( )/PDF_restore( )-Mechanismus berücksichtigt. Er kann nur mittels PDF_
save( )/PDF_restore( ) vergrößert werden.
Details Diese Funktion hat keine sichtbaren Auswirkungen auf die Seite. Sie generiert einen un-
sichtbaren Pfad auf der Seite.
8.4.7 Ebenenfunktionen
len (Nur C-Bindung) Länge von name (in Bytes) für UCS-2-Strings. Ist len gleich 0, muss
ein null-terminierter String übergeben werden.
Details PDFlib gibt eine Warnung aus, wenn eine Ebene zwar definiert, aber im Dokument nicht
benutzt wurde.
optlist Optionsliste für die Beziehungen zwischen Ebenen gemäß Tabelle 8.33.
Beginnt eine Ebene für die nachfolgende Ausgabe auf der Seite (ab PDF 1.5).
Details Alle Inhalte, die nach diesem Aufruf und vor einem Aufruf von PDF_begin_layer( ) oder
PDF_end_layer( ) auf der Seite ausgegeben werden, gehören zur angegebenen Ebene. Die
Sichtbarkeit der Inhalte hängt von den Ebeneneinstellungen ab.
Diese Funktion aktiviert die übergebene Ebene und deaktiviert dabei ggf. eine andere
aktive Ebene.
Gültigkeit page
Details Inhalte, die nach diesem Aufruf auf der Seite ausgegeben werden, gehören keiner spezi-
ellen Ebene mehr an. Alle Ebenen müssen am Seitenende geschlossen werden.
Um von Ebene A nach Ebene B zu wechseln, reicht ein Aufruf von PDF_begin_layer( )
aus; Ebene A braucht nicht explizit mit PDF_end_layer( ) geschlossen zu werden. PDF_
end_layer( ) ist nur notwendig, um unbedingte Inhalte (die stets sichtbar sind) zu er-
stellen und alle Ebenen am Seitenende zu schließen.
Gültigkeit page
C++ Java void setcolor(String fstype, String colorspace, double c1, double c2, double c3, double c4)
Perl PHP PDF_setcolor(resource p,
string fstype, string colorspace, float c1, float c2, float c3, float c4)
C void PDF_setcolor(PDF *p,
const char *fstype, const char *colorspace, double c1, double c2, double c3, double c4)
fstype Einer der Werte fill, stroke oder fillstroke, die festlegen, ob die Farbe zum Zeich-
nen, Füllen oder für beides festgelegt wird. Der veraltete Wert both entspricht dem Wert
fillstroke.
colorspace Festlegung des Farbraums durch einen der Werte gray, rgb, cmyk, spot,
pattern, iccbasedgray, iccbasedrgb, iccbasedcmyk oder lab.
c1, c2, c3, c4 Farbkomponenten für den ausgewählten Farbraum (siehe Abschnitt 3.3,
»Farbe«, Seite 69):
> Ist colorspace gleich gray, legt c1 einen Graustufenwert fest.
> Ist colorspace gleich rgb, legen c1, c2, c3 die Werte für Rot, Grün und Blau fest.
> Ist colorspace gleich cmyk, legen c1, c2, c3, c4 die Werte für Cyan, Magenta, Gelb und
Schwarz fest.
> Ist colorspace gleich spot, enthält c1 das Handle für eine Schmuckfarbe, das von PDF_
makespotcolor( ) erzeugt wurde, und c2 legt den Farbauftrag mit einem Wert zwischen
0 und 1 fest.
> Ist colorspace gleich pattern, enthält c1 das Handle für ein Füllmuster, das von PDF_
begin_pattern( ) oder PDF_shading_pattern( ) zurückgegeben wurde.
> Ist colorspace gleich iccbasedgray, legt c1 einen Graustufenwert fest.
> Ist colorspace gleich iccbasedrgb, legen c1, c2, c3 die Werte für Rot, Grün und Blau fest.
> Ist colorspace gleich iccbasedcmyk, legen c1, c2, c3, c4 die Werte für Cyan, Magenta, Gelb
und Schwarz fest.
Details Alle Farbwerte für die Farbräume gray, rgb und cmyk sowie für den Farbauftrag des Farb-
raums spot müssen Zahlen zwischen 0 (inklusive) und 1 (inklusive) sein. Nicht verwen-
dete Parameter sollten auf 0 gesetzt werden.
Graustufenwerte, RGB-Werte und der Farbauftrag für Schmuckfarben werden ge-
mäß additiver Farbmischung interpretiert, das heißt 0 bedeutet »keine Farbe« und 1 be-
deutet »volle Intensität«. Demnach ergeben der Graustufenwert 0 sowie die RGB-Werte
(r, g, b) = (0, 0, 0) schwarz; der Graustufenwert 1 sowie die RGB-Werte (r, g, b) = (1, 1, 1) erge-
ben weiß. CMYK-Werte dagegen werden gemäß subtraktiver Farbmischung interpre-
tiert, das heißt (c, m, y, k) = (0, 0, 0, 0) bedeutet weiß und (c, m, y, k) = (0, 0, 0, 1) bedeutet
schwarz. Farbwerte zwischen 0 und 255 müssen mittels Division durch 255 in den Be-
reich zwischen 0 und 1 skaliert werden.
Am Anfang jeder Seite werden die Zeichen- und Füllfarbenwerte für die Farbräume
gray, rgb und cmyk auf den Standardwert schwarz gesetzt. Für Schmuck- und Füllmus-
terfarbe gibt es keine Standardwerte.
Beim Einsatz der Farbräume iccbasedgray/rgb/cmyk muss das zugehörige ICC-Profil
gesetzt worden sein, bevor die Parameter setcolor:iccprofilegray/rgb/cmyk verwendet
werden können (siehe Tabelle 8.36).
Gültigkeit page, pattern (nur wenn der PaintType des Füllmusters gleich 1 ist), template, glyph (nur
wenn die Option colorized der Type-3-Schrift gleich true ist), document; eine Füllmuster-
farbe kann nicht innerhalb ihrer eigenen Definition verwendet werden. Die Farbe im
Geltungsbereich document einzustellen, kann zur Definition von Schmuckfarben mit
PDF_makespotcolor( ) sinnvoll sein.
PDF/X PDF/X-1 und PDF/X-1a: colorspace = rgb, iccbasedgray/rgb/cmyk und lab sind nicht
zulässig.
PDF/X-3: colorspace = gray setzt voraus, dass die Option defaultgray in PDF_begin_
page_ext( ) gesetzt wurde, sofern das in der PDF/X-Druckausgabebedingung (Output In-
tent) festgelegte Gerät nicht mit Graustufen oder CMYK arbeitet. Bei colorspace = rgb
muss die Option defaultrgb in PDF_begin_page_ext( ) gesetzt worden sein, sofern das Ge-
rät in der PDF/X-Druckausgabebedingung nicht mit RGB arbeitet. Bei colorspace = cmyk
muss die Option defaultcmyk PDF_begin_page_ext( ) gesetzt worden sein, sofern das Ge-
rät in der PDF/X-Druckausgabebedingung nicht mit CMYK arbeitet. Bei iccbasedgray/
rgb/cmyk und lab-Farbe muss in der Ausgabebedingung ein ICC-Profil angegeben sein
(ein Standardname reicht in diesem Fall nicht aus).
Parameter setcolor:iccprofilegray/rgb/cmyk
Ermittelt den Namen einer integrierten Schmuckfarbe oder erzeugt aus der aktuellen
Füllfarbe eine Schmuckfarbe mit Namen.
spotname Name einer integrierten Schmuckfarbe oder beliebiger Name für die zu de-
finierende Schmuckfarbe. Dieser Name ist auf eine Länge von maximal 126 Byte be-
schränkt. Der Name darf nur 8-Bit-Zeichen enthalten. Unicode und eingebettete Null-
zeichen werden nicht unterstützt.
Rückgabe Ein Farben-Handle, das in nachfolgenden Aufrufen von PDF_setcolor( ) im ganzen Doku-
ment verwendet werden kann. Schmuckfarben-Handles können seitenübergreifend
verwendet werden, aber nicht in anderen Dokumenten. Die Anzahl der Schmuckfarben
in einem Dokument ist nicht begrenzt.
Details spotname wird verwendet, sofern er in den internen Farbtabellen gefunden wurde und
der Parameter spotcolorlookup gleich true ist (Standardeinstellung). Andernfalls werden
die Farbwerte (CMYK oder andere) der aktuellen Füllfarbe für das Aussehen einer neuen
Schmuckfarbe benutzt. Diese Alternativwerte werden nur zur Bildschirmanzeige oder
für den Low-End-Druck verwendet. Zur Erstellung von Farbseparationen wird statt der
Alternativwerte der übergebene Schmuckfarbenname verwendet.
Wurde spotname bereits in einem früheren Aufruf von PDF_makespotcolor( ) verwen-
det, ist der Rückgabewert wieder derselbe und gibt somit nicht die aktuelle Farbe wie-
der.
Der spezielle Schmuckfarbenname All kann verwendet werden, um eine Farbe in al-
len Farbseparationen zu verwenden. Dies kann zum Beispiel bei Schnittmarken sinn-
voll sein. Der Schmuckfarbenname None produziert eine Ausgabe, die auf keinem Aus-
zug sichtbar ist.
Gültigkeit page, pattern, template, glyph (nur wenn die Option colorized der Type-3-Schrift gleich
true ist), document; die aktuelle Füllfarbe darf keine Schmuckfarbe und kein Füllmuster
sein, falls eine benutzerdefinierte Schmuckfarbe angelegt wird.
PDF/X PANTONE®-Farben werden gegenwärtig nicht in den Modi PDF/X-1 und PDF/X-1a
unterstützt.
Sucht nach einem ICC-Profil und bereitet es zur späteren Verwendung vor.
Rückgabe Ein Profil-Handle, das in nachfolgenden Aufrufen von PDF_load_image( ) oder zum Ein-
stellen von profilspezifischen Parametern verwendet werden kann. Der Rückgabewert
muss auf den Wert -1 (in PHP: 0) überprüft werden, der einen Fehler anzeigt. Um genau-
ere Informationen über die Art eines profilspezifischen Problems (Datei nicht gefun-
den, Format nicht unterstützt etc.) zu erhalten, setzen Sie den Parameter iccwarning auf
true. Das zurückgegebene Profil-Handle kann nicht über mehrere PDF-Dokumente hin-
weg eingesetzt werden. Auch ist es nicht auf ein Rasterbild anwendbar, wenn die Option
usage gleich outputintent ist. Es gibt keine Obergrenze für die Anzahl der in einem Doku-
ment enthaltenen ICC-Profile.
Details Ist usage = iccbased, wird das benannte Profil gemäß der in Abschnitt 3.3.4, »Colorma-
nagement und ICC-Profile«, Seite 73, beschriebenen Suchstrategie ermittelt. Wurde das
Profil gefunden, wird es auf seine Eignung hin überprüft (zum Beispiel bezüglich der
Anzahl der Farbkomponenten). Das sRGB-Profil ist in jedem Fall intern verfügbar und
darf nicht gesondert definiert werden.
Ist die Option usage auf outputintent gesetzt, wird der übergebene Name zunächst in
einer intern gehaltenen Liste von Standarddruckausgabebedingungen gesucht. Schlägt
dieser Versuch fehl, wird der Name in der Liste der benutzerdefinierten Druckausgabe-
bedingungen gesucht. Ist der übergebene Name als Standarddruckausgabebedingung
in der internen oder der benutzerdefinierten Liste verzeichnet, wird kein entsprechen-
des ICC-Profil gesucht, sondern der mit der Option description übergebene Name in die
PDF-Ausgabe als Druckausgabebedingung für PDF/X eingebettet. Ist der Name nicht in
den beiden Listen verzeichnet, wird er als Profilname interpretiert und das entspre-
chende ICC-Profil als Druckausgabebedingung für PDF/X in das PDF eingebettet.
PDF/X Die Ausgabebedingung für das generierte Dokument muss entweder mit dieser Funk-
tion gesetzt oder die Ausgabebedingung eines importierten Dokuments mit PDF_
process_pdi( ) kopiert werden.
C++ Java int begin_pattern(double width, double height, double xstep, double ystep, int painttype)
Perl PHP int PDF_begin_pattern(resource p,
float width, float height, float xstep, float ystep, int painttype)
C int PDF_begin_pattern(PDF *p,
double width, double height, double xstep, double ystep, int painttype)
xstep, ystep Die Offsets, die beim Zeichnen oder Füllen eines Objekts bei wiederholter
Platzierung des Füllmusters verwendet werden. In den meisten Anwendungen werden
diese Werte auf width und height gesetzt.
painttype Ist painttype gleich 1, dann muss das Füllmuster eine eigene Farbspezifika-
tion enthalten, die bei seinem Einsatz herangezogen wird; ist painttype gleich 2, darf das
Füllmuster keinerlei Farbspezifikation enthalten. Stattdessen wird die aktuelle Zeichen-
Rückgabe Ein Handle auf das Füllmuster, das in nachfolgenden Aufrufen von PDF_setcolor( ) inner-
halb des umschließenden Geltungsbereichs document verwendet werden kann.
Details Diese Funktion setzt alle Text-, Grafik- und Farbzustandsparameter auf ihre Standard-
werte zurück. Hypertext-Funktionen und Funktionen zum Öffnen von Rasterbildern
dürfen innerhalb einer Füllmusterdefinition nicht verwendet werden. Erlaubt sind da-
gegen alle Text-, Grafik- und Farbfunktionen (mit Ausnahme des Füllmusters, das gera-
de definiert wird).
Gültigkeit document, pattern; mit dieser Funktion beginnt der Geltungsbereich pattern; diese
Funktion muss immer paarweise mit PDF_end_pattern( ) auftreten.
Gültigkeit pattern; mit dieser Funktion endet der Geltungsbereich pattern; diese Funktion muss
immer paarweise mit PDF_begin_pattern( ) auftreten.
Rückgabe Muster-Handle, das innerhalb des Geltungsbereichs document in späteren Aufrufen von
PDF_setcolor( ) verwendet werden kann.
Details Diese Funktion dient zum Füllen beliebiger Objekte mit einem Farbverlauf. Dazu muss
mit PDF_shading( ) zunächst ein Farbverlauf-Handle bezogen und dann mit PDF_
shading_pattern( ) auf Basis dieses Farbverlaufs ein Muster definiert werden. Das Mus-
ter-Handle wiederum wird an PDF_setcolor( ) übergeben, das die aktuelle Farbe auf das
Farbverlaufsmuster setzt.
Füllt einen Bereich mit einem Farbverlauf, der auf einem Farbverlaufsobjekt basiert (ab
PDF 1.4).
Details Diese Funktion ermöglicht die Verwendung von Farbverläufen, ohne PDF_shading_
pattern( ) oder PDF_setcolor( ) einzubeziehen. Sie funktioniert aber nur bei einfachen For-
men, bei denen die Geometrie des zu füllenden Objekts derjenigen des Farbverlaufs ent-
spricht. Da der aktuelle Clipping-Bereich mit dem Farbverlauf gefüllt wird (was von den
Farbverlaufsoptionen extend0 und extend1 beeinflusst wird), wird diese Funktion in der
Regel in Kombination mit PDF_clip( ) verwendet.
Gültigkeit page, pattern (falls der painttype-Parameter des Musters gleich 1 ist), template, glyph (falls
die Option colorized des Type-3-Fonts gleich true ist), document
C++ Java int shading(String shtype, double x0, double y0, double x1, double y1,
double c1, double c2, double c3, double c4, String optlist)
Perl PHP int PDF_shading(resource p, string shtype, float x0, float y0, float x1, float y1,
float c1, float c2, float c3, float c4, string optlist)
C int PDF_shading(PDF *p, const char *shtype, double x0, double y0, double x1, double y1,
double c1, double c2, double c3, double c4, const char *optlist)
Definiert einen Farbverlauf zwischen der aktuellen Füllfarbe und der übergebenen
Farbe (ab PDF 1.4).
shtype Typ des Farbverlaufs: axial für lineare und radial für kreisförmige Verläufe.
x0, y0, x1, y1 Bei linearen Farbverläufen bilden (x0, y0) und (x1, y1) die Koordinaten des
Anfangs- und Endpunkts des Farbverlaufs. Bei kreisförmigen Farbverläufen legen sie
die Mittelpunkte der Anfangs- und Endkreise fest.
c1, c2, c3, c4 Farbwerte des Endpunkts des Farbverlaufs, die im Farbraum der aktuellen
Füllfarbe auf dieselbe Art wie die Farbparameter in PDF_setcolor( ) interpretiert werden.
Ist die aktuelle Füllfarbe eine Schmuckfarbe, wird c1 ignoriert und c2 enthält den
Farbauftrag.
Details Die aktuelle Füllfarbe wird für den Startpunkt verwendet; sie darf nicht auf einem Mus-
ter basieren.
Tabelle 8.39 Parameter und Werte für die Rasterbildfunktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«,
Seite 236)
Funktion Schlüssel Erklärung
get_value imagewidth Ermittelt die Breite (width) bzw. Höhe (height) eines Bilds in Pixeln. Der
imageheight Modifizierer enthält das Handle des gewünschten Bilds. Geltungsbereich:
page, pattern, template, glyph, document, path.
get_value orientation Ermittelt die Orientierung eines Bilds. Der Modifizierer enthält das Handle
des gewünschten Bilds. Bei Tiff-Bildern mit Orientation-Tag wird der Wert
dieses Tags zurückgeliefert; in allen anderen Fällen der Wert 1. PDFlib kom-
pensiert automatisch alle Orientation-Werte ungleich 1. Geltungsbereich:
page, pattern, template, glyph, document, path.
get_value resx Ermittelt die horizontale bzw. vertikale Auflösung eines Bilds. Der Modi-
resy fizierer enthält das Handle des gewünschten Bilds. Geltungsbereich: page,
pattern, template, glyph, document, path.
Ist der Rückgabewert positiv, so enthält er die Bildauflösung in Pixeln pro
Zoll (dots per inch, dpi). Ist der Rückgabewert negativ, kann über resx und
resy das Seitenverhältnis nicht-quadratischer Pixel ermittelt werden; ihre
absoluten Werte sind dann aber bedeutungslos. Ist der Rückgabewert 0,
so ist die Bildauflösung unbekannt.
set_ honoriccprofile Liest in Rasterbilder eingebettete ICC-Farbprofile und wendet sie auf die
parameter Bilddaten an. Standardwert: true.
set_parameter imagewarning Mit diesem Parameter kann eine Exception veranlasst werden, wenn ein
Bild mit PDF_load_image( ) nicht geöffnet werden konnte. Standardwert:
false. Geltungsbereich: beliebig.
true Beim Scheitern einer Bildfunktion wird eine Exception ausge-
löst und -1 (in PHP: 0) zurückgegeben. Der mit der Exception
gelieferte Text kann bei der Fehlersuche hilfreich sein.
false Beim Scheitern einer Bildfunktion wird keine Exception
ausgelöst. Stattdessen gibt die Funktion im Fehlerfall einfach -1
(in PHP: 0) zurück. Beachten Sie, dass in bestimmten Fällen
(meist bei beschädigten komprimierten Bilddaten) PDFlib auch
bei imagewarning=false eine Exception auslösen kann.
set_value image:iccprofile Handle für ein ICC-Profil, das auf alle entsprechenden Bilder angewandt
wird, sofern nicht die Option iccprofile übergeben wird.
get_value image:iccprofile Gibt ein Handle für das ICC-Profil zurück, das in das Bild eingebettet ist,
das von dem im Modifizierer übergebenen Handle referenziert wird
set_value renderingintent Rendering-Intent für Bilder. Mögliche Schlüsselwörter und ihre Bedeutung
finden Sie in Tabelle 3.7. Standardwert: Auto.
Öffnet eine (auf der Festplatte liegende oder virtuelle) Bilddatei unter Anwendung ver-
schiedener Optionen.
imagetype Wenn Sie den String auto übergeben, versucht PDFlib, den Typ der Bildda-
tei automatisch zu erkennen (dies ist bei Bildern vom Typ CCITT und raw nicht möglich
und darf bei der Option reftype mit dem Wert url oder fileref nicht verwendet werden). Es
beschleunigt die Verarbeitung etwas, wenn Sie das Bildformat explizit mit einem der
Strings bmp, ccitt, gif, jpeg, jpeg2000, png, raw oder tiff übergeben (weitere Informationen
hierzu finden Sie in Abschnitt 5.1.2, »Unterstützte Rasterbildformate«, Seite 148). Der
Typ jpeg2000 benötigt PDF ab Version 1.5. Der Typ ccitt unterscheidet sich von einer
TIFF-Datei, die CCITT-komprimierte Bilddaten enthält.
filename (Name-String) Name der Bilddatei, die geöffnet werden soll. Es muss sich um
eine lokale oder virtuelle Datei handeln, da PDFlib keine Bilddaten von URLs bezieht.
len (Nur C-Sprachbindung) Länge von filename (in Bytes) für UTF-16-Strings. Ist len
gleich 0, muss ein null-terminierter String übergeben werden.
Rückgabe Handle für das Bild, das in nachfolgenden Aufrufen von Bildfunktionen verwendet wer-
den kann. Der Rückgabewert muss auf den Wert -1 (in PHP: 0) überprüft werden, der ei-
nen Fehler anzeigt. Um genauere Angaben über die Art eines bildspezifischen Problems
zu erhalten (zum Beispiel falscher Dateiname, nicht unterstütztes Format, fehlerhafte
Bilddaten etc.), setzen Sie den Parameter oder die Option imagewarning auf true (siehe
Tabelle 8.39 und Tabelle 8.40). Das unterstützte Image-Handle kann nicht über mehrere
PDF-Dokumente hinweg verwendet werden.
Details Diese Funktion öffnet und analysiert eine Rasterbilddatei in einem der unterstützten
Dateiformate, das mit dem Parameter imagetype festgelegt wurde, und kopiert alle rele-
vanten Bilddaten in das Ausgabedokument. Die Funktion hat keinen sichtbaren Ein-
fluss auf die Ausgabe. Um das importierte Bild tatsächlich im generierten Ausgabedo-
kument zu platzieren, muss PDF_fit_image( ) aufgerufen werden. Ein Bild sollte für jedes
generiertes Dokument nur einmal geöffnet werden, da die Bilddaten sonst mehrfach
ins Ausgabedokument kopiert werden.
PDFlib öffnet die Bilddatei mit dem in filename übergebenen Namen, verarbeitet den
Inhalt und schließt sie wieder, bevor von diesem Funktionsaufruf zurückgekehrt wird.
Bilder können innerhalb eines Dokuments mehrfach platziert werden (siehe PDF_fit_
image( )), die zugehörige Bilddatei ist dann aber bereits geschlossen.
Ist imagetype = raw oder ccitt, müssen die Optionen width, height, components und bpc
übergeben werden, da PDFlib diese Angaben nicht aus den Bilddaten ableiten kann. Der
Benutzer muss dafür Sorge tragen, dass die Optionswerte auch zum Bild passen. Sonst
besteht die Gefahr, dass die PDF-Ausgabe fehlerhaft ist und Acrobat mit der Meldung
Nicht genügend Daten für ein Bild reagiert.
Gültigkeit Wurde die Option inline nicht angegeben, so ist der Geltungsbereich document, page, font
und die Funktion muss immer paarweise mit PDF_close_image( ) auftreten. Die Ausgabe-
größe ist ein wenig geringer, wenn das Bild innerhalb des Geltungsbereichs document
oder font statt im Geltungsbereich page geladen wird. Wird die Option inline übergeben,
so ist der Geltungsbereich page, pattern, template, glyph, und ein Aufruf von PDF_close_
image( ) ist nicht erforderlich.
Details Diese Funktion wirkt sich nur auf die in PDFlib verwaltete interne Bildstruktur aus.
Wurde das Bild aus einer Datei geöffnet, bleibt die eigentliche Bilddatei von dieser
Funktion unberührt, da sie bereits am Ende von PDF_load_image( ) geschlossen wurde.
Ein mit dieser Funktion geschlossenes Image-Handle kann nicht weiter verwendet wer-
den, da damit die interne Verknüpfung des Bilds zu PDFlib gelöst wurde.
Gültigkeit document, page, font; diese Funktion darf nur paarweise mit einem entsprechenden
Aufruf von PDF_load_image( ) auftreten, sofern nicht die Option inline verwendet wurde.
Platziert ein Bild oder Template unter Berücksichtigung verschiedener Optionen an Po-
sition (x, y).
image Gültiges Image- oder Template-Handle, das mit PDF_load_image( ) oder PDF_
begin_template( ) erzeugt wurde.
optlist Optionsliste zur genaueren Steuerung der Platzierung gemäß Tabelle 8.41.
Details Das Bild oder Template (die im Folgenden unterschiedslos »Objekt« genannt werden)
wird relativ zum Referenzpunkt (x, y) platziert. Standardmäßig wird die linke untere
Ecke des Objekts am Referenzpunkt platziert. Dieses Verhalten kann durch die Optio-
nen orientate, boxsize, position und fitmethod geändert werden. Standardmäßig wird ein
Bild gemäß seiner Auflösung skaliert. Dieses Verhalten lässt sich durch die Optionen
dpi, scale und fitmethod modifizieren.
Gültigkeit page, pattern, template, glyph (letzteres nur, wenn die Option colorized des Type-3-Fonts
gleich true oder das Bild eine Maske ist); diese Funktion kann auf beliebigen Seiten
beliebig oft aufgerufen werden, sofern das Image-Handle noch nicht mit PDF_close_
image( ) geschlossen wurde.
8.6.2 Templates
Hinweis Die in diesem Abschnitt beschriebenen Template-Funktionen haben keinen Bezug zur PDFlib-
Blockverarbeitung von variablen Daten. Zum Füllen von mit dem PDFlib-Block-Plugin erstellten
Blöcken verwenden Sie PDF_fill_textblock( ), PDF_fill_imageblock( ) und PDF_fill_pdfblock( )
(siehe Abschnitt 8.8, »Blockfunktionen (PPS)«, Seite 313).
Details Diese Funktion setzt alle Text-, Grafik- und Farbzustandsparameter auf ihre Standard-
werte zurück. Hypertext-Funktionen und Funktionen zum Öffnen von Rasterbildern
dürfen innerhalb einer Template-Definition nicht verwendet werden. Alle Text-, Grafik-
und Farbfunktionen sind hingegen einsetzbar.
Gültigkeit document, page; mit dieser Funktion beginnt der Geltungsbereich template; diese
Funktion muss immer paarweise mit PDF_end_template( ) auftreten.
Gültigkeit template; mit dieser Funktion endet der Geltungsbereich template; diese Funktion muss
immer paarweise mit PDF_begin_template( ) auftreten.
Details Diese Funktion fügt das übergebene Bild als Piktogramm für die aktuelle Seite ein. Da-
mit ein Bild als Piktogramm verwendet werden kann, muss es folgenden Bedingungen
genügen:
> Das Bild darf maximal 106 x 106 Pixel groß sein.
> Das Bild muss in Graustufen-, RGB- oder indizierten RGB-Farben vorliegen.
Diese Funktion erzeugt keine Piktogramme für die Seiten, sondern bietet lediglich die
Möglichkeit, bereits vorhandene Bilder hinzuzufügen, die gegebenenfalls als Pikto-
gramme verwendet werden. Die tatsächlichen Miniaturseiten müssen vom Client er-
stellt werden. Der Client muss dabei sicherstellen, dass die Farben, das Seitenverhältnis
sowie der tatsächliche Inhalt eines Piktogramms zum entsprechenden Seiteninhalt pas-
sen.
Da Acrobat seit Version 5 Piktogramme dynamisch generiert (mit Ausnahme von
Acrobat 5 und Adobe Reader 6 im Browser) und eine generierte PDF-Datei durch Pikto-
gramme nur vergrößert wird, ist davon abzuraten, Piktogramme selbst hinzuzufügen.
Stattdessen sollte man sich auf die clientseitige Piktogrammgenerierung verlassen.
Gültigkeit page; diese Funktion darf nur einmal pro Seite aufgerufen werden. Nicht alle Seiten
brauchen zugeordnete Piktogramme.
Parameter openmode
Öffnet ein (auf der Festplatte liegendes oder virtuelles) PDF-Dokument und bereitet es
zur späteren Verwendung vor.
optlist Optionsliste mit Optionen zum Öffnen des Dokuments gemäß Tabelle 8.42.
len (Wird nur in der C-Sprachbindung verwendet; muss in anderen Sprachen gleich 0
sein.) Länge von filename (in Bytes) für UTF-16-Strings. Ist len gleich 0, muss ein null-ter-
minierter String übergeben werden.
Rückgabe Dokument-Handle, das zur Verarbeitung einzelner Seiten des Dokuments oder zur Ab-
frage von Dokumenteigenschaften verwendet werden kann. Ein Rückgabewert von -1
(in PHP: 0) zeigt an, dass das PDF-Dokument nicht geöffnet werden konnte. Es kann eine
beliebige Anzahl von PDF-Dokumenten gleichzeitig geöffnet werden. Der Rückgabewert
kann bis zum Ende des umgebenden Geltungsbereichs document verwendet werden.
Details Das Dokument wird standardmäßig nicht akzeptiert, wenn eine oder mehrere der fol-
genden Bedingungen zutreffen (siehe Abschnitt 5.2.3, »Importierbare PDF-Dokumente«,
Seite 157):
> Das Dokument ist beschädigt.
> Das Dokument ist in einer höheren PDF-Version erstellt als das aktuelle Dokument.
> Das Dokument ist verschlüsselt und es wurde kein passendes Kennwort in der Opti-
on password übergeben.
> Das Dokument entspricht der aktuellen PDF/X-Kompatibilitätsstufe nicht.
> Das Dokument enthält Tagged PDF und für PDF_begin_document( ) ist die Option
tagged auf true gesetzt.
Außer bei der ersten Bedingung kann das Dokument mit der Option infomode in jedem
Fall geöffnet werden. Damit lassen sich Informationen über das PDF-Dokument abfra-
gen, zum Beispiel über Verschlüsselung, PDF/X-Status, Dokumentinfofelder etc.
Mit der Funktion PDF_get_errmsg( ) erhalten Sie in Form einer detaillierten Fehler-
meldung genauere Informationen über die Art des mit dem importierten PDF zusam-
menhängenden Problems (PDF-Dateiname falsch, Format nicht unterstützt, PDF-Daten
nicht korrekt etc.).
Gültigkeit object, document, page; im Geltungsbereich object kann ein PDI-Dokument-Handle nur
zur Abfrage von Informationen aus einem PDF-Dokument verwendet werden.
readproc Callback-Funktion, die size Byte in den durch buffer bezeichneten Speicher
kopiert. Ist das Ende des Dokuments früher erreicht, werden entsprechend weniger
Bytes kopiert. Die Funktion muss die Anzahl der tatsächlich kopierten Bytes zurück-
geben.
optlist Optionsliste mit Optionen zum Öffnen des PDF-Dokuments gemäß Tabelle
8.42.
Rückgabe Dokument-Handle, das zur Verarbeitung einzelner Dokumentseiten oder zur Abfrage
von Dokumenteigenschaften verwendet werden kann. Der Rückgabewert -1 zeigt an,
dass das PDF-Dokument nicht geöffnet werden konnte. Es können gleichzeitig beliebig
viele PDF-Dokumente geöffnet werden. Der Rückgabewert kann bis zum Ende des um-
gebenden Geltungsbereichs document verwendet werden.
Details Diese Funktion bietet eine besondere Schnittstelle für Applikationen, die beliebige
Mengen von PDF-Daten aus einer beliebigen Datenquelle beziehen, statt das PDF-Doku-
ment auf der Festplatte oder im Speicher zur Verfügung zu stellen.
Gültigkeit object, document, page; im Geltungsbereich object kann ein PDI-Dokument-Handle nur
zur Abfrage von Informationen aus einem PDF-Dokument verwendet werden.
Details Diese Funktion schließt ein PDF-Importdokument und gibt alle Ressourcen frei, die sich
auf das Dokument beziehen. Alle noch geöffneten Dokumentseiten werden geschlos-
sen. Das Dokument-Handle darf nach Aufruf dieser Funktion nicht mehr benutzt wer-
den. Ein zu importierendes PDF-Dokument sollte nicht geschlossen werden, wenn noch
weitere Seiten zu importieren sind. Sie können es zwar beliebig oft öffnen und schlie-
ßen, dies kann die PDF-Ausgabedaten aber unnötig vergrößern.
pagenumber Nummer der zu öffnenden Seite. Die erste Seite hat die Seitennummer 1.
Details Diese Funktion kopiert alle Daten der importierten Seite in das Ausgabedokument, hat
aber keinen sichtbaren Effekt auf die Ausgabe. Um die importierte Seite tatsächlich im
generierten Dokument zu platzieren, müssen Sie PDF_fit_pdi_page( ) verwenden. Um ge-
nauere Informationen über ein Problem mit dem PDF-Import zu erhalten (Format nicht
unterstützt, PDF-Daten nicht korrekt etc.), setzen Sie den Parameter pdiwarning auf true.
War die Option infomode beim Öffnen der Seite gleich true, werden keine Daten in die
Ausgabedatei kopiert.
Die Funktion scheitert, wenn die PDF-Version des importierten Dokuments höher
als die der generierten PDF-Ausgabe ist.
Es kann eine beliebige Anzahl von Seiten gleichzeitig geöffnet sein. Wird dieselbe
Seite mehrfach geöffnet, werden dafür unterschiedliche Handles zurückgegeben, und
jedes Handle muss genau einmal geschlossen werden.
iconname Hypertext- Weist der importierten Seite einen Namen zu, über den via JavaScript auf die Seite
String verwiesen werden kann. DIes ist z.B. nützlich, um die Seite einem Formularfeld als
Symbol zuzuweisen.
infomode Boolean Ist infomode gleich true, wird das Dokument so geöffnet, dass allgemeine
Informationen und Blockeigenschaften zwar abfragbar sind, die Seiten sich aber
nicht in das Ausgabedokument importieren lassen. Standardwert: Wert der
Option infomode beim zugehörigen Aufruf von PDF_open_pdi( ) (Standardwert:
false). Bei Dokumenten, die mit infomode=true geöffnet wurden, wird die hier
beschriebene Option ignoriert.
pdiusebox Schlüsselwort pdiusebox bestimmt, welche der folgenden Box-Angaben zur Ermittlung der
Größe einer importierten Seite verwendet wird. Standardwert: crop.
media MediaBox (immer vorhanden)
crop CropBox, falls vorhanden, sonst MediaBox
bleed BleedBox, falls vorhanden, sonst CropBox
trim TrimBox, falls vorhanden, sonst CropBox
art ArtBox, falls vorhanden, sonst CropBox
pdiwarning Boolean Legt fest, ob die Funktion im Fehlerfall eine Exception auslöst. Standardwert ist
der Wert des Parameters pdiwarning (siehe Tabelle 8.46).
Schließt das Seiten-Handle und gibt alle Ressourcen frei, die sich auf die Seite beziehen.
Details Diese Funktion schließt die Seite, die mit dem Seiten-Handle page verknüpft ist, und
gibt alle zugehörigen Ressourcen frei. page darf nach diesem Aufruf nicht mehr verwen-
det werden.
optlist Optionsliste zur genaueren Steuerung der Platzierung gemäß Tabelle 8.41.
Details Diese Funktion entspricht im Wesentlichen PDF_fit_image( ), arbeitet aber mit impor-
tierten PDF-Seiten. Die meisten in Tabelle 8.41 aufgeführten Optionen zur Skalierung
und Platzierung werden auch für PDF-Seiten unterstützt.
PDF/X Das Dokument, aus dem die Seite importiert wird, muss eine passende PDF/X-
Kompatibilitätsstufe und dieselbe Druckausgabebedingung (siehe Tabelle 7.6) wie das
generierte Dokument verwenden.
page Verlangt optlist ein Seiten-Handle (siehe Tabelle 8.44), muss page ein gültiges mit
PDF_open_pdi_page( ) erzeugtes PDF-Seiten-Handle sein (keine Seitennummer!). Das Sei-
ten-Handle darf nicht bereits geschlossen worden sein. Erfordert optlist kein Seiten-
Handle, muss page gleich -1 sein.
Rückgabe Wurde die Funktion erfolgreich ausgeführt, wird der Wert 1 zurückgegeben, im Fehler-
fall der Fehlercode -1 (in PHP: 0).
Gültigkeit document
PDF/X Die Druckausgabebedingung für das generierte Dokument muss entweder in dieser
Funktion mit der Option copyoutputintent oder mit PDF_load_profile( ) gesetzt werden.
8.7.3 Parameterbehandlung
C++ Java double get_pdi_value(String key, int doc, int page, int reserved)
Perl PHP double PDF_get_pdi_value(resource p, string key, int doc, int page, int reserved)
C double PDF_get_pdi_value(PDF *p, const char *key, int doc, int page, int reserved)
key Name (Schlüssel) des zu ermittelnden Parameters, siehe Tabelle 8.45 und Tabelle
8.46.
Gültigkeit beliebig
C++ Java String get_pdi_parameter(String key, int doc, int page, int reserved)
Perl PHP string PDF_get_pdi_parameter(resource p, string key, int doc, int page, int reserved)
C const char * PDF_get_pdi_parameter(PDF *p,
const char *key, int doc, int page, int reserved, int *len)
key (Name-String) Legt den Namen (Schlüssel) des zu ermittelnden Parameters fest,
siehe Tabelle 8.45 und Tabelle 8.46.
len (Nur C-Sprachbindung) C-Zeiger auf eine Variable vom Typ Integer, in die die Län-
ge des zurückgegebenen Strings in Byte eingetragen wird. Ist der Zeiger gleich NULL, so
wird er ignoriert. Dieser Parameter ist nur in C nötig und in anderen Sprachbindungen
nicht erlaubt.
Rückgabe String-Parameter, der aus dem Dokument ermittelt wurde, als Hypertextstring. Ist kei-
ne Information verfügbar, so wird ein Leerstring zurückgegeben.
Details Diese Funktion ermittelt einen String-Parameter, der sich auf ein importiertes PDF-
Dokument bezieht und durch page und index näher spezifiziert sein kann. Tabelle 8.46
zeigt sinnvolle Parameterkombinationen.
Gültigkeit beliebig
Hinweis Alle in diesem Abschnitt erläuterten Blockfunktionen benötigen den PDFlib Personalization
Server (PPS). Außerdem ist das PDFlib-Block-Plugin für Adobe Acrobat erforderlich, um Blöcke in
PDF-Templates zu generieren. Weitere Informationen zum PDF-Block-Plugin finden Sie in Kapi-
tel 6.
C++ Java int fill_textblock(int page, String blockname, String text, String optlist)
Perl PHP int PDF_fill_textblock(resource p, int page, string blockname, string text, string optlist)
C int PDF_fill_textblock(PDF *p,
int page, const char *blockname, const char *text, int len, const char *optlist)
Füllt einen Block des Typs Text mit variablen Daten unter Berücksichtigung verschiede-
ner Optionen.
text (Content-String) Text, der in den Block eingetragen werden soll, oder ein Leer-
string, wenn der (in den Blockeigenschaften definierte) Standardtext verwendet werden
soll.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings, die Nullzeichen
enthalten können. Ist len gleich 0, muss ein null-terminierter String übergeben werden.
Rückgabe -1 (in PHP: 0), falls kein Block mit dem angegebenen Namen auf der Seite existiert, der
Block nicht gefüllt werden kann (zum Beispiel wegen Fontproblemen) oder der Block
eine aktuellere PDFlib-Version zur Verarbeitung benötigt; 1, falls der Block erfolgreich
verarbeitet werden konnte. Mit der Option pdiwarning erhalten Sie weitere Informatio-
nen über die Art des Problems.
Hinweis Diese Funktion ist nur im PDFlib Personalization Server (PPS) verfügbar.
C++ Java int fill_imageblock(int page, String blockname, int image, String optlist)
Perl PHP int PDF_fill_imageblock(resource p, int page, string blockname, int image, string optlist)
C int PDF_fill_imageblock(PDF *p,
int page, const char *blockname, int image, const char *optlist)
Füllt einen Block des Typs Image mit variablen Daten unter Berücksichtigung verschie-
dener Optionen.
image Gültiges Image-Handle für das Bild, das in den Block gefüllt werden soll, oder -1
zur Verwendung des in den Blockeigenschaften verwendeten Standardbilds.
Rückgabe -1 (in PHP: 0), falls kein Block mit dem angegebenen Namen auf der Seite existiert oder
der Block eine aktuellere PDFlib-Version zur Verarbeitung benötigt; 1, falls der Block er-
folgreich verarbeitet werden konnte.
Details Das Bild, auf das mit dem übergebenen Image-Handle verwiesen wird, wird im Block
platziert, wobei die Eigenschaften des Blocks berücksichtigt werden. Ist image gleich -1
(in PHP: 0), verwendet die Funktion das Standardbild des Blocks, sofern dieses vorhan-
den ist, oder beendet sich ohne weiteres.
Stellt sich das PDF-Dokument als beschädigt heraus, löst die Funktion abhängig von
der Option bzw. dem Parameter pdiwarning entweder eine Exception aus oder gibt -1 zu-
rück.
Hinweis Diese Funktion ist nur im PDFlib Personalization Server (PPS) verfügbar.
Füllt einen Block des Typs PDF mit variablen Daten unter Berücksichtigung verschiede-
ner Optionen.
contents Gültiges PDF-Seiten-Handle für die PDF-Seite, die in den Block eingetragen
werden soll, oder -1, falls die in den Blockeigenschaften definierte Standard-PDF-Seite
verwendet werden soll.
Rückgabe -1 (in PHP: 0), falls kein Block mit dem angegebenen Namen auf der Seite existiert, oder
der Block eine aktuellere PDFlib-Version zur Verarbeitung benötigt; 1, falls der Block er-
folgreich verarbeitet werden konnte.
Details Die PDF-Seite, auf das mit dem übergebenen Seiten-Handle contents verwiesen wird,
wird im Block platziert, wobei die Eigenschaften des Blocks berücksichtigt werden.
Ist contents gleich -1 (in PHP: 0), verwendet die Funktion die Standard-PDF-Seite des
Blocks, sofern diese vorhanden ist, oder beendet sich ohne weiteres.
Stellt sich das PDF-Dokument als beschädigt heraus, löst die Funktion abhängig von
der Option bzw. dem Parameter pdiwarning entweder eine Exception aus oder gibt -1 zu-
rück.
Hinweis Diese Funktion ist nur im PDFlib Personalization Server (PPS) verfügbar.
Tabelle 8.48 Parameter für Hypertext-Funktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«, Seite 236)
Funktion Schlüssel Erklärung
set_parameter hypertextencoding1 Legt den Zeichensatz fest, in dem Hypertext-Funktionen vom Client
get_parameter übergebene Strings erwarten (siehe Abschnitt 4.5.4, »String-Behandlung
in nicht Unicode-fähigen Sprachen«, Seite 108). Ein Leerstring bedeutet
unicode. Standardwert: auto. Geltungsbereich: beliebig.
set_parameter hypertextformat1 Legt fest, in welchem Format der Client Strings an Hypertext-Funktionen
get_parameter übergeben soll. Mögliche Werte sind bytes, utf8, utf16, utf16le, utf16be
und auto. Standardwert: auto. Geltungsbereich: beliebig.
set_ usercoordinates Ist usercoordinates gleich false, werden die Koordinaten für Hypertext-
parameter rechtecke im Standardkoordinatensystem erwartet (siehe Abschnitt 3.2.1,
»Koordinatensysteme«, Seite 62); andernfalls wird das aktuelle Benutzer-
koordinatensystem verwendet. Standardwert: false. Geltungsbereich:
beliebig.
1. Dieser Parameter darf in den Unicode-fähigen Sprachen Java und Tcl nicht verwendet werden.
8.9.1 Aktionen
Erzeugt eine Aktion, die auf verschiedene Objekte und Events angewandt werden kann.
type Typ der Aktion, der durch eine der folgenden Schlüsselwörter beschrieben wird:
> GoTo: Gehe zu einem Ziel im aktuellen Dokument.
> GoToR: Gehe zu einem Ziel eines anderen (entfernten) Dokuments.
> Launch: Datei öffnen bzw. Anwendung ausführen.
> URI: Uniform Resouce Identifier auflösen, d.h. Webverknüpfung öffnen.
> Hide: Notiz oder Formularfeld ein-/ausblenden.
> Named: Acrobat-Menübefehl ausführen, der durch den Namen definiert ist.
> SubmitForm: Formulardaten an einen Uniform Resource Locator, also eine Internet-
Adresse senden (beachten Sie, dass in Acrobat kein Senden mit Basic Authentication
möglich ist).
> ResetForm: Bestimmte oder alle Formularfelder des Dokuments auf ihre Standard-
werte zurücksetzen.
> ImportData: Formulardaten aus einer Datei importieren.
> JavaScript: Skript mit JavaScript-Code ausführen.
> SetOCGState: (PDF 1.5) Ebenensichtbarkeit einstellen.
Rückgabe Aktions-Handle, mit dem Aktionen an Objekte im Dokument geknüpft werden können.
Es kann bis zum Ende des umschließenden Geltungsbereichs document verwendet wer-
den.
Gültigkeit page, document. Das zurückgegebene Handle kann bis zum nächsten Aufruf von PDF_
end_document( ) verwendet werden.
Erzeugt im aktuellen Dokument auf einer beliebigen Seite ein benanntes Ziel.
name (Hypertext-Name) Name des Ziels für Verknüpfungen, Lesezeichen oder andere
Auslöser. Namen für benannte Ziele müssen im Dokument eindeutig sein. Wird dersel-
be Name für ein Dokument mehrmals übergeben, so wird nur die letzte Definition ver-
wendet und die übrigen werden kommentarlos ignoriert.
len (Nur C-Sprachbindung) Länge von name (in Bytes) für UCS-2-Strings. Ist len gleich
0, muss ein null-terminierter String übergeben werden.
optlist Optionsliste zur Festlegung des benannten Ziels gemäß Tabelle 8.50. Eine leere
Liste entspricht {type fitwindow page 0}.
Details Das Ziel muss in optlist genauer festgelegt werden und kann sich auf einer beliebigen
Seite im aktuellen Dokument befinden. Der übergebene name kann mit der Option
destname in PDF_create_action( ), PDF_create_annotation( ), PDF_create_bookmark( ) und
PDF_begin/end_document( ) verwendet werden. Auf diese Weise lassen sich die Definiti-
on und die Anwendung eines Ziels in zwei getrennte Schritte aufspalten.
Alternativ dazu kann die Definition und Verwendung des benannten Ziels auch kom-
biniert werden, sofern das Ziel zum Zeitpunkt seiner Anwendung bereits bekannt ist.
Dazu verwenden Sie in obigen Funktionen die Option destination. PDF_add_nameddest( )
ist in diesem Fall nicht erforderlich.
Tabelle 8.50 Optionen zur Festlegung des Ziels in PDF_add_nameddest( ) sowie für die Option destination
in PDF_create_action( ), PDF_create_annotation( ), PDF_create_bookmark( ) und PDF_begin/end_
document( ).
Option Typ Erklärung
group String (Erforderlich, wenn die Option page definiert ist und das Dokument Seiten-
gruppen verwendet; sonst nicht zulässig.) Name der Seitengruppe, zu der die
Zielseite gehört.
hypertext- Schlüsselwort Legt den Zeichensatz für den Parameter name fest (siehe Abschnitt 4.5.4, »String-
encoding Behandlung in nicht Unicode-fähigen Sprachen«, Seite 108). Ein leerer String
entspricht unicode. Standardwert: Wert des globalen Parameters
hypertextencoding
hypertext- Schlüsselwort Legt das Format für den Parameter name fest. Mögliche Werte sind bytes, utf8,
format utf16, utf16le, utf16be und auto. Standardwert: Wert des Parameters
hypertextformat
C++ Java void create_annotation(double llx, double lly, double urx, double ury,
String type, String optlist)
Perl PHP PDF_create_annotation(resource p,
float llx, float lly, float urx, float ury, string type, string optlist)
C void PDF_create_annotation(PDF *p,
double llx, double lly, double urx, double ury, const char *type, const char *optlist)
llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke
des Anmerkungsrechtecks in Standardkoordinaten (sofern der Parameter oder die Opti-
on usercoordinates gleich false ist) oder in Benutzerkoordinaten (wenn usercoordinates
gleich true ist). Acrobat positioniert die linke obere Ecke der Anmerkung an der linken
oberen Ecke des angegebenen Rechtecks.
Beachten Sie, dass die Koordinaten für Anmerkungen und die Parameter der Funkti-
on PDF_rect( ) unterschiedlich sind. PDF_create_annotation( ) erwartet die Parameter für
zwei Ecken, während an PDF_rect( ) die Koordinaten einer Ecke sowie die Breite und
Höhe übergeben werden.
type Typ der Anmerkung, der durch eines der folgenden Schlüsselwörter festgelegt ist:
> Circle: Kreis-Anmerkung
> FileAttachment: Dateianlage-Anmerkung. Acrobat Reader 5 kann Dateianlagen nicht
verarbeiten und zeigt stattdessen ein Fragezeichen an.
> FreeText: Freier-Text-Anmerkung
> Highlight: Hervorheben-Anmerkung
> Ink: Ink-Anmerkung
> Line: Linien-Anmerkung
> Link: Verknüpfungsanmerkung
> Polygon: (PDF 1.5) Polygon-Anmerkung (geschlossenes Vieleck)
> PolyLine: (PDF 1.5) Polygonlinie-Anmerkung; offenes Vieleck, d.h. die beiden letzten
Punkte sind nicht verbunden.
> Popup: Popup-Anmerkung
> Square: Rechteck-Anmerkung
> Squiggly: (PDF 1.4) Unterringeln-Anmerkung
> Stamp: Stempel-Anmerkung
> StrikeOut: Durchstreichen-Anmerkung
> Text: Text-Anmerkung (in Acrobat Notiz genannt)
> Underline: Unterstreichen-Anmerkung
Gültigkeit page
PDF/X In allen PDF/X-Modi sind Anmerkungen nur zulässig, wenn sie vollständig außerhalb
der BleedBox liegen (oder TrimBox/ArtBox, wenn keine BleedBox vorhanden ist).
tag (Tag)
interiorcolor Farbe (Nur für type=Line, PolyLine, Square, Circle) Farbe für die Linienenden, das
Rechteck bzw. die Ellipse der Anmerkung. Unterstützte Farbräume: none, gray,
rgb. Standardwert: none.
line Liste aus 4 (Nur für type=Line; erforderlich) Liste aus vier Zahlen x1, y1, x2, y2 für die Anfangs-
Floats und Endkoordinaten der Linie in Standardkoordinaten (wenn der Parameter
usercoordinates gleich false ist) oder in Benutzerkoordinaten (bei true).
linewidth Integer Breite des Anmerkungsrandes oder der Linie für die Anmerkungstypen Line,
PolyLine, Polygon, Square, Circle, Ink in Standardeinheiten (=Punkt). Ist linewidth
gleich 0, ist kein Rand sichtbar. Standardwert: 1.
locked Boolean Ist locked gleich true, können die Anmerkungseigenschaften in Acrobat nicht
bearbeitet werden. Standardwert: false.
C++ Java void create_field(double llx, double lly, double urx, double ury,
String name, String type, String optlist)
Perl PHP PDF_create_field(resource p, float llx, float lly, float urx, float ury,
string name, string type, string optlist)
C void PDF_create_field(PDF *p, double llx, double lly, double urx, double ury,
const char *name, int len, const char *type, const char *optlist)
Erstellt unter Anwendung verschiedener Optionen ein Formularfeld auf der aktuellen
Seite.
llx, lly, urx, ury x- und y-Koordinaten der linken unteren und rechten oberen Ecke
des Feldrechtecks in Standardkoordinaten (wenn der Parameter oder die Option user-
coordinates gleich false sind) oder in Benutzerkoordinaten (bei true).
Beachten Sie, dass sich die Koordinaten für Formularfelder von den Parametern der
Funktion PDF_rect( ) unterscheiden. Während PDF_create_field( ) explizit die Parameter
für zwei Ecken erwartet, werden an PDF_rect( ) die Koordinaten einer Ecke sowie die Brei-
te und die Höhe übergeben.
name (Hypertext-String) Name des Formularfelds, dem eventuell die Namen einer
oder mehrerer Gruppen vorangestellt werden, die mit PDF_create_fieldgroup( ) erstellt
wurden. Gruppennamen müssen durch einen Punkt ».« voneinander sowie vom Feld-
namen getrennt werden. Feldnamen müssen auf der Seite eindeutig sein und dürfen
nicht mit einem Punkt ».« enden.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings. Ist len gleich 0,
muss ein null-terminierter String übergeben werden.
Details Die Tabulatorreihenfolge der Felder auf der Seite (d.h. die Reihenfolge, in der sie beim
Drücken der Tabulatortaste den Fokus erhalten) bestimmt sich standardmäßig durch
die Reihenfolge der Aufrufe von PDF_create_field( ). Mit der Option taborder lässt sich
Gültigkeit page
PDF/X Formularfelder sind in allen PDF/X-Modi nur erlaubt, wenn sie vollständig außerhalb
der BleedBox liegen (oder der TrimBox/ArtBox, wenn keine BleedBox vorhanden ist).
name (Hypertext-String) Name der Formularfeldgruppe; diesem kann der Name einer
anderen Gruppe vorangestellt sein. Feldgruppen lassen sich beliebig verschachteln.
Gruppennamen müssen durch einen Punkt ».« getrennt werden. Sie müssen innerhalb
des Dokuments eindeutig sein und dürfen nicht mit einem Punkt ».« enden.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings. Ist len gleich 0,
muss ein null-terminierter String übergeben werden.
optlist Optionsliste mit Feldeigenschaften gemäß Tabelle 8.52 und Tabelle 8.53.
Details Feldgruppen sind nützlich, um den Inhalt eines Feldes in einem oder mehreren anderen
Feldern wiederzugeben. Wird ein Feldgruppenname als Präfix für einen mit PDF_create_
field( ) erzeugten Namen übergeben, gehört das neue Feld zu dieser Gruppe. Die für eine
Gruppe in optlist übergebenen Feldeigenschaften werden von allen zur Gruppe gehö-
renden Feldern geerbt.
8.9.5 Lesezeichen
text (Hypertext-String) Enthält den Lesezeichentext. Die maximale Länge von text be-
trägt 255 Ein-Byte-Zeichen (8-Bit-Zeichensätze) oder 126 Unicode-Zeichen. Aus prakti-
schen Gründen sollten jedoch nicht mehr als 32 Zeichen verwendet werden.
len (Nur C-Sprachbindung) Länge von text (in Bytes) für UCS-2-Strings. Ist len gleich 0,
muss ein null-terminierter String übergeben werden.
Rückgabe Handle für das erstellte Lesezeichen, das in nachfolgenden Aufrufen in der Option
parent verwendet werden kann.
Details Diese Funktion fügt ein PDF-Lesezeichen mit dem übergebenen text hinzu. Wird die Op-
tion destination nicht übergeben, zeigt das Lesezeichen auf die aktuelle Seite (bzw. auf
die letzte Seite, wenn es im Geltungsbereich document, oder auf die erste Seite, wenn es
vor der ersten Seite verwendet wird).
Beim Erstellen von Lesezeichen wird die Option openmode für PDF_begin/end_
document( ) auf den Standardwert bookmarks gesetzt.
8.9.6 Dokumentinfofelder
value (Hypertext-String) String, der dem Parameter key zugewiesen wird. Durch Acro-
bat ist die Länge von value auf maximal 255 Byte beschränkt. Beachten Sie, dass auf-
grund eines Fehlers in Adobe Reader 6 für Windows das Zeichen »&« in manchen Info-
Strings nicht korrekt angezeigt wird.
len (Nur PDF_set_info2( ) und C-Sprachbindung) Länge von value (in Byte) für UCS-2-
Strings. Ist len gleich 0, muss ein null-terminierter String übergeben werden.
Details Der übergebene Wert wird nur für das aktuelle und nicht für alle im selben Geltungsbe-
reich object erstellten Dokumente verwendet.
1. Siehe dublincore.org
void PDF_add_note(PDF *p, double llx, double lly, double urx, double ury,
const char *contents, const char *title, const char *icon, int open)
void PDF_add_note2(PDF *p, double llx, double lly, double urx, double ury,
const char *contents, int contents_len, const char *title, int title_len,
const char *icon, int open)
Veraltet, verwenden Sie stattdessen PDF_create_annotation( ) mit type=Text.
void PDF_attach_file(PDF *p, double llx, double lly, double urx, double ury, const char
*filename, const char *description, const char *author, const char *mimetype,
const char *icon)
void PDF_attach_file2(PDF *p, double llx, double lly, double urx, double ury, const char
*filename, int len, const char *description, int desc_len, const char *author,
int author_len, const char *mimetype, const char *icon)
Veraltet, verwenden Sie stattdessen PDF_create_annotation( ) mit type=FileAttachment.
Der Parameter description entspricht der Option contents, der Parameter author der Opti-
on title und der Parameter icon der Option iconname.
void PDF_add_pdflink(PDF *p, double llx, double lly, double urx, double ury,
const char *filename, int page, const char *optlist)
Veraltet, verwenden Sie stattdessen PDF_create_action( ) mit type=GoToR und PDF_create_
annotation( ) mit type=Link.
void PDF_add_launchlink(PDF *p, double llx, double lly, double urx, double ury,
const char *filename)
Veraltet, verwenden Sie stattdessen PDF_create_action( ) mit type=Launch und PDF_
create_annotation( ) mit type=Link.
void PDF_add_weblink(PDF *p, double llx, double lly, double urx, double ury, const char *url)
Veraltet, verwenden Sie stattdessen PDF_create_action( ) mit type=URI und PDF_create_
annotation( ) mit type=Link.
Öffnet ein Strukturelement oder einen anderen Dokumentbestandteil mit den als Opti-
onen übergebenen Attributen.
tag Elementtyp gemäß Tabelle 8.57. Er muss einem der Standardstrukturtypen ent-
sprechen, die für die aktuelle PDF-Kompatibilitätsstufe zulässig sind, oder einem Pseu-
do-Tag.
Gültigkeit page für Inline-Elemente, für reguläre Elemente auch document; diese Funktion muss
immer paarweise mit PDF_end_item( ) auftreten. Sie ist nur im Tagged-PDF-Modus
zulässig.
Tabelle 8.58 Optionen für die Eigenschaften von Struktur- oder Pseudo-Tags in PDF_begin_item( )
Option Typ Beschreibung
Alt Hypertext- (Nicht für Pseudo-Tags außer in PDF 1.5 für ASpan) Alternative Beschreibung für
String den Dokumentbestandteil. Sie sollte für Bilder, etc. übergeben werden, die sich
nicht als Text interpretieren lassen. Bei Bildern ist alternativer Text zur Barriere-
freiheit (Accessibility) erforderlich. Wird diese Option im PDF-1.4-Modus ver-
wendet, muss die Option inline auf false gesetzt sein.
ActualText Hypertext- (Nicht für Pseudo-Tags außer in PDF 1.5 für ASpan; erforderlich für Text mit Zei-
String chensätzen, die nicht Unicode-konform sind.) Äquivalenter Ersatztext für den
Dokumentbestandteil. Er sollte für Textinhalte übergeben werden, die in un-
üblicher Darstellung vorliegen, wie Ligaturen, verwaschene Zeichen in Bildern,
Initialen etc. Wird diese Option im PDF-1.4-Modus verwendet, muss die Option
inline auf false gesetzt sein.
artifacttype Schlüsselwort (Nur für tag=Artifact) Bezeichnet den Artefakttyp des Dokumentbestandteils:
Pagination, Layout oder Page.
Attached Schlüssel- (Nur für tag=Artifact und artifacttype=Pagination) Liste mit ein bis vier der
wortliste Schlüsselwörter Top, Bottom, Left und Right.
BBox Rechteck (Nur für tag=Artifact sowie alle Tabellen- und Grafik-Tags; optional, aber für das
Umfließen von Text ratsam) Die Größenangabe des Artefakts im Standardkoor-
dinatensystem (bei usercoordinates=false) oder im Benutzerkoordinatensystem
(bei usercoordinates=true). Wurde diese Option nicht übergeben, generiert PDFlib
automatisch einen BBox-Eintrag für importierte Bilder und PDF-Seiten.
ColSpan Integer (Nur für tag=TH und TD) Anzahl der von einer Zelle belegten Tabellenspalten.
E Hypertext- (Nicht für Pseudo-Tags außer ASpan; erfordert PDF 1.5 für Struktur-Tags) Abkür-
String zungsergänzung für den Dokumentbestandteil. Sie sollte zur Erklärung von
Abkürzungen und Akronymen übergeben werden. Die Sprachausgabe von Acro-
bat sieht diese Ergänzung auch ohne explizite Wortgrenze als eigenes Wort an.
hypertext- Schlüsselwort Legt den Zeichensatz für den übergebenen Text fest (siehe Abschnitt 4.5.4, »String-
encoding Behandlung in nicht Unicode-fähigen Sprachen«, Seite 108). Ein leerer String
entspricht unicode. Standardwert: leerer String für Unicode-fähige Sprachbin-
dungen, sonst auto.
index Integer (Nicht für Pseudo-Tags) Index, an dem das Element unterhalb des Elternelements
eingefügt wird. Anhand von Werten zwischen 0 und der aktuellen Anzahl der
Kindelemente wird das Element an der gewünschten Position unterhalb des
Elternelements angefügt. Mit -1 lässt sich das Element an letzter Position
eintragen. Standardwert: -1.
inline Boolean (Nur für tag=ASpan und alle Inline-Level-Tags) Ist inline gleich true, wird der
Dokumentbestandteil inline geschrieben, und es wird kein Strukturelement
erzeugt. Standardwert: true.
Lang String (Nicht für Pseudo-Tags außer ASpan) Sprachidentifikation für den
Dokumentbestandteil in dem Format, das in Tabelle 8.5 für die Option lang
beschrieben wird. Damit lässt sich die für das Dokument eingestellte Sprache in
einzelnen Dokumentbestandteilen überschreiben.
Details Alle Inline-Elemente müssen vor den Seitenende und alle regulären Elemente vor dem
Dokumentende geschlossen werden. Um den Speicherbedarf zu verringern, sollten re-
guläre Elemente aber unbedingt unmittelbar nach Gebrauch geschlossen werden. Ein
Element kann nur geschlossen werden, wenn zuvor all seine Kindelemente geschlossen
wurden. Nach dem Schließen eines Elements wird sein Elternelement zum aktiven Ele-
ment.
Gültigkeit page für Inline-Elemente und für reguläre Elemente auch document; diese Funktion
muss immer paarweise mit PDF_begin_item( ) auftreten. Sie ist nur im Tagged-PDF-
Modus zulässig.
Details Es ist erhöht die Flexibilität beim effizienten Erstellen von Tagged-PDF-Seiten, wenn
man ein Strukturelement nicht unmittelbar nach der Erzeugung verwendet, sondern
erst später aktiviert. Dies kann sinnvoll sein, wenn mehrere Strukturbäume auf der Sei-
te parallel verlaufen, zum Beispiel bei mehrspaltigen Layouts oder Texteinschüben, die
den Haupttext unterbrechen. Weitere Informationen finden Sie in Abschnitt 7.5.3, »Ak-
tivierung von Elementen für komplexe Layouts«, Seite 210.
[2] Das folgende Buch vom Hauptentwickler von PDFlib behandelt zahlreiche Themen
zu PostScript, PDF und Schriften:
A Literaturhinweise 341
B PDFlib-Kurzreferenz
Allgemeine Funktionen
Funktionsprototyp Seite
void PDF_boot(void) 223
void PDF_shutdown(void) 223
PDF *PDF_new(void) 223
PDF *PDF_new2(void (*errorhandler)(PDF *p, int errortype, const char *msg), void* (*allocproc)(PDF *p, size_t size,
const char *caller), void* (*reallocproc)(PDF *p, void *mem, size_t size, const char *caller), void (*freeproc)(PDF *p,
void *mem), void *opaque) 224
void PDF_delete(PDF *p) 225
int PDF_begin_document(PDF *p, const char *filename, int len, const char *optlist) 226
void PDF_begin_document_callback(PDF *p, size_t (*writeproc) (PDF *p, void *data, size_t size), const char
*optlist) 226
void PDF_end_document(PDF *p, const char *optlist) 228
const char * PDF_get_buffer(PDF *p, long *size) 229
void PDF_begin_page_ext(PDF *p, double width, double height, const char *optlist) 232
void PDF_end_page_ext(PDF *p, const char *optlist) 233
void PDF_suspend_page(PDF *p, const char *optlist) 235
void PDF_resume_page(PDF *p, const char *optlist) 235
double PDF_get_value(PDF *p, const char *key, double modifier) 236
void PDF_set_value(PDF *p, const char *key, double value) 236
const char * PDF_get_parameter(PDF *p, const char *key, double modifier) 237
void PDF_set_parameter(PDF *p, const char *key, const char *value) 237
void PDF_create_pvf(PDF *p, const char *filename, int len, const void *data, size_t size, const char *optlist) 237
int PDF_delete_pvf(PDF *p, const char *filename, int len) 238
int PDF_get_errnum(PDF *p) 239
const char *PDF_get_errmsg(PDF *p) 239
const char *PDF_get_apiname(PDF *p) 240
void *PDF_get_opaque(PDF *p) 240
const char *PDF_utf16_to_utf8(PDF *p, const char *utf16string, int len, int *size) 241
const char * PDF_utf8_to_utf16(PDF *p, const char *utf8string, const char *ordering, int *size) 241
Fontfunktionen
Funktionsprototyp Seite
int PDF_load_font(PDF *p, const char *fontname, int len, const char *encoding, const char *optlist) 243
void PDF_setfont(PDF *p, int font, double fontsize) 246
void PDF_begin_font(PDF *p, char *fontname, int reserved, double a, double b, double c, double d, double e,
double f, const char *optlist) 246
void PDF_end_font(PDF *p) 247
void PDF_begin_glyph(PDF *p, char *glyphname, double wx, double llx, double lly, double urx, double ury) 247
void PDF_end_glyph(PDF *p) 248
void PDF_encoding_set_char(PDF *p, const char *encoding, int slot, const char *glyphname, int uv) 248
B PDFlib-Kurzreferenz 343
Textausgabefunktionen
Funktionsprototyp Seite
void PDF_set_text_pos(PDF *p, double x, double y) 251
void PDF_show(PDF *p, const char *text) 251
void PDF_xshow(PDF *p, const char *text, int len, const double *xadvancelist) 251
void PDF_show_xy(PDF *p, const char *text, double x, double y) 252
void PDF_continue_text(PDF *p, const char *text) 252
void PDF_fit_textline(PDF *p, const char *text, int len, double x, double y, const char *optlist) 253
double PDF_stringwidth(PDF *p, const char *text, int font, double fontsize) 257
int PDF_create_textflow(PDF *p, const char *text, int len, const char *optlist) 258
const char *PDF_fit_textflow(PDF *p, int textflow, double llx, double lly, double urx, double ury, const char
*optlist) 259
double PDF_info_textflow(PDF *p, int textflow, const char *keyword) 262
void PDF_delete_textflow(PDF *p, int textflow) 262
Grafikfunktionen
Funktionsprototyp Seite
void PDF_setdash(PDF *p, double b, double w) 269
void PDF_setdashpattern(PDF *p, const char *optlist) 269
void PDF_setflat(PDF *p, double flatness) 270
void PDF_setlinejoin(PDF *p, int linejoin) 270
void PDF_setlinecap(PDF *p, int linecap) 270
void PDF_setmiterlimit(PDF *p, double miter) 271
void PDF_setlinewidth(PDF *p, double width) 271
void PDF_initgraphics(PDF *p) 272
void PDF_save(PDF *p) 272
void PDF_restore(PDF *p) 273
void PDF_translate(PDF *p, double tx, double ty) 273
void PDF_scale(PDF *p, double sx, double sy) 273
void PDF_rotate(PDF *p, double phi) 274
void PDF_skew(PDF *p, double alpha, double beta) 274
void PDF_concat(PDF *p, double a, double b, double c, double d, double e, double f) 274
void PDF_setmatrix(PDF *p, double a, double b, double c, double d, double e, double f) 275
int PDF_create_gstate(PDF *p, const char *optlist) 275
void PDF_set_gstate(PDF *p, int gstate) 276
void PDF_moveto(PDF *p, double x, double y) 277
void PDF_lineto(PDF *p, double x, double y) 277
void PDF_curveto(PDF *p, double x1, double y1, double x2, double y2, double x3, double y3) 278
void PDF_circle(PDF *p, double x, double y, double r) 278
void PDF_arc(PDF *p, double x, double y, double r, double alpha, double beta) 278
void PDF_arcn(PDF *p, double x, double y, double r, double alpha, double beta) 279
void PDF_rect(PDF *p, double x, double y, double width, double height) 279
void PDF_closepath(PDF *p) 280
void PDF_stroke(PDF *p) 280
Farbfunktionen
Funktionsprototyp Seite
void PDF_setcolor(PDF *p, const char *fstype, const char *colorspace, double c1, double c2, double c3, double c4)
286
int PDF_makespotcolor(PDF *p, const char *spotname, int reserved) 288
int PDF_load_iccprofile(PDF *p, const char *profilename, int len, const char *optlist) 288
int PDF_begin_pattern(PDF *p, double width, double height, double xstep, double ystep, int painttype) 290
void PDF_end_pattern(PDF *p) 291
int PDF_shading_pattern(PDF *p, int shading, const char *optlist) 291
void PDF_shfill(PDF *p, int shading) 292
int PDF_shading(PDF *p, const char *shtype, double x0, double y0, double x1, double y1, double c1, double c2,
double c3, double c4, const char *optlist) 292
Rasterbildfunktionen
Funktionsprototyp Seite
int PDF_load_image(PDF *p, const char *imagetype, const char *filename, int len, const char *optlist) 295
void PDF_close_image(PDF *p, int image) 299
void PDF_fit_image(PDF *p, int image, double x, double y, const char *optlist) 299
int PDF_begin_template(PDF *p, double width, double height) 302
void PDF_end_template(PDF *p) 302
void PDF_add_thumbnail(PDF *p, int image) 302
B PDFlib-Kurzreferenz 345
Funktionsprototyp Seite
void PDF_fit_pdi_page(PDF *p, int page, double x, double y, const char *optlist) 308
int PDF_process_pdi(PDF *p, int doc, int page, const char* optlist) 309
double PDF_get_pdi_value(PDF *p, const char *key, int doc, int page, int reserved) 309
const char * PDF_get_pdi_parameter(PDF *p, const char *key, int doc, int page, int reserved, int *len) 310
Blockfunktionen
Funktionsprototyp Seite
int PDF_fill_textblock(PDF *p, int page, const char *blockname, const char *text, int len, const char *optlist) 313
int PDF_fill_imageblock(PDF *p, int page, const char *blockname, int image, const char *optlist) 314
int PDF_fill_pdfblock(PDF *p, int page, const char *blockname, int contents, const char *optlist) 315
Hypertext-Funktionen
Funktionsprototyp Seite
int PDF_create_action(PDF *p, const char *type, const char *optlist) 317
void PDF_add_nameddest(PDF *p, const char *name, int len, const char *optlist) 321
void PDF_create_annotation(PDF *p, double llx, double lly, double urx, double ury, const char *type, const char
*optlist) 323
void PDF_create_field(PDF *p, double llx, double lly, double urx, double ury, const char *name, int len, const char
*type, const char *optlist) 327
void PDF_create_fieldgroup(PDF *p, const char *name, int len, const char *optlist) 332
int PDF_create_bookmark(PDF *p, const char *text, int len, const char *optlist) 332
void PDF_set_info(PDF *p, const char *key, const char *value) 334
B PDFlib-Kurzreferenz 347
C Änderungen an diesem Handbuch
Datum Änderungen
13. März 2006 > Deutsche Übersetzung des Handbuchs für PDFlib 6.0.3 mit kleineren Erweite-
rungen und Korrekturen und einem neuen Abschnitt über Ruby
14. September 2005 > Deutsche Übersetzung des Handbuchs für PDFlib 6.0.2 mit kleineren Erweite-
rungen und Korrekturen
19. November 2004 > Deutsche Übersetzung des Handbuchs für PDFlib 6.0.1 mit kleineren Erweiterun-
gen und Korrekturen
> sprachabhängige Funktionsprototypen in Kapitel 8
> Beispiele für Hypertext-Erstellung in Kapitel 3
19. August 2004 > Deutsche Übersetzung des Handbuchs für PDFlib 6.0.0
18. Juni 2004 > Erweiterungen für PDFlib 6
6. Oktober 2003 > Deutsche Übersetzung des Handbuchs für PDFlib 5.0.2
15. September 2003 > Kleinere Änderungen für PDFlib 5.0.2, Ergänzung der Blockspezifikation
30. Mai 2003 > Deutsche Übersetzung des Handbuchs für PDFlib 5.0.1
6. August 2002 > Deutsche Übersetzung des Handbuchs für PDFlib 4.0.3, Ergänzungen für .NET
14. Juni 2002 > Kleinere Änderungen für PDFlib 4.0.3 und Erweiterungen für die .NET-Bindung
26. Januar 2002 > Kleinere Änderungen für PDFlib 4.0.2 und Erweiterungen für die IBM-eServer-
Edition
17. Mai 2001 > Kleinere Änderungen für PDFlib 4.0.1
1. April 2001 > Dokumentiert PDI- und andere Funktionen von PDFlib 4.0.0
5. Februar 2001 > Dokumentiert Template- und CMYK-Funktionen in PDFlib 3.5.0
22. Dezember 2000 > ColdFusion-Dokumentation und Erweiterungen für PDFlib 3.03; separate
ActiveX-Edition des Handbuchs
8. August 2000 > Delphi-Dokumentation und kleinere Erweiterungen für PDFlib 3.02
1. Juli 2000 > Erweiterungen und Klarstellungen für PDFlib 3.01
20. Februar 2000 > Änderungen für PDFlib 3.0
2. August 1999 > Kleinere Änderungen und Erweiterungen für PDFlib 2.01
29. Juni 1999 > Eigene Abschnitte für die jeweiligen Sprachbindungen
> Erweiterungen für PDFlib 2.0
1. Februar 1999 > Kleinere Änderungen für PDFlib 1.0 (keine öffentliche Freigabe)
10. August 1998 > Erweiterungen für PDFlib 0.7 (nur für einen Kunden)
8. Juli 1998 > Erste Beschreibung der PDFlib-Skriptunterstützung in PDFlib 0.6
25. Februar 1998 > Kleine Erweiterungen am Handbuch für PDFlib 0.5
22. September 1997 > Erste öffentliche Version von PDFlib 0.4 und dieses Handbuchs
Index 349
Demostempel 9 font-Parameter 242
descender-Parameter 115, 242 FontPFM-Parameter 242
Deskriptor 95 Fonts
Dokumentfunktionen 225 AFM-Dateien 88
Dokumentinfofelder 106, 334 allgemein 83
Downsampling 148 äquidistante 116
dpi-Berechnungen 148 asiatisches Fontpaket 120
Drehen von Objekten 63 benutzerdefinierte (Type 3) 91
Druckausgabebedingung für PDF/X 202 CID-Schriften 120
Dublin Core 334 Deskriptor 95
Glyphennamen 89
E PDF-Standardschriften 94
PFA-Dateien 88
EBCDIC 60 PFB-Dateien 88
ebcdicutf8: siehe hypertextformat PFM-Dateien 88
ebcdic-Zeichensatz 99 PostScript 83, 88
Einheiten 62 rechtliche Aspekte der Einbettung 96
EJB (Enterprise Java Beans) 34 Ressourcekonfiguration 56
Embedded-Systeme 21 Type 1 88
Encoding Type 3 (benutzerdefiniert) 91, 246
siehe Zeichensatz Unicode-Unterstützung 105
Encoding-Parameter 242 fontsize-Parameter 242
eServer zSeries und iSeries 60 FontSpecific-Encoding 102
EUDC (end-user defined characters) 126 Fontstilnamen für Windows 90
EUDC-Fonts 90 fontstyle-Parameter 242
Eurozeichen 103 fontwarning-Parameter 54, 242
Exceptions 52, 65 Form XObjects 67
explizite Transparenz 151 Formularfelder: Konvertierung in Blöcke 176
expliziter Grafikzustand 275 Funktionalität von PDFlib 17
extend0- und extend1-Optionen 293 Funktionsgeltungsbereich 51
F G
Farbe 69 Gaiji-Zeichen 84
Farbfunktionen 286 GBK 125
Farbverläufe 70 Geltungsbereich 51
Farbwerte in Optionslisten 220 GIF 149
FDFlib Virtual File System (PVF) 55 Glyph-ID-Adressierung 103
Fehlerbehandlung glyphwarning-Parameter 249
API 224 Gradients 70
in C 28 Grafikfunktionen 269
in C++ 31 Grafikzustand
in Cobol 22 expliziter 275
in Java 35 Funktionen 269
in Perl 37 grid.pdf 62
in PHP 40 gstate 291
in Python 41
in RPG 44
in Tcl 49 H
filename-Parameter 311 HKS 72
Filling (Füllen) 66 Hochstellen von Text 116
fillrule-Parameter 280 honoriccprofile-Parameter 294
flatness-Option 275 horizontaler Text 121, 122
FontAFM-Parameter 242 horizscaling-Parameter 249
fontencoding-Parameter 242 host fonts 87
fontmaxcode-Parameter 103, 242 HostFont-Parameter 242
Fontmetrik 115 host-Zeichensatz 98
fontname-Parameter 242 hypertextencoding-Parameter 110, 317
FontOutline-Parameter 242 hypertextformat-Parameter 109, 317
350 Index
Hypertext-Funktionen 317 licensefile-Parameter 222
Hypertext-Strings 107 license-Parameter 222
in nicht Unicode-fähigen Sprachen 108 linearisiertes PDF 200, 227
linecap-Option 275
I linejoin-Option 275
linewidth-Option 275
IBM eServer 60
ICC-based color 69 Listenwerte in Optionslisten 220
icccomponents-Parameter 290 Literaturhinweise 341
ICCProfile-Parameter 290 Lizenzierung von PDFlib und PDI 9
iccwarning-Parameter 290 LWFN (LaserWriter Font) 88
ignoremask 153
image:iccprofile-Parameter 75, 294 M
imagewarning-Parameter 294
Mac OS Classic: UPR-Konfiguration 57
imagewidth- und imageheight-Parameter 294
implizite Transparenz 151 macroman encoding 98
Importfunktionen für PDF 304 macroman_apple-Zeichensatz 99, 103
in-core PDF-Erzeugung 59 macroman-Zeichensatz 98, 99
Index-Farbe 69 major-Parameter 222
Info-Schlüssel in importierten PDF-Dokumenten makepsres Hilfsprogramm 56
311 mask 152
Inline-Optionslisten für Textflüsse 263 masked 152
iSeries 60 Maskierung von Bildern 151
ISO 10646 105 masterpassword-Parameter 198, 226
ISO 8859-2 bis -15 99 MediaBox 65
italicangle-Parameter 249 mehrseitige Bilddateien 154
Metadaten 231, 334
J Metrik 115
japanisch 120, 122, 125 metrische Koordinaten 62
Java-Applikationsserver 33 Millimeter 62
Java-Sprachbindung 32 minor-Parameter 222
EJB 34 miterlimit-Option 276
javadoc 33 monospace parameter 242
Package 33 monospaced: siehe äquidistant
Servlet 33
JFIF 149
Johab 125
N
JPEG 149 Name-Strings 107
JPEG2000 149 in nicht Unicode-fähigen Sprachen 109
.NET-Sprachbindung 35
nodemostamp-Parameter 222
K None (Schmuckfarbname) 288
Kachelung 69 N-Option 293
Kategorien von Ressourcen 56 Notizen 106
Kennwörter 197
Kerning 116
kerning-Parameter 117, 249 O
Keywords-Feld 335 Oberlänge 115
kommerzielle Lizenz 11 opacityfill-Option 276
Koordinatensystem 62 opacitystroke-Option 276
metrisch 62 openwarning-Parameter 225
Top-Down 63 optimiertes PDF 200
koreanisch 120, 123, 125
Optionslisten 218
orientation-Parameter 294
L overline-Parameter 118, 250
Laufweite 116 overprintfill-Option 276
Layer und PDI 157 overprintmode-Option 276
leading-Parameter 115, 249 overprintstroke-Option 276
Index 351
P PDF_fill_pdfblock() 315
PDF_fill_stroke() 281
page-Option 154 PDF_fill_textblock() 313
pagewidth- und pageheight-Parameter 225 PDF_fit_image() 299
PANTONE 71 PDF_fit_pdi_page 308
Parameterbehandlungsfunktionen 236 PDF_fit_text() 253
Passwörter 197 PDF_fit_textflow() 259
Pattern-Farbraum 69 PDF_get_apiname() 240
patterns 69
PDF_get_buffer() 60, 229
PDF/X 201
PDF_get_errmsg() 239
Druckausgabebedingung 309
PDF_get_errnum() 239
Import von PDF-Dokumenten 205
PDF_get_opaque() 240
PDF_activate_item() 340
PDF_get_parameter() 237
PDF_add_nameddest() 321
PDF_get_pdi_parameter 310
PDF_add_thumbnail() 302
PDF_get_pdi_value 309
PDF_arc() 278
PDF_get_value() 236
PDF_arcn() 279
PDF_info_textflow() 262
PDF_begin_document() 226
PDF_initgraphics() 272
PDF_begin_item() 338
PDF_lineto() 277
PDF_begin_layer() 284
PDF_load_font() 243
PDF_begin_page() 232, 233, 235, 236
PDF_load_iccprofile() 288
PDF_begin_pattern 290
PDF_load_image() 295
PDF_begin_template() 302
PDF_makespotcolor() 288
PDF_boot() 223
PDF_moveto() 277
PDF_circle() 278
PDF_new() 223
PDF_clip() 281
PDF_close_image() 299 PDF_new_dl( ) 223
PDF_close_pdi 306 PDF_new2() 224
PDF_close_pdi_page 308 PDF_open_pdi 304
PDF_closepath() 280 PDF_open_pdi_callback 305
PDF_closepath_fill_stroke() 281 PDF_open_pdi_page 306
PDF_closepath_stroke() 280 PDF_process_pdi 309
PDF_concat() 274 PDF_rect() 279
PDF_continue_text() 252 PDF_restore() 273
PDF_continue_text2() 252 PDF_rotate() 274
PDF_create_action() 317 PDF_save() 272
PDF_create_annotation() 323 PDF_scale() 273
PDF_create_bookmark() 332 PDF_set_gstate() 276
PDF_create_field() 327 PDF_set_info() 334
PDF_create_fieldgroup() 332 PDF_set_info2() 334
PDF_create_gstate() 275 PDF_set_layer_dependency() 283
PDF_create_pvf 237 PDF_set_parameter() 59, 237
PDF_create_textflow() 258 PDF_set_text_pos() 251
PDF_curveto() 278 PDF_set_value() 236
PDF_define_layer() 282 PDF_setcolor() 286
PDF_delete() 225 PDF_setdash() 269
PDF_delete_dl( ) 225 PDF_setdashpattern() 269
PDF_delete_pvf 238 PDF_setflat() 270
PDF_delete_textflow() 262 PDF_setfont() 246, 247, 248
PDF_encoding_set_char() 248 PDF_setlinecap() 270
PDF_end_document() 228 PDF_setlinejoin() 270
PDF_end_item() 340 PDF_setlinewidth() 271
PDF_end_layer() 285 PDF_setmatrix() 275
PDF_end_page() 236 PDF_setmiterlimit() 271
PDF_end_pattern 291 PDF_shading() 292
PDF_end_template() 302 PDF_shading_pattern() 291
PDF_endpath() 282 PDF_shfill() 292
PDF_fill() 281 PDF_show() 251
PDF_fill_imageblock() 314 PDF_show_boxed() 257
352 Index
PDF_show_xy() 252
PDF_show_xy2() 252
R
PDF_show2() 251 r0- und r1-Optionen 293
PDF_shutdown() 223 Rasterbilder
PDF_skew() 274 allgemein 147
PDF_stringwidth() 257 Bildmasken 152
PDF_stringwidth2() 257 Daten wiederverwenden 147
PDF_stroke() 280 Downsampling 148
Formate 148
PDF_translate() 273
Funktionen 294
PDF_utf16_to_utf8 241
Rohdaten 151
PDF_utf8_to_utf16() 241
skalieren 148
PDF_xshow() 251
Transparenz 151
PDF-Importbibliothek PDI 155, 304
REALbasic-Sprachbindung 42
PDF-Importfunktionen 304
Rechtecke in Optionslisten 220
PDFlib
Reflexion 273
Funktionalität 17
renderingintent-Option 73, 276
Programmstruktur 51
renderingintent-Parameter 294
PDFlib Personalization Server 165
Rendering-Intents 73
pdflib.upr 59
resourcefile-Parameter 59, 222
PDFlib-API-Referenz 217
Ressourcekategorie 56
PDFlib-Plugin zur Blockerzeugung 165
Ressourcenkonfiguration 56
PDFLIBRESOURCE-Umgebungsvariable 59
resx- und resy-Parameter 294
pdfx-Parameter
revision-Parameter 222
für PDI 205, 311
RGB-Farbe 69
PDI 155, 304 Rohbilddaten 151
pdi-Parameter 311 Rotate-Eintrag in importierten PDF-Seiten 310
pdiusebox-Parameter 157, 311 RPG-Sprachbindung 42
pdiwarning-Option 157 Ruby-Sprachbindung 46
pdiwarning-Parameter 311
Perl-Sprachbindung 35
permissions-Option 199 S
permissions-Parameter 226 S/390 60
PFA (Printer Font ASCII) 88 Scherung 274
Pfad 66 Schmuckfarbe (Separation-Farbraum) 69, 70
zeichnen und beschneiden 280 schnelle Web-Anzeige 227
PFB (Printer Font Binary) 88 Schriften: siehe Fonts
PFM (Printer Font Metrics) 88 Schriftuntergruppen 96
PHP-Sprachbindung 37 scope-Parameter 223
Piktogramme 302 SearchPath-Parameter 58, 222, 242
Plattformen 21 Seitenbeschreibungen 62
Plugin zur Blockerzeugung 165 Seitenformate 64
PNG 148, 151 Begrenzungen in Acrobat 65
Portable Document Format Reference Manual 341 Seitenfunktionen 225
PostScript-Schriften 83, 88 seitenweises Herunterladen 200
PPS (PDFlib Personalization Server) 165 Separation-Farbraum 69
prefix-Parameter 222 serial-Parameter 9
preserveoldpantonenames-Parameter 286 Servlet 33
print_glyphs.ps 89 setcolor:iccprofilegray/rgb/cmyk-Parameter 76,
Printer Font ASCII (PFA) 88 290
Printer Font Binary (PFB) 88 Setup-Funktionen 222
Printer Font Metrics (PFM) 88 Shift-JIS 125
Programmstruktur 51 Sicherheit 197
PVF siehe PDFlib Virtual File System 55 Skalieren von Rasterbildern 148
Python-Sprachbindung 41 Smooth Shadings 70
smoothness-Option 276
Speicher: Erzeugung von PDF-Dokumenten im 59
Q Speicherverwaltung
Querformat 234 API 224
Index 353
in C 29 Thumbnails: siehe Piktogramme
in C++ 32 Tiefstellen von Text 116
Spiegelung 273 TIFF 149
SPIFF 149 mehrseitig 154
spotcolorlookup-Parameter 286 Title-Feld 335
Sprachbindungen 21 Top-Down-Koordinaten 63
sRGB-Farbraum 75 topdown-Parameter 64, 225
Standardausgabe 226 ToUnicode CMap 86, 106
Standard-Druckausgabebedingungen für PDF/X trace, tracefile, tracemsg parameters 223
204 Transparenz 151
Standardkoordinatensystem 62 explizite 151
StandardOutputIntent-Parameter 290 implizite 151
Standardschriften 94 Probleme mit 153
Standardseitenmaße 65 Trapped-Feld 335
stdout-Kanal 226 TrimBox 65, 226, 310, 311
Stilnamen für Windows 90 TrueType Collections 124
strikeout-Parameter 118, 250 TTC (TrueType Collection) 90, 124, 126
strokeadjust-Option 276 TTF (TrueType-Font) 83
Stroking (Zeichnen) 66 Type-1-Schriften 88
Struktur von PDFlib-Programmen 51 Type-3-Schriften 91, 246
Subject-Feld 335
subscript 116, 250
subsetlimit-Parameter 97, 242
U
subsetminsize-Parameter 97, 242 U+XXXX-Encoding 105
superscript 116, 250 Überschreiben von Blockeigenschaften 168
Symbolschrift 102 UHC 125
Systemschriften 87 Umgebungsvariable PDFLIBRESOURCE 59
Systemzeichensätze 100 Umrisslinien von Text zeichnen 250
underline-Parameter 118, 250
underlineposition-Parameter 250
T underlinewidth-Parameter 250
Tcl-Sprachbindung 48 Unicode 105
Teilpfad 66 unicodemap-Parameter 106, 243
Templates 67 unsichtbarer Text 250
Text Untergruppen einer Schrift 96
Funktionen 242 Unterlänge 115
hochstellen 116 Unterschneidung 116
Laufweite 116 UPR (Unix PostScript Resource) 56
Oberlänge 115 Dateiformat 57
Position 115 Dateisuche 59
tiefstellen 116 user space 62
Umrisslinien zeichnen 250 usercoordinates-Parameter 62, 317
unsichtbarer 250 userpassword-Parameter 198, 226
Unterlänge 115 utf16: siehe hypertextformat
unterschneiden 116 utf16be: siehe hypertextformat
Versalhöhe 115 utf16le: siehe hypertextformat
vertikal und horizontal 121, 122 utf8: siehe hypertextformat
x-Höhe 115
Zeilenabstand 115
Textanmerkungen 106 V
Textbehandlung 83 Variable Data Processing (VDP) 313
Textfluss:Inline-Optionslisten 263 variable Datenverarbeitung mit Blöcken 165
textformat-Parameter 109, 250 vdp/blockcount-Parameter für PDI 312
textknockout-Option 276 vdp/Block-Parameter für PDI 312
Textmetrik 115 Verfügbarkeit von PDFlib 21
textrendering-Parameter 118, 250 Versalhöhe 115
textrise-Parameter 250 Verschlüsselung 197
Textvarianten 115 version-Parameter 223, 311
textx- und texty-Parameter 115, 123, 250 vertikaler Text 121, 122
354 Index
virtuelles Dateisystem 55 XObjects 67
W Z
warning-Parameter 53, 239 ZapfDingbats-Schrift 102
web-optimiertes PDF 200, 227 Zeichennamen 89
width- und height-Parameter 310 Zeichensätze 98
winansi-Zeichensatz 99 benutzerdefinierte 100
wordspacing-Parameter 250 CJK 123
für Hypertext 110
X vom System beziehen 100
xheight-Parameter 115 Zeilenabstand 115
x-Höhe 115 Zoll 62
XMP-Metadaten 231 zSeries 60
Index 355