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: [email protected]
Support für Inhaber einer kommerziellen PDFlib-Lizenz: [email protected] (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, Windows und Windows NT sind Warenzeichen von Microsoft Corporation. Apple, Macintosh
und TrueType sind Warenzeichen von Apple Computer, Inc. Unicode und das Unicode-Logo sind Warenzei-
chen 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 Waren-
zeichen 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.
1 Einführung 11
1.1 Programmierung mit PDFlib 11
1.2 Die wichtigsten neuen Funktionen von PDFlib 6 13
1.3 Funktionalität von PDFlib 15
1.4 Verfügbarkeit der Funktionen in den Produkten 17
Inhaltsverzeichnis 3
2.9.3 Fehlerbehandlung in PHP 38
2.10 Python-Sprachbindung 38
2.10.1 Installation der Python-Edition von PDFlib 38
2.10.2 Das Beispiel »Hello world« in Python 39
2.10.3 Fehlerbehandlung in Python 39
2.11 REALbasic-Sprachbindung 39
2.12 RPG-Sprachbindung 40
2.12.1 Kompilieren und Binden von RPG-Programmen für PDFlib 40
2.12.2 Das Beispiel »Hello world« in RPG 40
2.12.3 Fehlerbehandlung in RPG 42
2.13 Tcl-Sprachbindung 44
2.13.1 Installation der PDFlib-Tcl-Edition 44
2.13.2 Das Beispiel »Hello world« in Tcl 44
2.13.3 Fehlerbehandlung in Tcl 45
3 PDFlib-Programmierung 47
3.1 Allgemeine Aspekte 47
3.1.1 PDFlib-Programmstruktur und Geltungsbereich von Funktionen 47
3.1.2 Parameter 47
3.1.3 Behandlung von Ausnahmen (Exceptions) 48
3.1.4 Optionslisten 51
3.1.5 Das PDFlib Virtual File System (PVF) 53
3.1.6 Ressourcenkonfiguration und Dateisuche 54
3.1.7 Erzeugen von PDF-Dokumenten im Arbeitsspeicher 58
3.1.8 Einsatz von PDFlib auf EBCDIC-Systemen 59
3.1.9 Unterstützung für große Dateien 59
3.2 Seitenbeschreibungen 61
3.2.1 Koordinatensysteme 61
3.2.2 Höchstwerte für Seiten und Koordinaten 63
3.2.3 Pfade 65
3.2.4 Templates 65
3.3 Farbe 67
3.3.1 Farben und Farbräume 67
3.3.2 Füllmuster und Farbverläufe 67
3.3.3 Schmuckfarben 68
3.3.4 Colormanagement und ICC-Profile 71
3.4 Hypertext-Elemente 75
3.4.1 Beispiele zur Erstellung von Hypertext-Elementen 75
3.4.2 Formatierungsoptionen für Textfelder 78
4 Textausgabe 81
4.1 Übersicht über Schriften und Zeichensätze 81
4.1.1 Unterstützte Fontformate 81
4.1.2 Zeichensätze 82
4 Inhaltsverzeichnis
4.1.3 Unicode-Unterstützung 83
4.2 Fontformate im Detail 85
4.2.1 PostScript-Fonts 85
4.2.2 TrueType- und OpenType-Fonts 86
4.2.3 Benutzerdefinierte Schriften (Type-3-Fonts) 88
4.3 Schrifteinbettung und Schriftuntergruppen 90
4.3.1 Wie PDFlib nach Fonts sucht 90
4.3.2 Schrifteinbettung 91
4.3.3 Bildung von Fontuntergruppen (Subsetting) 93
4.4 Zeichensätze 95
4.4.1 8-Bit-Zeichensätze 95
4.4.2 Symbolschriften und fontspezifische Zeichensätze 99
4.4.3 Glyph-ID-Adressierung für TrueType- und OpenType-Fonts 100
4.4.4 Das Eurozeichen 100
4.5 Unicode-Unterstützung 102
4.5.1 Unicode für Seitenbeschreibungen und Hypertext 102
4.5.2 Content-Strings, Hypertext-Strings und Name-Strings 103
4.5.3 Stringbehandlung in Unicode-fähigen Sprachen 104
4.5.4 String-Behandlung in nicht Unicode-fähigen Sprachen 105
4.5.5 Character-Referenzen 108
4.5.6 Unicode-kompatible Fonts 110
4.6 Textmetrik und Textvarianten 112
4.6.1 Font- und Zeichenmetriken 112
4.6.2 Kerning 113
4.6.3 Textvarianten 114
4.7 Chinesischer, japanischer und koreanischer Text 116
4.7.1 CJK-Unterstützung in Acrobat und PDF 116
4.7.2 Standard-CJK-Fonts und -CMaps 117
4.7.3 Benutzerspezifische CJK-Fonts 120
4.7.4 Erzwingen äquidistanter Schrift 122
4.8 Platzieren und Einpassen von einzeiligem Text 124
4.8.1 Einfaches Platzieren von Text 124
4.8.2 Platzieren von Text in einer Box 125
4.8.3 Ausrichten von Text 126
4.9 Mehrzeilige Textflüsse 127
4.9.1 Platzierung eines Textflusses in der Fitbox 128
4.9.2 Optionen für die Absatzformatierung 129
4.9.3 Inline-Optionen und Makros 130
4.9.4 Tabulatoren 133
4.9.5 Nummerierte Listen 133
4.9.6 Steuerzeichen, Zeichenersetzung und Symbolfonts 135
4.9.7 Steuerung des Algorithmus für den Zeilenumbruch 137
4.9.8 Formatierung von CJK-Text in Textflüssen 141
Inhaltsverzeichnis 5
5 Import und Platzierung von Objekten 143
5.1 Import von Rasterbildern 143
5.1.1 Grundlegende Vorgehensweise 143
5.1.2 Unterstützte Rasterbildformate 144
5.1.3 Bildmasken und Transparenz 146
5.1.4 Einfärben von Bildern 149
5.1.5 Mehrseitige Bilddateien 149
5.1.6 OPI-Unterstützung 150
5.2 Import von PDF-Seiten mit PDI (PDF Import Library) 151
5.2.1 PDI-Funktionen und -Anwendungen 151
5.2.2 Einsatz von PDI-Funktionen mit PDFlib 151
5.2.3 Importierbare PDF-Dokumente 153
5.3 Platzieren von Bildern und importierten PDF-Seiten 155
5.3.1 Skalierung, Ausrichtung und Drehung 155
5.3.2 Anpassen der Seitengröße 157
7 Erstellung verschiedener
PDF-Varianten 189
7.1 Acrobat und PDF-Versionen 189
7.2 Verschlüsseltes PDF 191
7.2.1 Stärken und Schwächen der Sicherheitsfunktionen von PDF 191
6 Inhaltsverzeichnis
7.2.2 Schützen von Dokumenten mit PDFlib 192
7.3 Web-Optimiertes (Linearisiertes) PDF 194
7.4 PDF/X 195
7.4.1 PDF/X-Standards 195
7.4.2 Erzeugung PDF/X-kompatibler Ausgabe 196
7.4.3 Import von PDF/X-Dokumenten mit PDI 198
7.5 Tagged PDF 200
7.5.1 Erzeugung von Tagged PDF mit PDFlib 200
7.5.2 Erzeugung von Tagged-PDF-Textausgabe und -Textflüssen 202
7.5.3 Aktivierung von Elementen für komplexe Layouts 203
7.5.4 Verwendung von Tagged PDF in Acrobat 206
Inhaltsverzeichnis 7
8.7.2 Weitere Funktionen zur PDI-Verarbeitung 294
8.7.3 Parameterbehandlung 294
8.8 Blockfunktionen (PPS) 298
8.9 Hypertext-Funktionen 302
8.9.1 Aktionen 302
8.9.2 Benannte Ziele 306
8.9.3 Anmerkungen 308
8.9.4 Formularfelder 312
8.9.5 Lesezeichen 318
8.9.6 Dokumentinfofelder 319
8.9.7 Veraltete Hypertext-Parameter und Funktionen 320
8.10 Strukturfunktionen für Tagged PDF 323
A Literaturhinweise 327
B PDFlib-Kurzreferenz 329
Index 335
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 [email protected] senden und einen temporären Lizenzschlüssel anfordern (wir behal-
ten uns das Recht vor, einer Anforderung nicht nachzukommen, z.B. bei anonymen An-
fragen).
Nachdem Sie einen Lizenzschlüssel erworben haben, müssen Sie ihn anwenden, da-
mit der Demostempel auch tatsächlich unterdrückt wird. Dazu gibt es mehrere Mög-
lichkeiten:
> Fügen Sie in Ihrem Skript oder Programm eine Zeile ein, die die Seriennummer zur
Laufzeit setzt:
PDF_set_parameter(p, "license", "...Ihre Seriennummer...");
Der Parameter license darf nur einmal gesetzt werden, und dies muss unmittelbar
nach der Instantiierung des PDFlib-Objekts erfolgen (das heißt nach PDF_new( ) oder
einem entsprechenden Aufruf).
> Tragen Sie den 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.1 ...Ihr Lizenzschlüssel...
Sie können auch mehrere Lizenzschlüssel für verschiedene Produkte der PDFlib
GmbH in die Lizenzdatei aufnehmen, wobei jeder dann 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 un-
mittelbar nach der Instantiierung des PDFlib-Objekts (das heißt, nach PDF_new( )
oder einem gleichbedeutenden Aufruf) wie folgt:
PDF_set_parameter(p, "licensefile", "/path/to/license/file");
oder Sie setzen die Umgebungsvariable PDFLIBLICENSEFILE mit einem Befehl der fol-
genden Art:
export PDFLIBLICENSEFILE=/path/to/license/file
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.
9
Zusammenstellen mehrerer CPU-Schlüssel. Wenn Sie mehrere CPU-Lizenzen in ver-
schiedenen statt einer einzigen Bestellung erworben haben, können Sie sie in der Li-
zenzdatei zusammenstellen, indem Sie sie nacheinander dort eintragen. Auch die Funk-
tion PDF_set_parameter( ) kann für mehrere Lizenzschlüssel mehrmals aufgerufen
werden. In der Windows-Registry lassen sich die Lizenzschlüssel nicht sammeln.
Damit werden alle deaktivierten Funktionen wieder aktiviert, und der Demostempel er-
scheint wieder auf allen Seiten.
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)
> 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.
12 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.
14 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 und CCITT
automatische Erkennung von Rasterbilddateiformaten
transparente (maskierte) Bilder und Transparenzmasken
Bildmasken (eingefärbte Bilder)
16 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 – 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
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
18 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 19
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 vorliegenen 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.
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
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.3 COM-Sprachbindung
(Dieser Abschnitt ist nur in der COM/.NET/REALbasic-Ausgabe des PDFlib-Referenz-
handbuchs enthalten.)
2.3 COM-Sprachbindung 23
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 25).
#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_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;
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);
}
2.4 C-Sprachbindung 25
PDFlib->PDF_set_info(p, "Creator", "hello.c");
PDFlib->PDF_set_info(p, "Author", "Thomas Merz");
PDFlib->PDF_set_info(p, "Title", "Hello, world (C DLL)!");
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)
{
printf("PDFlib-Exception im hello Beispiel:\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);
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:
> 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.4 C-Sprachbindung 27
übergeben. Lediglich beim ersten Aufruf der Allozierungsroutine wird ein NULL-Zeiger
als PDF-Argument übergeben. Client-spezifische Allozierungsroutinen müssen daher
mit einem NULL-Zeiger umgehen können.
Mit der Funktion PDF_get_opaque( ) erhält man vom PDFlib-Objekt einen Zeiger auf
Benutzerdaten, sofern dieser vom Client zuvor im Aufruf von PDF_new2( ) übergeben
wurde. Ein solcher Zeiger kann in multi-threaded Anwendungen nützlich sein, um
thread- oder klassenspezifische Daten innerhalb des PDFlib-Objekts aufzubewahren
und dann in Speicherverwaltungs- oder Fehlerbehandlungsroutinen zu verwenden.
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 {
int font;
PDFlib p;
p.set_info("Creator", "hello.cpp");
p.set_info("Author", "Thomas Merz");
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 29
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!
Das PDFlib-Java-Paket. PDFlib ist in einem Java-Package mit dem folgenden Package-
Namen enthalten:
com.pdflib.pdflib
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-
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.
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.
2.6 Java-Sprachbindung 31
2.6.2 Das Beispiel »Hello world« in Java
import java.io.*;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
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();
}
}
}
}
...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 33
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, "");
};
if ($@) {
printf("hello: PDFlib Exception occurred:\n");
printf(" $@\n");
exit;
}
1. Siehe www.activestate.com
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 auf der PDFlib-Web-Site.
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 die Stan-
dardsystemverzeichnisse durchsucht. Mit dem folgenden einzeiligen PHP-Skript
können Sie ermitteln, welche Version der PDFlib-Sprachbindung für PHP Sie instal-
liert 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:
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.
1. Siehe www.php.net
2.9 PHP-Sprachbindung 35
> 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.
Behandlung von Dateinamen in PHP. Nicht qualifizierte Dateinamen (also solche ohne
jede Pfadangabe) sowie relative Dateinamen für PDF-, Rasterbild-, Font- und andere Da-
teien auf dem Laufwerk werden in der Unix- und der Windows-Version von PHP unter-
schiedlich behandelt:
> Auf Unix-Systemen sucht PHP Dateien ohne Pfadangabe in dem Verzeichnis, in dem
sich das Skript befindet.
> Unter Windows sucht PHP Dateien ohne Pfadangabe nur in dem Verzeichnis, in dem
sich die PHP-DLL befindet.
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.6, »Ressourcenkonfiguration und Dateisuche«, Seite 54).
/* 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, "");
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");
}
catch (Exception $e) {
die($e);
}
2.9 PHP-Sprachbindung 37
$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.
2.10 Python-Sprachbindung
2.10.1 Installation der Python-Edition von PDFlib
Der Erweiterungsmechanismus von Python1 lädt dynamische Bibliotheken zur Laufzeit.
Damit die PDFlib-Sprachbindung funktioniert, benötigt der Python-Interpreter Zugriff
auf den PDFlib-Python-Wrapper.
1. Siehe www.python.org
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)
2.11 REALbasic-Sprachbindung1
(Dieser Abschnitt ist nur in der COM/.NET/REALbasic-Ausgabe des PDFlib-Referenz-
handbuchs enthalten.)
1. Siehe www.realbasic.com
2.11 REALbasic-Sprachbindung 39
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:
CRTBNDRPG PGM(PDFLIB/HELLO) SRCFILE(PDFLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO)
BNDDIR(PDFLIB/PDFLIB)
2.12 RPG-Sprachbindung 41
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
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.12 RPG-Sprachbindung 43
2.13 Tcl-Sprachbindung
2.13.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.13 Tcl-Sprachbindung 45
46 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
48 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 26).
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 Funk-
tionen 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 re-
agieren 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 */
50 Kapitel 3: PDFlib-Programmierung
/* Anderen Font probieren oder aufgeben */
...
}
/* Font-Handle ist gültig; weiter wie üblich */
3.1.4 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
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-
stimmte Wertebereiche beschränkt; Handles gelten nur für den entsprechenden Ob-
jekttyp etc. Wenn Optionen besonderen Bedingungen unterliegen, so wird dies in der
jeweiligen Beschreibung in Kapitel 8 erwähnt. Beispiele für einfache Werte sind (die ers-
te Zeile zeigt einen Passwort-String mit einem Leerzeichen):
PDF_open_pdi( ): password {secret string}
PDF_create_gstate( ): linewidth 0.5 blendmode overlay opacityfill 0.75
PDF_load_font( ): embedding=true subsetting=true subsetlimit=50 kerning=false
PDF_load_font( ): embedding subsetting subsetlimit=50 nokerning
PDF_create_textflow( ) leading=150%
PDF_create_textflow( ) charmapping={ 0x0A 0x20 }
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}
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}
Farbwerte. Farbwerte sind Listen, 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 Abschnitt 8.5.1,
»Festlegen von Farbe und Farbraum«, Seite 272), ), mögliche Werte werden in Abschnitt
3.3.1, »Farben und Farbräume«, Seite 67, 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.
52 Kapitel 3: PDFlib-Programmierung
> Das Farbraum-Schlüsselwort spot kann mit einem Schmuckfarben-Handle angege-
ben werden. Alternativ dazu kann das Farbraum-Schlüsselwort spotname mit einem
Schmuckfarbnamen und einem Float-Wert für den Farbauftrag angegeben werden.
> Die Farbraum-Schlüsselwörter iccbasedgray, iccbasedrgb und iccbasedcmyk können
mit einem, drei oder vier Float-Werten angegeben werden.
> Das Farbraum-Schlüsselwort none kann angegeben werden, um festzulegen, dass
keine Farbe vorhanden ist.
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 }
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.
54 Kapitel 3: PDFlib-Programmierung
PostScript-Installationen auch andere Ressourcenkategorien vorkommen, diese werden
aber kommentarlos ignoriert.
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 Textedior 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 Abschnitt, der alle Ressourcenkategorien auflistet, die in der Datei beschrieben
werden. Jede Zeile beschreibt eine Kategorie. Die Liste wird mit einem Punkt abge-
schlossen. Die verfügbaren Ressourcenkategorien werden unten beschrieben.
> 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.
Dieser Eintrag kann eine Liste von Pfadnamen enthalten, die durch Strichpunkte ’;’ ge-
trennt sind.
Auf den Systemen IBM iSeries wird die Ressourcenkategorie SearchPath mit folgenden
Werten initialisiert:
/pdflib/6.0.1/fonts
/pdflib/6.0.1/bind/data
UPR-Beispieldatei. Das folgende Listing zeigt ein Beispiel für eine UPR-Konfigurati-
onsdatei für PDFlib. Darin werden die Font- und Metrikdateien einiger Schriften sowie
ein benutzerdefinierter Zeichensatz beschrieben:
PS-Resources-1.0
SearchPath
FontAFM
FontPFM
FontOutline
Encoding
ICCProfile
.
SearchPath
/usr/local/lib/fonts
Classic:Data:Fonts
C:/psfonts/pfm
C:/psfonts
56 Kapitel 3: PDFlib-Programmierung
/users/kurt/my_images
.
FontAFM
Code-128=Code_128.afm
.
FontPFM
Foobar-Bold=foobb___.pfm
Mistral=c:/psfonts/pfm/mist____.pfm
.
FontOutline
Code-128=Code_128.pfa
ArialMT=Arial.ttf
.
Encoding
myencoding=myencoding.enc
.
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.1\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.
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.
58 Kapitel 3: PDFlib-Programmierung
und welcher Puffergröße die PDF-Daten von der Bibliothek zum Client übertragen wer-
den. Abhängig von der jeweiligen Umgebung mag es von Vorteil sein, das PDF-Doku-
ment auf einmal, in mehreren Stücken oder in vielen kleinen Abschnitten abzuholen,
damit PDFlib den internen Dokumentpuffer nicht vergrößern muss. Die gewünschte
Flushing-Strategie kann mit der Option flush für PDF_open_document_callback( )) einge-
stellt werden.
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.
60 Kapitel 3: PDFlib-Programmierung
3.2 Seitenbeschreibungen
3.2.1 Koordinatensysteme
PDFlib arbeitet mit dem Standardkoordinatensystem von PDF, das seinen Ursprung in
der linken unteren Ecke der Seite hat und auf der Einheit Punkt basiert:
1 pt = 1/72 Zoll = 2,54/72 cm = 0,3528 mm
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.
3.2 Seitenbeschreibungen 61
PDFlib-Entwicklung können Sie sich die Seite mit dem für Sie interessanten Format auf
eine durchsichtige Folie ausdrucken.
Acrobat 5/6 (nur die Vollversion, nicht der kostenlose Reader) verfügt ebenfalls über
ein nützliches Hilfsmittel. Mit dem Menübefehl Fenster, Info können Sie dort die Palette
Info mit numerischen Koordinatenwerten in der Einheit Punkt anzeigen. Beachten Sie
dabei, 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);
62 Kapitel 3: PDFlib-Programmierung
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:
www.twics.com/~eds/paper/papersize.html, www.cl.cam.ac.uk/~mgk25/iso-paper.html
3.2 Seitenbeschreibungen 63
Seitengröße. Im Gegensatz zu PDF und PDFlib, die keinerlei Einschränkungen hin-
sichtlich der verwendbaren Seitengröße aufweisen, unterliegt Acrobat einigen Be-
schränkungen. Andere PDF-Interpreter können aber durchaus mit größeren oder klei-
neren Formaten umgehen. PDFlib gibt eine nicht-fatale Exception aus, wenn die für
Acrobat spezifischen Grenzen überschritten werden. Tabelle 3.5 zeigt die Einschränkun-
gen bezüglich der Seitengröße in Acrobat.
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.
64 Kapitel 3: PDFlib-Programmierung
Tabelle 3.6 Ausgabegenauigkeit und Koordinatenbereich
Absoluter Wert Ausgabe
0 ... 0.000015 0
0.000015 ... 32767.999999 Rundung auf vier Dezimalstellen
32768 ... 231- 1 Rundung auf die nächste ganze Zahl (Integer)
>= 231 Auslösen einer Exception
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 267):
> 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. Alle diesbezüglichen Regeln las-
sen sich einfach zusammenfassen: Ȁndern Sie keine Darstellungseigenschaften (zum
Beispiel Farbe oder Strichstärke) während der Definition eines Pfads.«
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.
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-
3.2 Seitenbeschreibungen 65
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 155). 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 280,
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.
> Die Funktionen in Abschnitt 8.9, »Hypertext-Funktionen«, Seite 302. 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.
66 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 71).
> ICC-basierte Farben werden mittels eines ICC-Profils definiert (siehe Abschnitt 3.3.4,
»Colormanagement und ICC-Profile«, Seite 71).
> 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 68.
> 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 67)
> 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 67).
> 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 67
> 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.
68 Kapitel 3: PDFlib-Programmierung
Hinweis Die PDF-Farbseparation geht über den Rahmen von PDFlib hinaus; dafür ist Acrobat 6, zusätzli-
che Software für Acrobat 5 (wie das Plugin ARTS PDF Crackerjack1) oder In-RIP-Separation erfor-
derlich.
Hinweis Wenn in Acrobat 5 die Überdruckenvorschau aktiviert ist, werden manche Schmuckfarben nicht
korrekt angezeigt. Sie lassen sich aber korrekt separieren und drucken.
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.
1. Siehe www.artspdf.com
3.3 Farbe 69
Bei Schmuckfarbnamen wird zwischen Groß- und Kleinschreibung unterschieden;
schreiben Sie die Namen deshalb wie in den Beispielen in Großbuchstaben. Es werden
auch die alten Namenspräfixe CV, CVV, CVU, CVC und CVP akzeptiert. Wie die Beispiele
zeigen, beginnt der Farbname immer mit dem Präfix PANTONE. Generell müssen PANTO-
NE-Farbnamen nach folgendem Schema aufgebaut sein:
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,
70 Kapitel 3: PDFlib-Programmierung
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:
spot = PDF_makespotcolor(p, "HKS 38 E", 0);
PDF_setcolor(p, "fill", "spot", spot, 0.7, 0, 0);
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-
1. Siehe www.color.org
3.3 Farbe 71
Tabelle 3.7 Rendering-Intents
Rendering-Intent Erklärung üblicher Einsatz
Auto In der PDF-Datei wird kein Rendering-Intent festgelegt. Es unbekannte oder unspezi-
soll der Standard-Rendering-Intent des Geräts verwendet fische Fälle
werden. Dies ist der Standardwert.
AbsoluteColorimetric Es wird keine Korrektur des Weißpunkts des Geräts (zum exakte Reproduktion von
Beispiel Papierweiß) vorgenommen. Farben außerhalb des Volltonfarbe; wird in ande-
Gamuts werden auf die nächstliegenden innerhalb des ren Fällen nicht empfohlen
Gamuts des Geräts abgebildet.
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.
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
72 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.
Über den Parameter image:iccprofile können bestimmte ICC-Profile generell auf alle
Graustufen-, RGB- oder CMYK-Bilder angewandt werden. Im Gegensatz zu den Stan-
3.3 Farbe 73
dardfarbräumen (siehe unten) beziehen sich diese Parameter nur auf Rasterbilder und
nicht auf Text oder Vektorgrafik.
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);
74 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 75
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.
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 Acrobat: Gehe Zu einer Seite eines anderen Dokuments). In der Options-
liste zu dieser Aktion definieren wir mit filename den Namen des Zieldokuments und
mit der Option destination, dass ein bestimmter Seitenausschnitt deutlich vergrößert
angezeigt wird. Genauer gesagt soll das Dokument auf der zweiten Seite (page 2) in defi-
nierter Darstellung (type fixed) mit der Seitenmitte im sichtbaren 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 "
"annotcolor {rgb 1 0 0} contents {Get the Kraxi Paper Plane!} display noprint"
76 Kapitel 3: PDFlib-Programmierung
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);
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
3.4 Hypertext-Elemente 77
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);
78 Kapitel 3: PDFlib-Programmierung
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 79
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", "..."
80 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. Windows 2000/XP sowie
Mac OS X bieten native OpenType-Unterstützung. Es gibt zwei Varianten von OpenTy-
pe, 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).
82 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.
84 Kapitel 4: Textausgabe
4.2 Fontformate im Detail
4.2.1 PostScript-Fonts
Formate für PostScript-Fontdateien. PDFlib unterstützt auf allen Systemen folgende
Formate für PostScript-Type-1-Metrikdaten und Zeichenbeschreibungen:
> 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 PFM-Dateien nur mit folgenden Zei-
chensätzen verwendet werden: winansi, iso8859-1, unicode, ebcdic und builtin (letzterer
nur für Symbolfonts).
> 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, manchmal
LWFN-Fonts (LaserWriter Font) genannt, unterstützt.
> OpenType-Fonts mit PostScript-Zeichenbeschreibungen (*.otf).
Wenn Sie zu einem PostScript-Font die Zeichenbeschreibungs-, aber nicht die Metrikda-
tei besitzen, können Sie versuchen, die fehlenden Metrikdaten mit einem der frei ver-
fügbaren Hilfsprogramme zu generieren. Beachten Sie jedoch, dass solche Konvertie-
rungen häufig zu Schrift- oder Zeichensatzproblemen führen. Es ist deshalb unbedingt
empfehlenswert, die vom Schrifthersteller mitgelieferten Zeichenbeschreibungs- und
Metrikdaten zu verwenden.
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).
86 Kapitel 4: Textausgabe
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-Schriften oder Schriften, die über eine Fontdatei auf der Fest-
platte 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
1. Siehe www.microsoft.com/typography/property/property.htm
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.
Ermitteln von Host-Fontnamen auf dem Mac. Unter Mac OS X finden Sie den Namen
eines installierten Fonts im Allgemeinen im Schriftmenü von Anwendungen wie Text-
Edit. Damit erhalten Sie jedoch noch nicht unbedingt den korrekten und von PDFlib er-
warteten Fontnamen. Wir empfehlen daher Apples frei verfügbare Font Tools,1 eine
Sammlung von Befehlszeilen-Programmen inklusive des Programms ftxinstalledfonts
zur Bestimmung der korrekten Namen aller installierten Fonts. Um den von PDFlib er-
warteten Namen zu ermitteln, installieren Sie Font Tools und führen in einem Termi-
nalfenster den folgenden Befehl aus:
ftxinstalledfonts -q
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( )
1. Siehe developer.apple.com/fonts/OSXTools.html
88 Kapitel 4: Textausgabe
ü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 mit Text-
ausgabeoperatoren 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 fehlen-
de Glyphen dagegen einfach ignoriert.
> Manche PDF-Viewer (für Acrobat gilt das nicht) benötigen eine Glyphe namens
.notdef für Codes, für die im Font kein entsprechender Glyphenname definiert ist.
Die Glyphe .notdef muss zwar vorhanden sein, die zugehörende Glyphenbeschrei-
bung kann aber leer sein.
> Werden normale Rasterbilddaten zur Definition von Zeichen verwendet, dann wer-
den im Rasterbild nicht gesetzte Bildpunkte unabhängig vom Hintergrund weiß ge-
druckt. Um dies zu vermeiden und die ursprüngliche Hintergrundfarbe durchschei-
nen zu lassen, verwenden Sie den Parameter mask zur Konstruktion des Rasterbilds.
> Mit der Rasterbild-Option interpolate lässt sich das Aussehen von Type-3-Bitmap-
Fonts bei der Bildschirm- und Druckausgabe verbessern.
Mögliche Probleme mit Windows-Schriften. Wir möchten Anwender auf ein potentiel-
les 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 selektiert, erzeugt Windows
im Fonts-Verzeichnis nur eine Verknüpfung auf die originale Fontdatei. In diesem Fall
muss sich die Fontdatei in einem Verzeichnis befinden, auf das die PDFlib benutzende
Anwendung zugreifen kann. Dies betrifft insbesondere IIS mit Standardsicherheitsein-
stellungen, bei denen auf Fontdateien außerhalb des Windows-Fonts-Verzeichnisses
unter Umständen nicht zugegriffen werden kann. Lösung: entweder Sie kopieren die
Fontdateien ins Fonts-Verzeichnis oder Sie legen die originale Fontdatei in ein Verzeich-
nis, auf das IIS Leserecht hat.
Ähnliche Probleme können beim Adobe Type Manager (ATM) auftreten, wenn bei
der Fontinstallation die Option Hinzufügen ohne Kopieren der Dateien selektiert ist.
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", "");
90 Kapitel 4: Textausgabe
Schriftsuche. Der an PDF_load_font( ) übergebene Name kann in ASCII, UTF-8 oder UTF-
16 kodiert sein. Es werden jedoch nicht alle Encodings für alle Quellen von Fontdaten
unterstützt. Bei der Schriftsuche wird wie folgt vorgegangen:
> Ist der Name ein Alias (festgelegt in einer UPR-Datei oder einem Aufruf von PDF_set_
parameter( )), kann er in ASCII oder UTF-8 kodiert sein. Mittels des Namens, auf den
sich der Alias bezieht, wird in den nächsten Schritten nach der Fontdatei (bei einer
Schrift im Dateisystem) oder nach der Systemschrift gesucht.
> Bezeichnet der Name eine Systemschrift, kann er in ASCII kodiert sein. Unter Win-
dows kann auch UTF-8 oder UTF-16 verwendet werden.
> Wurde die Schrift (auch als möglicherweise lokalisierte) Systemschrift nicht gefun-
den oder ist sie nicht in UTF-8 oder UTF-16 kodiert, wird durch Hinzufügen verschie-
dener Namenserweiterungen nach einer passenden Fontdatei gesucht (siehe unten).
> Bei TTC-Schriften (TrueType Collection) kann der Name in ASCII, UTF-8 oder UTF-16
kodiert sein. Er wird mit allen Fontnamen in der TTC-Datei verglichen.
> 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-
Dateinamenerweiterung besteht und sich in einem der in SearchPath festgelegten
Verzeichnisse 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
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.
Die Schrifteinbettung wird über die Option embedding von PDF_load_font( ) gesteuert. Es
gibt jedoch auch Situationen, in denen PDFlib eine Schrift unabhängig von der Option
embedding auf jeden Fall einbettet (siehe unten).
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 Metrikdatei erforderlich? Fontdatei erforderlich?
Eine der 14 Standardschriften nein nein1
TrueType- oder OpenType-Fonts, die auf dem Mac oder nein nein
TrueType-, OpenType- oder PostScript-Font, die unter
Windows installiert ist (Systemschrift)
PostScript-Nichtstandardschrift PFM oder AFM PFB oder PFA (nur
bei
Schrifteinbettung)
TrueType-Fonts nein TTF, TTE
OpenType-Fonts mit TrueType- oder PS-Zeichenbeschrei- nein TTF, OTF
bungen, auch CJK-TrueType- oder -OpenType-Fonts
Standard-CJK-Fonts2 nein nein
1. Zeichenbeschreibungen können zur Einbettung bereitgestellt werden.
92 Kapitel 4: Textausgabe
2. Informationen über CJK-Fonts finden Sie in Abschnitt 4.7, »Chinesischer, japanischer und koreanischer Text«, Seite 116.
Beachten Sie dabei, dass die Einbettung bei OpenType-Fonts mit PostScript-Zeichenbe-
schreibungen nicht unbedingt erzwungen wird. Das liegt an der internen Konvertie-
rung in einen CID-Font, die deaktiviert werden kann, indem der Parameter autocidfont
auf false gesetzt wird. Damit wird auch die erzwungene Schrifteinbettung deaktiviert. In
diesem Fall sind aber nicht mehr alle lateinischen Zeichen verwendbar und Zeichen au-
ßerhalb der Adobe Glyph List (AGL) sind prinzipiell nicht einsetzbar.
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.
1. Genauer gesagt: wenn das Flag fsType in der OS/2-Tabelle der Schrift den Wert 2 hat.
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.
94 Kapitel 4: Textausgabe
4.4 Zeichensätze
4.4.1 8-Bit-Zeichensätze
Tabelle 4.2 enthält eine Liste aller in PDFlib vordefinierten Zeichensätze sowie Angaben
zu ihrem Einsatz mit wesentlichen Schriftkategorien. Dabei ist zu betonen, dass es
Schriften und Sprachen gibt, die mit gängigen Fonts nicht ausgegeben werden können.
So enthalten zum Beispiel die Standardschriften von Acrobat nicht alle für ISO 8859-2
(zum Beispiel Polnisch) benötigten Zeichen. Diese Anforderung wird von PostScript 3,
OpenType Pro und TrueType »Big Fonts« jedoch erfüllt.
Hinweis Mit PDFlib wird das Beispielprogramm chartab ausgeliefert, mit dem sich bequem Zeichen-
tabellen mit beliebigen Kombinationen aus Font und Zeichensatz ausdrucken lassen.
Der Zeichensatz host. Der Zeichensatz host spielt eine Sonderrolle, da es sich um kei-
nen bestimmten Zeichensatz handelt. Je nach aktueller Plattform wird er auf einen spe-
ziellen 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. Für Textfonts wird mit dem Schlüsselwort auto als Wert für den Parame-
ter encoding folgt ein plattform- und umgebungsspezifischer 8-Bit-Zeichensatz festge-
legt:
> unter Windows: die aktuelle Codepage des Systems (Einzelheiten siehe unten)
> unter Unix und Mac OS X: iso8859-1
> auf Mac OS Classic: macroman
> auf IBM eServer iSeries: Zeichensatz des aktuellen Jobs (IBMCCSID000000000000)
> auf IBM eServer zSeries: ebcdic (=Codepage 1047)
4.4 Zeichensätze 95
Tabelle 4.2 Verfügbarkeit von Glyphen für vordefinierte Zeichensätze in verschiedenen Schriftkategorien;
manche Sprachen sind mit Acrobat-Standardschriften nicht darstellbar.
Standardschriften
»Big Fonts«5
Acrobat 4/51
PS Level 1/2,
PostScript 3
Acrobat 62
Pro Fonts4
OpenType
TrueType
Fonts3
Codepage Unterstützte Sprachen
96 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
»Big Fonts«5
Acrobat 4/51
PS Level 1/2,
PostScript 3
Acrobat 62
Pro Fonts4
OpenType
TrueType
Fonts3
Codepage Unterstützte Sprachen
cp1258 Vietnamesisch – – – – ja
1. Ursprünglicher Adobe Latin Zeichensatz (Type-1-Fonts seit 1982)
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
Für 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", "");
4.4 Zeichensätze 97
Benutzerdefinierte 8-Bit-Zeichensätze. Neben vordefinierten Zeichensätzen unter-
stützt PDFlib benutzerdefinierte 8-Bit-Zeichensätze. Diese benötigen Sie, wenn Sie mit
einem Zeichensatz arbeiten, der in PDFlib intern nicht verfügbar ist, zum Beispiel eine
andere EBCDIC-Codepage, als die von PDFlib intern unterstützte. Zusätzlich zu Zeichen-
satztabellen mit PostScript-Glyphennamen akzeptiert PDFlib Unicode-basierte Codepa-
ge-Tabellen.
Folgende Schritte sind erforderlich, um einen benutzerdefinierten Zeichensatz in ei-
nem PDFlib-Programm zu verwenden (alternativ dazu lässt sich der Zeichensatz auch
zur Laufzeit mit PDF_encoding_set_char( ) aufbauen):
> Legen Sie eine Beschreibung des Zeichensatzes in einer einfachen Textdatei an.
> Konfigurieren Sie den Zeichensatz in der PDFlib-Ressourcendatei (siehe Abschnitt
3.1.6, »Ressourcenkonfiguration und Dateisuche«, Seite 54) oder über PDF_set_
parameter( ).
> Stellen Sie eine Schrift bereit (Metrik- und gegebenenfalls Fontdatei), die alle im Zei-
chensatz verwendeten Zeichen enthält.
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.
98 Kapitel 4: Textausgabe
rung basiert auf Adobes Standardliste der PostScript-Glyphennamen (der Adobe Glyph
List oder AGL1). Es können aber auch Namen verwendet werden, die dort nicht verzeich-
net sind. PDFlib setzt dann für diese Nicht-AGL-Namen freie Unicode-Werte fest und
korrigiert diese beim Einlesen von OpenType-Fonts, in denen die Zuordnung zwischen
Glyphennamen und Unicode-Werten gespeichert ist.
Die AGL ist in PDFlib integriert und enthält mehr als 1000 Glyphennamen. Enco-
ding-Dateien sind bei PostScript-Fonts mit Glyphennamen erforderlich, die nicht dem
Standard entsprechen, während Codepages sich besser für den Umgang mit TrueType-
oder OpenType-Fonts eignen, die auf Unicode basieren.
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.
4.4 Zeichensätze 99
Zeichensatz builtin für OpenType-Fonts mit PostScript-Definitionen (*.otf). OTF-Fonts
mit Symbolen sollten mit dem Zeichensatz builtin verwendet werden. Manche OTF-
Fonts enthalten intern einen Standardzeichensatz. PDFlib erkannt dies und konstruiert
dynamisch einen für die Schrift passenden Zeichensatz. Der Zeichensatzname builtin
wird dann zu builtin_<fontname> geändert. Der neue Zeichensatzname kann dann zwar
generell in Aufrufen von PDF_load_font( ) verwendet werden, er ist jedoch nur in Kombi-
nation mit derselben Schrift sinnvoll.
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) oder 160
(dezimal) befindet. Er ist in der Version des Symbol-Fonts, die ab Acrobat Version 4.0
ausgeliefert wird, sowie in dem in PostScript-3-Geräte eingebauten Symbol-Font ver-
fügbar.
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
Unicode-Text kann in diesen Sprachen zwar verwendet werden, die Behandlung der ver-
schiedenen 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. Die
Länge der UTF-16-Strings ist 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, die String-Objekte nicht direkt unterstützen (Cobol, C und
RPG), ist die Länge der UTF-16-Strings in einem eigenen Längenparameter zu überge-
ben.
> Name-Strings: werden fast wie Strings für Seitenbeschreibungen interpretiert, es wird
aber der Parameter length ausgewertet sowie das Vorhandensein eines BOM am
Stringanfang. In C wird von einem String im Format UTF-16 ausgegangen, wenn der
Parameter length von 0 verschieden ist. Andernfalls (d.h. wenn der Parameter length
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
in PDFDocEncoding enthalten sind, wird er vollständig in einen String mit UTF-16-
Kodierung und Big-Endian-Bytereihenfolge konvertiert und als Unicode in die PDF-
Ausgabe geschrieben. Andernfalls wird er als 8-Bit-kodierter PDFDocEncoding-Text
ausgegeben.
> bytes: ein Byte im String entspricht einem Zeichen, und der String wird uninterpre-
tiert ausgegeben. Dies ist hauptsächlich bei 8-Bit-Zeichensätzen sinnvoll. UTF-16-
Strings mit Big-Endian-BOM werden erkannt. In C müssen diese Strings mit Doppel-
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
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:
> Alle im Dokument verwendeten Schriften müssen, wie oben definiert, zu Unicode
kompatibel sein oder eine der in Tabelle 4.7 vordefinierten CMaps verwenden.
> Wurde der Zeichensatz mit PDF_encoding_set_char( ) sowie Glyphennamen zusam-
mengestellt, die über keine entsprechenden Unicode-Werte verfügen oder aus einer
Encodingdatei geladen wurden, müssen diese in der Adobe Glyph List oder in der Lis-
te der Glyphennamen des Symbolfonts verzeichnet sein.
> Der Parameter oder die Option unicodemap ist gleich true.
> Alle Textstrings haben eine klar definierte Bedeutung gemäß des Unicode-Stan-
dards, das heißt, Zeichen aus der Private Use Area (PUA) sind nicht zulässig.
Bei der Erzeugung von Tagged PDF können Textteile, die diese Regeln verletzen, Uni-
code-kompatibel gemacht werden, indem mit der Option ActualText in PDF_begin_item( )
korrekter Unicode-Text übergeben wird.
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 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 Versalhöhe, Oberlänge und Unterlänge werden als Bruchteil der Schriftgröße ge-
messen und müssen deshalb vor der Verwendung mit der nötigen Schriftgröße multi-
pliziert werden.
Die Werte für Versalhöhe, Oberlänge und Unterlänge für eine bestimmte Schrift
können wie folgt von PDFlib abgefragt werden:
float capheight, ascender, descender, fontsize;
...
font = PDF_load_font(p, "Times-Roman", 0, "winansi", "");
PDF_setfont(p, font, fontsize);
Hinweis Position und Größe von hochgestellten und tiefgestellten Zeichen können von PDFlib nicht ab-
gefragt werden.
Oberlänge
Versalhöhe (ascender)
(capheight)
Schriftgröße
Grundlinie
Unterlänge (descender)
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.
PDFlib unterstützt Kerning für PostScript-, TrueType- und OpenType-Fonts. Es gibt
in PDFlib zwei Möglichkeiten zur Steuerung von Kerning:
> Beim Laden eines Fonts werden die Kerningdaten standardmäßig nicht ausgewertet.
Ist Kerning erwünscht, dann muss PDF_load_font( ) mit der Option kerning aufgeru-
fen werden. Damit wird PDFlib angewiesen, die Kerningdaten der Schrift einzulesen,
sofern diese vorhanden sind.
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. Beachten Sie jedoch, dass die Kombination aus horizontaler
Skalierung und Kerning erst ab Acrobat 4.05 funktioniert.
In PDFlib gibt es keine Beschränkung für die Anzahl der Kerning-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.
Note Künstliche Schriftstile sollten nur für die Standard-CJK-Schriften zum Einsatz kommen. Beach-
ten Sie zudem, dass künstliche Schriftstile von anderen PDF-Viewern als Adobe Acrobat unter
Umstä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");
Die fontstyle-Funktion ist nicht zu verwechseln mit dem ähnlichen Konzept der Schrift-
stilnamen in Windows. Während die fontstyle-Funktion nur unter den obigen Bedin-
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.17 beschrieben.
Sie können mit PDF_set_value( ) und dem Parameter textrendering gesetzt werden.
PDF_set_value(p, "textrendering", 1); /* Umrisslinien zeichnen */
Textfarbe. Text wird gewöhnlich mit der aktuellen Füllfarbe dargestellt, die mit PDF_
setcolor( ) gesetzt werden kann. Bei einem von 0 verschiedenen Darstellungsmodus wer-
den je nach Modus die Linien- und die Füllfarbe verwendet.
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:
> Die CJK-Unterstützung von Acrobat basiert auf CID-Fonts. Diese können jedoch nicht
auf allen PostScript-Druckern ausgegeben werden. Native Unterstützung für CID-
Fonts wurde erst in PostScript Version 2015 integriert. Das bedeutet, dass Drucker
mit PostScript Level 1 und frühem Level 2 nicht darüber verfügen. Bei frühen Level-2-
Geräten kann man aber davon ausgehen, dass der Druckertreiber passende Kompati-
bilitätsroutinen an Level-2-Drucker vor Version 2015 lädt.
> Aufgrund der immensen Anzahl von Zeichen benötigen CID-Fonts enormen Dru-
ckerspeicher, wenn keine Schriftuntergruppen gebildet wurden. Die Dateigröße für
einen vollständigen CJK-Font beträgt in der Regel 5 bis 10 MB. Nicht alle Drucker ver-
fügen über ausreichend Speicher zur Ausgabe solcher Schriften. Bei unseren Tests
mussten wir zum Beispiel einen Level-3-Laserdrucker von 16 MB auf 48 MB RAM auf-
rüsten, um PDF-Dokumente mit CID-Fonts zuverlässig ausdrucken zu können.
> 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 von Acrobat umfassen keine kursiven oder fetten Fonts. Solche Fonts
lassen sich mit künstlichen Schriftstilen simulieren (siehe Abschnitt 4.6.3, »Textvarianten«, Sei-
te 114).
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 sich in Tabelle 4.7.
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.
AdobeMyungjoStd-
Medium-Acro3
1. In Acrobat 4 verfügbar; in Acrobat 5 und 6 werden sie durch andere Schriften ersetzt.
2. Nur in Acrobat 5 verfügbar.
3. Nur in Acrobat 6 verfügbar.
4. Nur bei der Generierung von PDF 1.4 oder höher verfügbar.
5. Nur bei der Generierung von PDF 1.5 verfügbar.
6. Die HW-CMaps dürfen nicht mit den Schriften KozMinPro-Regular-Acro und KozGoPro-Medium-Acro verwendet werden, da diese
nur proportionale ASCII-Zeichen, aber keine Zeichen halber Breite enthalten.
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
Bei Multibyte-Zeichensätzen muss das höchstwertige Byte am Anfang stehen. Die Byte-
reihenfolge und das Textformat können auch mit dem Parameter textformat festgelegt
werden (siehe Abschnitt 4.5.1, »Unicode für Seitenbeschreibungen und Hypertext«, Seite
102), falls eine Unicode-CMap (UCS-2 oder UTF-16) verwendet wird.
Da sich bei manchen der unterstützten Zeichensätze Nullzeichen in Textstrings er-
geben können, dürfen C-Entwickler in solchen Fällen nicht die Funktionen PDF_show( )
etc. verwenden, sondern müssen stattdessen die Funktionen PDF_show2( ) etc. einset-
zen, die für beliebige Binärstrings mit einem zusätzlichen Längen-Parameter vorgese-
hen sind. Bei allen anderen Bindungen unterstützen die Textfunktionen Binärstrings,
so dass PDF_show2( ) etc. nicht benötigt wird.
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.
Hinweis Original Composite Fonts (OCF) und reine PostScript-CID-Fonts werden nicht unterstützt.
Windows-EUDC-Fonts (end-user defined characters) werden unterstützt, einzelne benutzer-
spezifische Zeichen lassen sich aber nicht mit allen Fonts verknüpfen (siehe unten).
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
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
124 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
[email protected]
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 erfordlich:
> 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.22.
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 124, 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);
while (1)
{
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, "");
if (strcmp(result, "_boxfull"))
break;
}
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.
links und rechts mit einem Einzug vom Seitenrand versehen, und zwar links um 15 und
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.22). 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.
4.9.4 Tabulatoren
Im Folgenden geht es um die Platzierung einer Tabelle mit links- und rechtsbündigen
Spalten unter Verwendung von Tabulatoren. Die Tabelle enthält folgende Zeilen, deren
Einträge durch Tabulatoren getrennt sind (die Tabulatorzeichen werden durch Pfeile
symbolisiert):
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
TOTAL 420.00
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";
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.
1. Long Distance Glider: With this paper rocket you can send all your Abb. 4.18
Nummerierte Liste
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.
3. Cone Head Rocket: 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.
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.
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,
confe rence, or lecture turn out to be deadly boring, you can have a wonder ful time
with our planes. All our models are folded from one paper sheet. They are exclu sively
folded without using any adhe sive. Several models are equip ped with a folded
landing gear enab ling a safe landing on the intended loca tion provided that you
have aimed well. Other models are able to fly loops or cover long dist ances. Let them
start from a vista point in the mount ains and see where they touch the ground.
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
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.
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 be-
rücksichtigt.
Blocksatz in schmaler Fitbox. Mit den Optionen zur Steuerung des Blocksatzes müs-
sen Sie sich in der Regel umso 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, müssen 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:
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
Beachten Sie folgende Einschränkungen bei der Verwendung von Textflüssen mit CJK-
Text:
> Vertikale Schreibrichtung wird nicht unterstützt.
> Nur Unicode-kompatible Zeichensätze sind einsetzbar, d.h. unicode oder eine der
Unicode-kompatiblen, vordefinierten CMaps.
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 155.
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.
Wird durch PDF_load_image( ) nun eine Exception ausgelöst, so erhalten Sie eine detail-
lierte Fehlerbeschreibung in der entsprechenden Exception-Meldung.
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
1. Siehe www.libtiff.org
1. Siehe www.imagemagick.org
Hinweis Ein Fehler in Acrobat 5 verhindert den Einsatz von transparenten Schwarzweißbildern. Statt
des Bildes erscheint die Fehlermeldung »Beim Verarbeiten einer Seite ist ein Fehler aufgetreten.
Es ist ein Grafikfehler aufgetreten«. Acrobat 6 hat diesen Fehler nicht. Zur Abhilfe können Sie
die Transparenz entfernen oder das Bild mit 4 oder mehr Bit pro Pixel speichern.
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)
> Bildrohdaten
Überall dort, wo sich in der Maske der Pixelwert o befindet, wird der entsprechende Be-
reich des maskierten Bildes gezeichnet, während der Wert 1 den Hintergrund durch-
scheinen lässt. Sind mehr als 1 Bit pro Pixel vorhanden, mischen die zwischenliegenden
Werte das Vordergrundbild mit dem Hintergrund und bewirken so einen Transparenz-
effekt. 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 0-Bits
als transparent behandelt werden. Das heißt unabhängig vom bereits auf der Seite vor-
handenen Inhalt scheint dieser durch die transparenten Bestandteile des Bildes. 1-Bit-
Pixel 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, "");
}
Wenn Sie eine Farbe auf ein Bild anwenden möchten, ohne dass die 0-Bits transparent
werden, müssen Sie die Funktion zum Einfärben verwenden (siehe Abschnitt 5.1.4, »Ein-
färben von Bildern«, Seite 149).
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 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);
}
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) 151
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 65).
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 155.
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.44).
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.43
und Tabelle 8.44 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 155, 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) 153
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.
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.
Vergleich zwischen Ausrichtung und Drehung. Ausrichtung und Drehung sind sich
zwar recht ähnlich, weisen aber dennoch einige Unterschiede auf, derer Sie sich bewusst
sein sollten. Abbildung 5.5 und Abbildung 5.6 zeigen den prinzipiellen Unterschied zwi-
schen den Optionen orientate und rotate.
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");
Neben der Platzierung mit Hilfe von x- und y-Koordinaten, die den Abstand des Objekts
vom Seitenrand oder im allgemeinen Fall die Koordinatenachsen definieren, kann zu-
sätzlich ein virtueller Rahmen (die so genannte Box) festgelegt werden, in die sich das
Objekt auf verschiedene Art einpassen lässt. Dazu stehen zusätzlich die Optionen
boxsize, fitmethod und position zur Verfügung.
Abb. 5.5
Option orientate
Abb. 5.6
Option rotate
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).
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");
Abb. 5.7
Anpassen der Seitengröße. Von links nach
rechts: exakt, vergrößert, verkleinert.
Abb. 5.10
Einpassen eines
Objekts in die Seite
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");
Der Referenzpunkt ist (0, 0) und die Drehoperation ist orientate west. Damit das gedreh-
te Logo die gesamte Seitenhöhe einnimmt, bemessen wir die Höhe der Box so groß wie
die Seitenhöhe (842) und definieren zudem eine zu große Breite (595). Die Proportionen
des Logos sollen sich beim Einpassen in die Box nicht verändern. Wir wählen also
fitmethod meet.
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 PDFlib-Block-Plugin für Adobe Acrobat erforderlich, um Blöcke in PDF-Templates anzu-
legen.
Hinweis Falls das PDFlib-Block-Plugin nicht zu funktionieren scheint, stellen Sie sicher, dass unter Bear-
beiten, Grundeinstellungen..., [Allgemein...], Programmstart (Acrobat 6) bzw. Bearbeiten,
Grundeinstellungen, Allgemein..., Optionen (Acrobat 5) das Kontrollkästchen »Nur zertifizierte
Zusatzmodule verwenden« deaktiviert ist.
Installation der PDFlib-Plugins für Acrobat unter Windows. Zur Installation des PDF-
lib-Block-Plugins sowie des Plugins zur Konvertierung von PDF-Formularfeldern in
Acrobat 5 oder 6 kopieren Sie die Plugin-Dateien in ein Unterverzeichnis des Acrobat-
Plugin-Verzeichnisses. Dies wird von der Installationsroutine des Plugins automatisch
durchgeführt, kann aber auch manuell erfolgen. Unter Windows heißen die Dateien
Block.api und AcroFormConversion.api, und das Verzeichnis für die PDFlib-Plugins lautet
üblicherweise in etwa:
C:\Programme\Adobe\Acrobat 6.0\Acrobat\Plug_ins\PDFlib
Installation der PDFlib-Block-Plugins für Acrobat auf dem Mac. Bei Acrobat 6 ist der
Plugin-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):
> Extrahieren Sie die Plugin-Dateien durch Doppelklick auf das Laufwerkssymbol.
> 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 6.0 Professional
Zur Installation der Plugins für Acrobat 5 doppelklicken Sie auf das Laufwerkssymbol.
Ziehen Sie den PDFlib-Ordner auf den Acrobat-5-Plugin-Ordner, der üblicherweise wie
folgt lautet:
/Programme/Adobe Acrobat 5.0/Plug-Ins
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 170). Der Blockname wird automatisch angelegt, kann aber nachträglich ge-
ändert werden. Er muss innerhalb einer Seite eindeutig sein. Auf der Registerkarte
Allgemein 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 wer-
den nur bei Auswahl des entsprechenden Blocktyps eingeblendet.
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.
Das Kontextmenü. Sind einer oder mehrere Blöcke selektiert, können Sie das Kontext-
menü zum schnellen Zugriff auf blockspezifische Funktionen nutzen (die sich auch im
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
Seite. Die Koordinaten werden in der Einheit angezeigt, die in Acrobat gerade eingestellt
ist. Zum Ändern der Einheit wählen Sie Bearbeiten, Grundeinstellungen..., [Allgemein...],
Einheiten und Hilfslinien(Acrobat 6) bzw. Bearbeiten, Grundeinstellungen, Allgemein...,
Anzeigen, Seiteneinheiten (Acrobat 5) und selektieren Punkt, Millimeter, Zoll, Pica oder Ze-
ntimeter (die beiden letzten Einheiten sind nur in Acrobat 6 verfügbar). Sie können
auch Anzeige, Navigationsregisterkarten, Info (Acrobat 6) bzw. Fenster, Info (Acrobat 5),
wählen und eine Einheit aus dem Menü Optionen (Acrobat 6) bzw. Info (Acrobat 5) selek-
tieren. 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.
Der Weg aus der Sackgasse hängt von Ihrer Acrobat-Version ab:
> Acrobat 6: Sie können die Datei in Acrobat als PDF 1.3 speichern, indem Sie Datei,
Dateigröße verringern... und dann Acrobat 4.0 und höher wählen.
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
einen Wert aus der zugehörenden Dropdown-Liste (z.B. bei fitmethod) oder selektieren
mit dem »...«-Button rechts eine Farbe, Schrift oder Datei (z.B. bei backgroundcolor). Bei
der Eigenschaft fontname können Sie einen Schriftnamen eingeben oder die Schrift mit
dem »...«-Button aus einer Liste mit allen im System installierten Schriften auswählen.
Unabhängig von der Auswahlmethode muss der gewählte Font auf dem System vor-
handen sein, auf dem die Blöcke 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.
1. Siehe www.callassoftware.com
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 175, beschreibt, welche
Eigenschaften mehreren Blöcken gemeinsam sein können. Selbstdefinierte Eigenschaf-
ten 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.
> Fügen Sie mit Strg-V (Windows) bzw. Cmd-V (Mac) oder Bearbeiten, Einfügen die Blö-
cke aus der Zwischenablage ein.
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.
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 68) 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 aus einer oder mehreren
Zeilen bestehen. Tabelle 6.4 zeigt alle Eigenschaften, die sich generell auf beide Text-
blockarten 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 Addressierung der Blockeigenschaft sind folgende
Ausdrücke gleichbedeutend, wobei davon ausgegangen wird, dass der Block mit der
Nummer <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);
Eine Blockliste ist ein Dictionary mit allgemeinen Information zur Blockverarbeitung
sowie einer Liste aller Blöcke auf der Seite. Tabelle 6.10 enthält alle Schlüssel in einem
Blocklist-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 4
/PluginVersion (2.0.2)
>>
/LastModified (D:20040913200730)
>>
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.47
einige Optionen für Anmerkungen PDF_create_annotation( ), siehe Tabelle 8.49
einige Feldoptionen PDF_create_field( ) und PDF_create_fieldgroup( ), siehe Tabelle 8.50
Tagged PDF Option tagged in PDF_begin_document( )
In den Kompatibilitätsmodi zu PDF 1.3 und 1.4 sind die in Tabelle 7.2 angeführten
PDFlib-Funktionen nicht verfügbar. Ihr Einsatz löst im Kompatibilitätsmodus zu PDF 1.3
oder 1.4 eine Exception aus.
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.50
einige Anmerkungsoptionen PDF_create_annotation( ) siehe Tabelle 8.49
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.55 und Tabelle 8.56
Ebenen PDF_define_layer( ), PDF_begin_layer( ), PDF_end_layer( ), PDF_layer_
dependency( )
In allen Kompatibilitätsmodi können mit PDI nur PDF-Dokumente mit derselben oder
einer niedrigeren Kompatibilitätsstufe importiert werden. Soll ein PDF mit einer aktu-
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 5 oder
höher. Bei PDF 1.5 beträgt die Schlüssellänge ebenfalls 128 Bit, die Verschlüsselung
unterscheidet sich jedoch ein wenig, was den Einsatz von Acrobat 6 erforderlich
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.
> 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).
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");
Diese Methode kann als Alternative zur Festlegung der Druckausgabebedingung mit
PDF_load_iccprofile( ) verwendet werden. Hierbei wird die Druckausgabebedingung des
importierten Dokuments in das generierte Ausgabedokument kopiert, unabhängig da-
von, ob sie über einen Standardnamen oder ein ICC-Profil definiert wurde. Sie darf ge-
nau einmal festgelegt werden, entweder durch Kopieren aus dem importierten Doku-
ment oder durch explizites Setzen mit PDF_load_iccprofile( ) und der Option usage gleich
outputintent.
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 110). Das bedeutet, dass alle Zeichen der be-
nutzten 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
alternativer Textinhalt angegeben wird. PDFlib löst eine Exception aus, wenn bei der
Generierung 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-
kompatible Schriften kompatible Fonts«, Seite 110, 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 127) 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);
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 25). PDF_new_dl( ) gibt einen Zeiger auf eine PDFlib_api-Struktur zurück, die
Zeiger auf alle PDFlib-API-Funktionen enthält. Wenn die DLL nicht geladen werden kann
oder Major- bzw. Minor-Versionsnummer nicht passen, wird NULL zurückgegeben.
C++, Java, PHP 5: Diese Funktion ist nicht verfügbar, da sie im PDFlib-Konstruktor ver-
borgen ist.
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
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.
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.4 oder Tabelle 8.6. Opti-
onen, 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
muss die Anzahl der geschriebenen Bytes zurückgeben. Entspricht der Rückgabewert
nicht dem Argument size von PDFlib, wird eine Exception ausgelöst. Die Frequenz der
writeproc-Aufrufe lässt sich mit der Option flush einstellen.
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.5. 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.
Gültigkeit document; mit dieser Funktion wird der Geltungsbereich document beendet; diese
Funktion muss immer paarweise mit einer der Funktionen PDF_begin_document( ) oder
PDF_begin_document_callback( ) auftreten.
Tabelle 8.6 Unteroptionen für die Option viewerpreference 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.
Tabelle 8.7 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 105). 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
size (Nur C- und C++-Sprachbindung) C-Zeiger auf eine Speicherstelle, an der die Länge
der zurückgegebenen Daten in Bytes abgelegt wird.
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-
rückgegeben. Der zurückgegebene Puffer muss vom Client vor dem Aufruf anderer PDF-
lib-Funktionen verwendet werden.
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.
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.9 bei den Optionen width und height.
optlist Optionsliste gemäß Tabelle 8.8 und Tabelle 8.9. 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.
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.
void PDF_open_mem(PDF *p, size_t (*writeproc)(PDF *p, void *data, size_t size))
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
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ügbar,
wird ein Leerstring zurückgegeben.
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.
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.
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.
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.
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.
Rückgabe -1 (in PHP: 0), falls die zugehörige virtuelle Datei existiert und gesperrt ist, sonst 1.
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.12 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 PDF_delete( ); kann alternativ
unmittelbar nach einer Funktion mit dem Fehlercode -1 (in PHP: 0) als Ergebnis
aufgerufen werden. Dazwischen dürfen nur die in diesem Abschnitt beschriebenen
Funktionen ausgeführt werden.
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.
Gültigkeit Zwischen einer von PDFlib ausgelösten Exception und PDF_delete( ); kann alternativ
unmittelbar nach einer Funktion mit dem Fehlercode -1 (in PHP: 0) als Ergebnis
aufgerufen werden. Dazwischen dürfen nur die in diesem Abschnitt beschriebenen
Funktionen ausgeführt werden.
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 PDF_delete( ); Kann alternativ
unmittelbar nach einer Funktion mit dem Fehlercode -1 (in PHP: 0) als Ergebnis
aufgerufen werden. Dazwischen dürfen nur die in diesem Abschnitt beschriebenen
Funktionen ausgeführt werden.
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
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.13 Parameter und Werte für Fontfunktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«, Seite 224)
Funktion Schlüssel Erklärung
set_parameter FontAFM Wie die jeweilige Zeile in der entsprechenden Kategorie der UPR-Ressourcendatei
FontPFM (siehe Abschnitt 3.1.6, »Ressourcenkonfiguration und Dateisuche«, Seite 54). Durch
FontOutline mehrere Aufrufe erhält die interne Liste neue Einträge (siehe auch resourcefile in
Encoding Tabelle 8.2). Geltungsbereich: beliebig.
HostFont
SearchPath
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 Anzahl der gültigen Glyphen-IDs des durch den Modifizierer bezeichneten
Font zurück. 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 112. 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 90). Standardwert: 100 KB. Geltungsbereich: beliebig.
set_parameter auto- Steuert die automatische Aktivierung der Fontuntergruppenbildung für TrueType-
subsetting und OpenType-Fonts (siehe Abschnitt 4.3, »Schrifteinbettung und
Schriftuntergruppen«, Seite 90). Standardwert: true. 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 90). 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. Dabei stehen folgen-
de Zeichensätze zur Auswahl (es wird zwischen Groß- und Kleinschreibung unter-
schieden):
> einer der vordefinierten 8-Bit-Zeichensätze winansi, macroman, macroman_apple,
macroman_euro, 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
> 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 116).
> ein dem Betriebssystem bekannter Zeichensatzname (nicht auf allen Plattformen
verfügbar)
Der gewählte Zeichensatz muss zur Schrift kompatibel sein. Tabelle 8.15 listet die zuläs-
sigen Kombinationen von Encodings und Fontformaten auf. Weitere Informationen
finden Sie in Abschnitt 4.4, »Zeichensätze«, Seite 95.
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-
zulösen, wenn die angeforderte Font/Zeichensatz-Kombination nicht geladen werden
kann. Bei nicht korrekten Parametern wird weiterhin eine Exception ausgelöst.
Der zurückgegebene Wert – das Font-Handle – hat für den Benutzer keinerlei inhalt-
liche Bedeutung. Er dient lediglich als Argument für PDF_setfont( ) und verwandte Funk-
tionen. Insbesondere können beim Anfordern der gleichen Font/Encoding-Kombinati-
on in verschiedenen Dokumenten unterschiedliche Font-Handles zurückgegeben
werden.
Ein erneuter Aufruf dieser Funktion mit demselben Fontnamen liefert das Font-
Handle des ersten Aufrufs zurück, es sei denn, es wurde ein anderer Wert für den Para-
meter encoding oder die Option fontstyle angegeben.
Widersprüchliche Optionen: wird ein Font ohne Einbettung, Unterschneidung oder
Untergruppen mit PDF_load_font( ) geladen oder mit PDF_fill_textblock( ) angefordert
und später erneut geladen, so werden diesbezügliche Optionen ignoriert.
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.13. 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 143).
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 Zeichens im zu definierenden Zeichensatz, 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.17 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-
spricht der Anzahl der Glyphen im Text. (Beachten Sie, dass diese nicht unbedingt mit
len, der Anzahl der Bytes, identisch ist!)
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( ).
len (Nur für PDF_continue_text2( )) 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 wie in PDF_
continue_text( ) übergeben werden.
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.18 und zur Dar-
stellung gemäß Tabelle 8.19.
Details Der aktuelle Grafikzustand ändert sich durch diese Funktion nicht. Insbesondere die ak-
tuelle Textposition sowie der aktuelle Font bleiben unbeeinflusst.
Gültigkeit page, pattern, template, glyph; diese Funktion sollte nicht im vertikalen Textausgabe-
modus verwendet werden.
Tabelle 8.19 Darstellungsoptionen für PDF_fit_textline( ) und direkte oder Inline-Optionen für PDF_create_
textflow( )
Schlüssel Typ Erklärung
charref Boolean (Nicht für UTF-8-Textformate) Ist charref gleich true, werden numerische
Referenzen und Entity-Referenzen ersetzt (siehe Abschnitt 4.5.5, »Character-
Referenzen«, Seite 108). Standardwert: false.
charspacing Float oder Zeichenabstand (siehe Tabelle 8.17). Prozentangaben beziehen sich auf fontsize.
Prozentwert Standardwert: der Wert des globalen Parameters charspacing.
fillcolor Farbe Füllfarbe des Texts. Standardwert: die aktuelle Füllfarbe.
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.
glyphwarning Boolean Ist glyphwarning gleich true, so wird eine Exception ausgelöst, falls eine Glyphe
nicht ausgegeben werden kann, weil der Font die zugehörige Zeichenbeschrei-
bung nicht enthält. Bei false werden fehlende Zeichen durch ein Leerzeichen oder
Glyph-ID 0 ersetzt. Standardwert: Wert des globalen Parameters glyphwarning.
horizscaling Float oder Skalierung von Text (siehe Tabelle 8.17). Standardwert: Wert des globalen
Prozentwert Parameters horizscaling.
italicangle Float Bestimmt den Neigungswinkel von kursivem Text in Grad (siehe Abschnitt 4.6.3,
»Textvarianten«, Seite 114). Standardwert: Wert des globalen Parameters
italicangle.
kerning Boolean Verhalten in bezug auf Kerning (siehe Tabelle 8.17). Standardwert: Wert des
globalen Parameters kerning.
overline Boolean Modus für Überstreichen (siehe Tabelle 8.17). Standardwert: Wert des globalen
Parameters overline.
strikeout Boolean Modus für Durchstreichen (siehe Tabelle 8.17). Standardwert: Wert des globalen
Parameters strikeout.
strokecolor Farbe Farbe zum Zeichnen des Texts. Standardwert: die aktuelle Farbe zum Zeichnen.
shrinklimit Float oder Untere Grenze, bis zu der Text beim Einpassen maximal gestaucht werden darf.
Prozentwert Standardwert: 0.75.
textformat Schlüsselwort Format, das zur Interpretation des übergebenen Texts verwendet wird (siehe
Abschnitt 4.5.2, »Content-Strings, Hypertext-Strings und Name-Strings«, Seite
103). Standardwert: Wert des globalen Parameters textformat.
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-
matierung noch übrig sind (also der Rückgabewert von PDF_show_boxed( )) lässt sich mit
PDF_info_textflow( ) und der Option remainchars abfragen.
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.20 und Tabelle 8.22. 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.
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-
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.
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 Der aktuelle Textzustand beeinflusst die von dieser Funktion erzeugte Textausgabe
nicht. Nach der Rückkehr von dieser Funktion ist der Textzustand unverändert. Die ak-
tuelle Textposition dagegen wird ans Ende des generierten Ausgabetextes gestellt.
Gültigkeit beliebig
Für die Definition und Verwendung von Makros gelten folgenden Regeln:
Hinweis Keine der Funktionen für den Grafikzustand darf im Geltungsbereich path verwendet werden
(siehe Abschnitt 3.2, »Seitenbeschreibungen«, Seite 61).
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.24. Ist optlist leer, wird eine durchgezogene
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.25).
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.26).
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 Linienstärke den Wert des miterlimit-Para-
meters übersteigt. Am Anfang jeder Seite wird miterlimit auf den Standardwert 10 ge-
setzt. 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: 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
> 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.
Gültigkeit page, pattern, template, glyph; diese Funktion muss immer paarweise mit PDF_restore( )
auftreten. Genauer gesagt müssen PDF_save( ) und PDF_restore( ) paarweise innerhalb
der Seite, des Musters, des Templates oder der Glyphendefinition auftreten.
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 negativer
Skalierungsfaktor bewirkt eine Spiegelung. Eine Einheit in x-Richtung im neuen Koordi-
natensystem entspricht sx Einheiten in x-Richtung im alten Koordinatensystem; Ent-
sprechendes gilt für die y-Koordinaten.
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 angebenen
Winkel geneigt. alpha wird dabei von der positiven x-Achse des aktuellen Koordinaten-
systems 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.28 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 267, aufzurufen, nachdem Sie die Funktionen im vorliegenden Abschnitt ver-
wendet 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 Linienstä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
C++ Java void curveto(double x1, double y1, double x2, double y2, double x3, double y3)
Perl PHP PDF_curveto(resource p, float x1, float y1, float x2, float y2, float x3, float y3)
C void PDF_curveto(PDF *p, double x1, double y1, double x2, double y2, double x3, double y3)
Zeichnet eine Bézier-Kurve ausgehend von der aktuellen Position, wobei drei Kontroll-
punkte benutzt werden.
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
aktuelle Punkt gesetzt, dann wird von dort eine weitere gerade Linie zum Startpunkt
des Kreissegments gezeichnet. Der Endpunkt des Kreissegments wird zur neuen aktuel-
len Position.
Die Figur ist in Benutzerkoordinaten kreisförmig. Wurde das Koordinatensystem in
x- und y-Richtung unterschiedlich skaliert, hat die resultierende Kurve eine elliptische
Form.
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.
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.29 Parameter und Werte für Funktionen zum Zeichnen und Beschneiden von Pfaden (siehe Abschnitt
8.2.3, »Parameterbehandlung«, Seite 224)
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 Linienstärke und -farbe 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 Linienstä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.
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.
optlist Optionsliste mit Ebeneneinstellungen gemäß Tabelle 8.30.
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.31.
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
Sichbarkeit 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.
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 67):
> 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üllmuster-
farbe 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 wer-
den können (siehe Tabelle 8.34).
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 71, 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.37 Parameter und Werte für die Rasterbildfunktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«,
Seite 224)
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_parameter honoriccprofile Liest in Rasterbilder eingebettete ICC-Farbprofile und wendet sie auf die
Bilddaten an. Standardwert: true.
set_parameter imagewarning Dieser Parameter kann verwendet werden, um genauere Angaben darü-
ber zu erhalten, warum 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.
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, png, raw oder tiff übergeben (weitere Informationen hierzu
finden Sie in Abschnitt 5.1.2, »Unterstützte Rasterbildformate«, Seite 144). 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.37 und Tabelle 8.38). 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. Dasselbe Bild sollte
nicht mehrmals geöffnet werden, da die eigentlichen Bilddaten dann mehrfach ins Aus-
gabedokument 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.
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.39.
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 298).
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.
> Multi-strip TIFF-Bilder können nicht als Piktogramme verwendet werden, da ein Pik-
togramm nur aus einem einzigen PDF-Bildobjekt bestehen darf (siehe Abschnitt 5.1.2,
»Unterstützte Rasterbildformate«, Seite 144).
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.40.
len (Nur C-Sprachbindung; 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-terminierter 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 153):
> 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.40.
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 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.44).
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.39.
Details Diese Funktion entspricht im Wesentlichen PDF_fit_image( ), arbeitet aber mit impor-
tierten PDF-Seiten. Die meisten in Tabelle 8.39 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.42), 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.43 und Tabelle
8.44.
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.43 und Tabelle 8.44.
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.44
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.46 Parameter für Hypertext-Funktionen (siehe Abschnitt 8.2.3, »Parameterbehandlung«, Seite 224)
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 105). 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_parameter usercoordinates Ist usercoordinates gleich false, werden die Koordinaten für Hypertext-
rechtecke im Standardkoordinatensystem erwartet (siehe Abschnitt 3.2.1,
»Koordinatensysteme«, Seite 61); 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.48. Eine leere
Liste entspricht {type fitwindow page 0}.
Details Das benannte Ziel muss in optlist genauer festgelegt werden und kann auf eine beliebige
Seite im aktuellen Dokument verweisen. Der übergebene name kann als Ziel für alle
Funktionen und Parameter verwendet werden, die Optionen zur Festlegung des Ziels
gemäß Tabelle 8.48 akzeptieren.
Tabelle 8.48 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 105). 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.
mimetype String (Nur für type=FileAttachment) MIME-Typ der Datei, mit dem Acrobat bei
Aktivierung der Anmerkung die passende Anwendung startet.
name String Name, der die Anmerkung eindeutig identifiziert. Der Name ist bei einigen
Aktionen erforderlich und muss auf der Seite eindeutig sein. Standardwert: nicht
vorhanden.
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 durch die Reihenfolge
der Aufrufe von PDF_create_field( ). Nachträglich kann sie nicht mehr geändert werden.
In Acrobat können Textfelder mit einem Format versehen werden (Zahl, Prozentwert
etc.). Dies ist in der PDF-Referenz nicht spezifiziert, sondern wird mit benutzerdefinier-
ten JavaScripts implementiert. Sie können diese Funktionalität nutzen, indem Sie ei-
nem Feld JavaScript-Aktionen zuordnen, die auf die vordefinierten (aber nicht standar-
disierten) JavaScript-Funktionen von Acrobat verweisen. Weitere Informationen
einschließlich eines Beispiels finden Sie in Abschnitt 3.4.2, »Formatierungsoptionen für
Textfelder«, Seite 78.
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.50 und Tabelle 8.51.
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_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.
1. Siehe dublincore.org
Gültigkeit object, document, page. Wird diese Funktion im Geltungsbereicht object verwendet, so
werden die übergebenen Werte nur für das nächste Dokument verwendet.
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 Op-
tion 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.55. 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.56 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
Barrierefreiheit (Accessibility) erforderlich. Wird diese Option im PDF-1.4-Modus
verwendet, 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
String Zeichensä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
Standardkoordinatensystem (bei usercoordinates gleich false) oder im
Benutzerkoordinatensystem (bei usercoordinates gleich true). Wurde diese Option
nicht übergeben, generiert PDFlib automatisch einen BBox-Eintrag für importierte
Bilder und PDF-Seiten.
ColSpan Integer 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)
String Abkürzungsergänzung für den Dokumentbestandteil. Sie sollte zur Erklärung von
Abkürzungen und Akronymen übergeben werden. Die Sprachausgabe von
Acrobat 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 105). Ein leerer String
entspricht unicode. Standardwert: leerer String für Unicode-fähige
Sprachbindungen, 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.
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 203.
Gültigkeit
[2] Das folgende Buch vom Hauptentwickler von PDFlib behandelt zahlreiche Themen
zu PostScript, PDF und Schriften:
327
B PDFlib-Kurzreferenz
Allgemeine Funktionen
Funktionsprototyp Seite
void PDF_boot(void) 212
void PDF_shutdown(void) 212
PDF *PDF_new(void) 212
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) 213
void PDF_delete(PDF *p) 213
int PDF_begin_document(PDF *p, const char *filename, int len, const char *optlist) 215
void PDF_begin_document_callback(PDF *p, size_t (*writeproc) (PDF *p, void *data, size_t size), const char
*optlist) 215
void PDF_end_document(PDF *p, const char *optlist) 217
const char * PDF_get_buffer(PDF *p, long *size) 220
void PDF_begin_page_ext(PDF *p, double width, double height, const char *optlist) 221
void PDF_end_page_ext(PDF *p, const char *optlist) 222
void PDF_suspend_page(PDF *p, const char *optlist) 223
void PDF_resume_page(PDF *p, const char *optlist) 224
double PDF_get_value(PDF *p, const char *key, double modifier) 225
void PDF_set_value(PDF *p, const char *key, double value) 225
const char * PDF_get_parameter(PDF *p, const char *key, double modifier) 225
void PDF_set_parameter(PDF *p, const char *key, const char *value) 226
void PDF_create_pvf(PDF *p, const char *filename, int len, const void *data, size_t size, const char *optlist) 226
int PDF_delete_pvf(PDF *p, const char *filename, int len) 227
int PDF_get_errnum(PDF *p) 228
const char *PDF_get_errmsg(PDF *p) 228
const char *PDF_get_apiname(PDF *p) 228
void *PDF_get_opaque(PDF *p) 229
const char *PDF_utf16_to_utf8(PDF *p, const char *utf16string, int len, int *size) 229
const char * PDF_utf8_to_utf16(PDF *p, const char *utf8string, const char *ordering, int *size) 230
Fontfunktionen
Funktionsprototyp Seite
int PDF_load_font(PDF *p, const char *fontname, int len, const char *encoding, const char *optlist) 232
void PDF_setfont(PDF *p, int font, double fontsize) 235
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) 235
void PDF_end_font(PDF *p) 236
void PDF_begin_glyph(PDF *p, char *glyphname, double wx, double llx, double lly, double urx, double ury) 236
void PDF_end_glyph(PDF *p) 237
void PDF_encoding_set_char(PDF *p, const char *encoding, int slot, const char *glyphname, int uv) 237
B PDFlib-Kurzreferenz 329
Textausgabefunktionen
Funktionsprototyp Seite
void PDF_set_text_pos(PDF *p, double x, double y) 239
void PDF_show(PDF *p, const char *text) 240
void PDF_xshow(PDF *p, const char *text, int len, const double *xadvancelist) 240
void PDF_show_xy(PDF *p, const char *text, double x, double y) 241
void PDF_continue_text(PDF *p, const char *text) 241
void PDF_fit_textline(PDF *p, const char *text, int len, double x, double y, const char *optlist) 242
double PDF_stringwidth(PDF *p, const char *text, int font, double fontsize) 245
int PDF_create_textflow(PDF *p, const char *text, int len, const char *optlist) 246
const char *PDF_fit_textflow(PDF *p, int textflow, double llx, double lly, double urx, double ury, const char
*optlist) 247
double PDF_info_textflow(PDF *p, int textflow, const char *keyword) 249
void PDF_delete_textflow(PDF *p, int textflow) 250
Grafikfunktionen
Funktionsprototyp Seite
void PDF_setdash(PDF *p, double b, double w) 256
void PDF_setdashpattern(PDF *p, const char *optlist) 256
void PDF_setflat(PDF *p, double flatness) 257
void PDF_setlinejoin(PDF *p, int linejoin) 257
void PDF_setlinecap(PDF *p, int linecap) 257
void PDF_setmiterlimit(PDF *p, double miter) 258
void PDF_setlinewidth(PDF *p, double width) 258
void PDF_initgraphics(PDF *p) 259
void PDF_save(PDF *p) 259
void PDF_restore(PDF *p) 260
void PDF_translate(PDF *p, double tx, double ty) 260
void PDF_scale(PDF *p, double sx, double sy) 260
void PDF_rotate(PDF *p, double phi) 261
void PDF_skew(PDF *p, double alpha, double beta) 261
void PDF_concat(PDF *p, double a, double b, double c, double d, double e, double f) 261
void PDF_setmatrix(PDF *p, double a, double b, double c, double d, double e, double f) 262
int PDF_create_gstate(PDF *p, const char *optlist) 262
void PDF_set_gstate(PDF *p, int gstate) 263
void PDF_moveto(PDF *p, double x, double y) 264
void PDF_lineto(PDF *p, double x, double y) 264
void PDF_curveto(PDF *p, double x1, double y1, double x2, double y2, double x3, double y3) 264
void PDF_circle(PDF *p, double x, double y, double r) 265
void PDF_arc(PDF *p, double x, double y, double r, double alpha, double beta) 265
void PDF_arcn(PDF *p, double x, double y, double r, double alpha, double beta) 266
void PDF_rect(PDF *p, double x, double y, double width, double height) 266
void PDF_closepath(PDF *p) 266
void PDF_stroke(PDF *p) 267
330 B PDFlib-Kurzreferenz
Funktionsprototyp Seite
void PDF_closepath_stroke(PDF *p) 267
void PDF_fill(PDF *p) 267
void PDF_fill_stroke(PDF *p) 268
void PDF_closepath_fill_stroke(PDF *p) 268
void PDF_clip(PDF *p) 268
void PDF_endpath(PDF *p) 268
int PDF_define_layer(PDF *p, const char *name, int len, const char *optlist) 269
void PDF_set_layer_dependency(PDF *p, const char *type, const char *optlist) 270
void PDF_begin_layer(PDF *p, int layer) 271
void PDF_end_layer(PDF *p) 271
Farbfunktionen
Funktionsprototyp Seite
void PDF_setcolor(PDF *p, const char *fstype, const char *colorspace, double c1, double c2, double c3, double c4)
272
int PDF_makespotcolor(PDF *p, const char *spotname, int reserved) 274
int PDF_load_iccprofile(PDF *p, const char *profilename, int len, const char *optlist) 274
int PDF_begin_pattern(PDF *p, double width, double height, double xstep, double ystep, int painttype) 276
void PDF_end_pattern(PDF *p) 277
int PDF_shading_pattern(PDF *p, int shading, const char *optlist) 277
void PDF_shfill(PDF *p, int shading) 278
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) 278
Rasterbildfunktionen
Funktionsprototyp Seite
int PDF_load_image(PDF *p, const char *imagetype, const char *filename, int len, const char *optlist) 281
void PDF_close_image(PDF *p, int image) 284
void PDF_fit_image(PDF *p, int image, double x, double y, const char *optlist) 285
int PDF_begin_template(PDF *p, double width, double height) 287
void PDF_end_template(PDF *p) 288
void PDF_add_thumbnail(PDF *p, int image) 288
B PDFlib-Kurzreferenz 331
Funktionsprototyp Seite
void PDF_fit_pdi_page(PDF *p, int page, double x, double y, const char *optlist) 293
int PDF_process_pdi(PDF *p, int doc, int page, const char* optlist) 294
double PDF_get_pdi_value(PDF *p, const char *key, int doc, int page, int reserved) 294
const char * PDF_get_pdi_parameter(PDF *p, const char *key, int doc, int page, int reserved, int *len) 295
Blockfunktionen
Funktionsprototyp Seite
int PDF_fill_textblock(PDF *p, int page, const char *blockname, const char *text, int len, const char *optlist) 298
int PDF_fill_imageblock(PDF *p, int page, const char *blockname, int image, const char *optlist) 299
int PDF_fill_pdfblock(PDF *p, int page, const char *blockname, int contents, const char *optlist) 300
Hypertext-Funktionen
Funktionsprototyp Seite
int PDF_create_action(PDF *p, const char *type, const char *optlist) 302
void PDF_add_nameddest(PDF *p, const char *name, int len, const char *optlist) 306
void PDF_create_annotation(PDF *p, double llx, double lly, double urx, double ury, const char *type, const char
*optlist) 308
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) 312
void PDF_create_fieldgroup(PDF *p, const char *name, int len, const char *optlist) 317
int PDF_create_bookmark(PDF *p, const char *text, int len, const char *optlist) 318
void PDF_set_info(PDF *p, const char *key, const char *value) 319
332 B PDFlib-Kurzreferenz
Parameter und Werte
Kategorie Funktion Schlüssel
Konfiguration set_parameter resourcefile, SearchPath, license, licensefile, warning, asciifile, trace, tracefile,
tracemsg
set_value compress
Versionen get_value major, minor, revision
get_parameter version
Seite get_value pagewidth, pageheight
Schrift set_parameter FontAFM, FontPFM, FontOutline, Encoding, fontwarning, kerning,
autosubsetting, autocidfont, textformat, unicodemap
get_parameter fontname, fontencoding, fontstyle, textformat
set_value subsetlimit, subsetminsize
get_value ascender, capheight, descender, font, fontsize, fontmaxcode, monospace
Text set_value leading, textrise, horizscaling, textrendering, charspacing, wordspacing,
italicangle
get_value leading, textrise, horizscaling, textrendering, charspacing, wordspacing, textx,
texty, italicangle
set_parameter autospace, underline, overline, strikeout, kerning, glyphwarning
get_parameter underline, overline, strikeout, fontstyle
Grafik set_parameter fillrule, topdown
get_parameter scope
get_value currentx, currenty
Farbe set_parameter iccwarning, honoriccprofile, ICCProfile, StandardOutputIntent, renderingintent,
preserveoldpantonenames, spotcolorlookup
set_value defaultgray, defaultrgb, defaultcmyk, setcolor:iccprofilegray,
setcolor:iccprofilergb, setcolor:iccprofilecmyk
get_value image:iccprofile, icccomponents
Rasterbild get_value imagewidth, imageheight, orientation, resx, resy
set_parameter imagewarning
PDI get_parameter pdi
set_parameter pdiwarning
get_pdi_value /Root/Pages/Count, /Rotate, version, width, height
CropBox, BleedBox, ArtBox, TrimBox: danach muss ein Schrägstrich ’/’ sowie llx,
lly, urx oder ury folgen, zum Beispiel CropBox/llx
get_pdi_ filename, /Info/<key>, vdp/Blocks/<Blockname>/<Eigenschaftsname>,
parameter vdp/Blocks/<Blockname>/Custom/<Eigenschaftsname>
Hypertext set_parameter hypertextformat, hypertextencoding, usercoordinates
get_parameter hypertextformat
B PDFlib-Kurzreferenz 333
C Änderungen an diesem Handbuch
Revisionsübersicht dieses Handbuchs
Datum Änderungen
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
0-9 builtin-Zeichensatz 99
byte order mark (BOM) 106
16-Bit-Zeichensätze 102 bytes: siehe hypertextformat
8-Bit-Zeichensätze 95 Byteserving 194
bytes-Textformat 107
A
Adobe Font Metrics (AFM) 85 C
Adobe Glyph List (AGL) 82, 99 C++-Sprachbindung 28
AFM (Adobe Font Metrics) 85
Speicherverwaltung 29
AGL (Adobe Glyph List) 82, 99
capheight-Parameter 112, 231
Aktionslisten 52
CCITT 146
aktueller Punkt 65
CCSID 97
All (Schmuckfarbname) 274
CFF (Compact Font Format) 81
alphaisshape-Option 262
Character ID (CID) 116
Alphakanal 146
Character-Referenzen 108
Anlagen 103
characters per inch (CPI) 113
Anmerkungen 103
charref-Parameter 238
antialias-Option 279
charspacing-Parameter 238
API (Application Programming Interface) 209
chinesisch 116, 118, 121
äquidistante Schrift 113
CID-Schriften 116
ArtBox 64, 214, 295, 296
CIE L*a*b* Farbraum 71
AS/400 59
ascender-Parameter 112, 231 CJK (chinesisch, japanisch, koreanisch) 116
asciifile-Parameter 59, 211 benutzerdefinierte Schriften 120
asiatisches Fontpaket 116 CMaps 117
Ausgabegenauigkeit 64 Standardschriften 117
Ausnahmebehandlung 48 Windows-Codepages 121
Ausrichtung (Option position) 243 Clipping (Beschneiden) 65
Author-Feld 320 CMaps 117, 118
autocidfont-Parameter 93, 94, 232 CMYK 67
autospace-Parameter 238 Cobol binding 19
autosubsetting-Parameter 94, 231 Codepage
auto-Textformat 107 Microsoft Windows 1250-1258 96
Unicode-Werte 102
compress-Parameter 211
B COM-Sprachbindung 23
Baseline-Kompression 145 copyoutputintent-Option 199
benutzerdefinierte Schriften (Type 3) 88 CPI (characters per inch) 113
benutzerdefinierter Zeichensatz 98 Creator-Feld 320
Berechtigungen 191 CropBox 64, 214, 295, 296
Bézier-Kurve 265 C-Sprachbindung 24
Big Five 121 Speicherverwaltung 27
Bildfunktionen 280 currentx- und currenty-Parameter 112, 264
Bildmasken 146, 148
BleedBox 64, 214, 295, 296
blendmode-Option 262 D
Blends 68 Dateianlagen 103
Blöcke 161 defaultgray/rgb/cmyk-Parameter 74, 276
Blockeigenschaften 164 Demostempel 9
Block-Plugin 161 descender-Parameter 112, 231
BMP 146 Deskriptor 92
Index 335
Dokumentfunktionen 214 äquidistante 113
Dokumentinfofelder 103, 319 asiatisches Fontpaket 116
Downsampling 144 benutzerdefinierte (Type 3) 88
dpi-Berechnungen 144 CID-Schriften 116
Drehen von Objekten 62 Deskriptor 92
Druckausgabebedingung für PDF/X 196 Glyphennamen 86
Dublin Core 319 PDF-Standardschriften 91
PFA-Dateien 85
E PFB-Dateien 85
PFM-Dateien 85
EBCDIC 59 PostScript 81, 85
ebcdic encoding 96 rechtliche Aspekte der Einbettung 93
ebcdicutf8: siehe hypertextformat Ressourcekonfiguration 54
Einheiten 61 Type 1 85
EJB (Enterprise Java Beans) 31
Type 3 (benutzerdefiniert) 88, 235
Embedded-Systeme 19
Unicode-Unterstützung 102
Encoding-Parameter 231
fontsize-Parameter 231
eServer zSeries und iSeries 59
FontSpecific-Encoding 99
EUDC (end-user defined characters) 122
Fontstilnamen für Windows 87
EUDC-Fonts 86
fontstyle-Parameter 231
Eurozeichen 100
fontwarning-Parameter 50, 231
Exceptions 48, 64
Form XObjects 65
explizite Transparenz 147
Formularfelder: Konvertierung in Blöcke 172
expliziter Grafikzustand 262
Funktionalität von PDFlib 15
extend0- und extend1-Optionen 279
Funktionsgeltungsbereich 47
F G
Farbe 67
Gaiji-Zeichen 82
Farbfunktionen 272
GBK 121
Farbverläufe 68
Geltungsbereich 47
Farbwerte in Optionslisten 52
GIF 145
FDFlib Virtual File System (PVF) 53
Glyph-ID-Adressierung 100
Fehlerbehandlung
glyphwarning-Parameter 238
API 213
Gradients 68
in C 26
Grafikfunktionen 256
in C++ 29
Grafikzustand
in Cobol 20
expliziter 262
in Java 32
Funktionen 256
in Perl 35
grid.pdf 61
in PHP 38
gstate 277
in Python 39
in RPG 42
in Tcl 45 H
filename-Parameter 296 HKS 70
Filling (Füllen) 65 Hochstellen von Text 112
fillrule-Parameter 267 honoriccprofile-Parameter 280
flatness-Option 262 horizontaler Text 117
FontAFM-Parameter 231 horizscaling-Parameter 238
fontencoding-Parameter 231 host fonts 90
fontmaxcode-Parameter 100, 231 HostFont-Parameter 231
Fontmetrik 112 host-Zeichensatz 95
fontname-Parameter 231 hypertextencoding-Parameter 107, 302
FontOutline-Parameter 231 hypertextformat-Parameter 106, 302
font-Parameter 231 Hypertext-Funktionen 302
FontPFM-Parameter 231
Fonts
AFM-Dateien 85 I
allgemein 81 IBM eServer 59
336 Index
ICC-based color 67 Literaturhinweise 327
icccomponents-Parameter 276 Lizenzierung von PDFlib und PDI 9
ICCProfile-Parameter 276 LWFN (LaserWriter Font) 85
iccwarning-Parameter 276
ignoremask 148
image:iccprofile-Parameter 73, 280
M
imagewarning-Option 144 Mac OS Classic: UPR-Konfiguration 55
macroman encoding 95, 96
imagewarning-Parameter 280
macroman-Zeichensatz 95
imagewidth- und imageheight-Parameter 280
major-Parameter 211
implizite Transparenz 147
makepsres Hilfsprogramm 54
Importfunktionen für PDF 289
mask 147
in-core PDF-Erzeugung 58
masked 147
Index-Farbe 67
Maskierung von Bildern 146
Info-Schlüssel in importierten PDF-Dokumenten
masterpassword-Parameter 192, 214
296
MediaBox 64
iSeries 59
mehrseitige Bilddateien 149
ISO 10646 102
Metadaten 218, 319
ISO 8859-2 bis -15 96
Metrik 112
italicangle-Parameter 238
metrische Koordinaten 61
Millimeter 61
J minor-Parameter 211
japanisch 116, 119, 121 miterlimit-Option 263
Java-Applikationsserver 31 monospace parameter 231
Java-Sprachbindung 30 monospaced: siehe äquidistant
EJB 31
javadoc 30 N
Package 30 .NET-Sprachbindung 33
Servlet 31 None (Schmuckfarbname) 274
JFIF 145 N-Option 279
Johab 121 Notizen 103
JPEG 145
O
K Oberlänge 112
Kachelung 67 opacityfill-Option 263
Kategorien von Ressourcen 55 opacitystroke-Option 263
Kennwörter 191 openwarning-Parameter 214
Kerning 113 optimiertes PDF 194
kerning-Parameter 114, 238 Optionslisten 51
Keywords-Feld 320 orientation-Parameter 280
kommerzielle Lizenz 10 overline-Parameter 115, 239
Koordinatensystem 61 overprintfill-Option 263
metrisch 61 overprintmode-Option 263
Top-Down 62 overprintstroke-Option 263
koreanisch 116, 119, 121
P
L page-Option 149
Laufweite 113 pagewidth- und pageheight-Parameter 214
Layer und PDI 153 PANTONE 69
leading-Parameter 112, 238 Parameterbehandlungsfunktionen 224
licensefile-Parameter 211 Passwörter 191
license-Parameter 211 Pattern-Farbraum 67
linearisiertes PDF 194, 216 patterns 67
linecap-Option 262 PDF/X 195
linejoin-Option 262 Druckausgabebedingung 294
linewidth-Option 262 Import von PDF-Dokumenten 198
Listenwerte in Optionslisten 52 PDF_activate_item() 325
Index 337
PDF_add_nameddest() 306 PDF_get_parameter() 225
PDF_add_thumbnail() 288 PDF_get_pdi_parameter 295
PDF_arc() 265 PDF_get_pdi_value 294
PDF_arcn() 266 PDF_get_value() 225
PDF_begin_document() 215 PDF_info_textflow() 249
PDF_begin_item() 323 PDF_initgraphics() 259
PDF_begin_layer() 271 PDF_lineto() 264
PDF_begin_page() 221, 222, 223, 224 PDF_load_font() 232
PDF_begin_pattern 276 PDF_load_iccprofile() 274
PDF_begin_template() 287 PDF_load_image() 281
PDF_boot() 212 PDF_makespotcolor() 274
PDF_circle() 265 PDF_moveto() 264
PDF_clip() 268 PDF_new() 212
PDF_close_image() 284 PDF_new_dl( ) 212
PDF_close_pdi 291 PDF_new2() 213
PDF_close_pdi_page 293 PDF_open_pdi 289
PDF_closepath() 266 PDF_open_pdi_callback 290
PDF_closepath_fill_stroke() 268 PDF_open_pdi_page 291
PDF_closepath_stroke() 267 PDF_process_pdi 294
PDF_concat() 261 PDF_rect() 266
PDF_continue_text() 241 PDF_restore() 260
PDF_continue_text2() 241 PDF_rotate() 261
PDF_create_action() 302 PDF_save() 259
PDF_create_annotation() 308 PDF_scale() 260
PDF_create_bookmark() 318 PDF_set_gstate() 263
PDF_create_field() 312 PDF_set_info() 319
PDF_create_fieldgroup() 317 PDF_set_info2() 319
PDF_create_gstate() 262 PDF_set_layer_dependency() 270
PDF_create_pvf 226 PDF_set_parameter() 58, 226
PDF_create_textflow() 246 PDF_set_text_pos() 239
PDF_curveto() 264 PDF_set_value() 225
PDF_define_layer() 269 PDF_setcolor() 272
PDF_delete() 213 PDF_setdash() 256
PDF_delete_dl( ) 214 PDF_setdashpattern() 256
PDF_delete_pvf 227 PDF_setflat() 257
PDF_delete_textflow() 250 PDF_setfont() 235, 236, 237
PDF_encoding_set_char() 237 PDF_setlinecap() 257
PDF_end_document() 217 PDF_setlinejoin() 257
PDF_end_item() 325 PDF_setlinewidth() 258
PDF_end_layer() 271 PDF_setmatrix() 262
PDF_end_page() 224 PDF_setmiterlimit() 258
PDF_end_pattern 277 PDF_shading() 278
PDF_end_template() 288 PDF_shading_pattern() 277
PDF_endpath() 268 PDF_shfill() 278
PDF_fill() 267 PDF_show() 240
PDF_fill_imageblock() 299 PDF_show_boxed() 246
PDF_fill_pdfblock() 300 PDF_show_xy() 241
PDF_fill_stroke() 268 PDF_show_xy2() 241
PDF_fill_textblock() 298 PDF_show2() 240
PDF_fit_image() 285 PDF_shutdown() 212
PDF_fit_pdi_page 293 PDF_skew() 261
PDF_fit_text() 242 PDF_stringwidth() 245
PDF_fit_textflow() 247 PDF_stringwidth2() 245
PDF_get_apiname() 228 PDF_stroke() 267
PDF_get_buffer() 58, 220 PDF_translate() 260
PDF_get_errmsg() 228 PDF_utf16_to_utf8 229, 230
PDF_get_errnum() 228 PDF_utf8_to_utf16() 230
PDF_get_opaque() 229 PDF_xshow() 240
338 Index
PDF-Importbibliothek PDI 151, 289 skalieren 144
PDF-Importfunktionen 289 Transparenz 146
PDFlib REALbasic-Sprachbindung 39
Funktionalität 15 Rechtecke in Optionslisten 52
Programmstruktur 47 Reflexion 260
PDFlib Personalization Server 161 renderingintent-Option 71, 263
pdflib.upr 57 renderingintent-Parameter 280
PDFlib-API-Referenz 209 Rendering-Intents 71
PDFlib-Plugin zur Blockerzeugung 161 resourcefile-Parameter 57, 211
PDFLIBRESOURCE-Umgebungsvariable 57 Ressourcekategorie 55
pdfx-Parameter Ressourcenkonfiguration 54
für PDI 199, 296 resx- und resy-Parameter 280
PDI 151, 289 revision-Parameter 211
pdi-Parameter 296 RGB-Farbe 67
pdiusebox-Parameter 153, 296 Rohbilddaten 146
pdiwarning-Option 153 Rotate-Eintrag in importierten PDF-Seiten 295
pdiwarning-Parameter 296 RPG-Sprachbindung 40
Perl-Sprachbindung 33
permissions-Option 193 S
permissions-Parameter 214
S/390 59
PFA (Printer Font ASCII) 85
Scherung 261
Pfad 65
Schmuckfarbe (Separation-Farbraum) 67, 68
zeichnen und beschneiden 267
schnelle Web-Anzeige 216
PFB (Printer Font Binary) 85
Schriften: siehe Fonts
PFM (Printer Font Metrics) 85
Schriftuntergruppen 93
PHP-Sprachbindung 35
scope-Parameter 211
Piktogramme 288
SearchPath-Parameter 56, 211, 231
Plattformen 19
Seitenbeschreibungen 61
Plugin zur Blockerzeugung 161
Seitenformate 63
PNG 145, 147
Begrenzungen in Acrobat 64
Portable Document Format Reference Manual
Seitenfunktionen 214
327
seitenweises Herunterladen 194
PostScript-Schriften 81, 85
Separation-Farbraum 67
PPS (PDFlib Personalization Server) 161
serial-Parameter 9
prefix-Parameter 211
Servlet 31
preserveoldpantonenames-Parameter 272
setcolor:iccprofilegray/rgb/cmyk-Parameter 74,
print_glyphs.ps 86
276
Printer Font ASCII (PFA) 85
Setup-Funktionen 211
Printer Font Binary (PFB) 85
Shift-JIS 121
Printer Font Metrics (PFM) 85
Sicherheit 191
Programmstruktur 47
Skalieren von Rasterbildern 144
PVF siehe PDFlib Virtual File System 53
Smooth Shadings 68
Python-Sprachbindung 38
smoothness-Option 263
Speicher: Erzeugung von PDF-Dokumenten im 58
Q Speicherverwaltung
Querformat 223 API 213
in C 27
in C++ 29
R Spiegelung 260
r0- und r1-Optionen 279 SPIFF 145
Rasterbilder spotcolorlookup-Parameter 272
allgemein 143 Sprachbindungen 19
Bildmasken 148 sRGB-Farbraum 73
Daten wiederverwenden 143 Standardausgabe 215
Downsampling 144 Standard-Druckausgabebedingungen für PDF/X
Formate 145 198
Funktionen 280 Standardkoordinatensystem 61
Rohdaten 146 StandardOutputIntent-Parameter 276
Index 339
Standardschriften 91 TrimBox 64, 214, 295, 296
Standardseitenmaße 63 TrueType Collections 120
stdout-Kanal 215 TTC (TrueType Collection) 86, 120
Stilnamen für Windows 87 TTF (TrueType-Font) 81
strikeout-Parameter 115, 239 Type-1-Schriften 85
strokeadjust-Option 263 Type-3-Schriften 88, 235
Stroking (Zeichnen) 65
Struktur von PDFlib-Programmen 47
Subject-Feld 320
U
subscript 112, 239 U+XXXX-Encoding 102
subsetlimit-Parameter 94, 231 Überschreiben von Blockeigenschaften 164
subsetminsize-Parameter 94, 231 UHC 121
superscript 112, 239 Umgebungsvariable PDFLIBRESOURCE 57
Symbolschrift 99 Umrisslinien von Text zeichnen 239
Systemschriften 90 underline-Parameter 115, 239
Systemzeichensätze 97 Unicode 102
unicodemap-Parameter 103, 232
unsichtbarer Text 239
T Untergruppen einer Schrift 93
Tcl-Sprachbindung 44 Unterlänge 112
Teilpfad 65 Unterschneidung 113
Templates 65 UPR (Unix PostScript Resource) 54
Text Dateiformat 55
Funktionen 231 Dateisuche 57
hochstellen 112 user space 61
Laufweite 113 usercoordinates-Parameter 61, 302
Oberlänge 112 userpassword-Parameter 192, 214
Position 112 utf16: siehe hypertextformat
tiefstellen 112 utf16be: siehe hypertextformat
Umrisslinien zeichnen 239 utf16le: siehe hypertextformat
unsichtbarer 239 utf8: siehe hypertextformat
Unterlänge 112
unterschneiden 113
Versalhöhe 112
V
Variable Data Processing (VDP) 298
vertikal und horizontal 117
variable Datenverarbeitung mit Blöcken 161
Zeilenabstand 112
vdp/blockcount-Parameter für PDI 297
Textanmerkungen 103
vdp/Block-Parameter für PDI 297
Textbehandlung 81
Verfügbarkeit von PDFlib 19
textformat-Parameter 106, 239
Versalhöhe 112
textknockout-Option 263
Verschlüsselung 191
Textmetrik 112
version-Parameter 211, 296
textrendering-Parameter 115, 239
vertikaler Text 117
textrise-Parameter 239
virtuelles Dateisystem 53
Textvarianten 112
textx- und texty-Parameter 112, 120, 239
Thumbnails: siehe Piktogramme W
Tiefstellen von Text 112 warning-Parameter 49, 227
TIFF 145 web-optimiertes PDF 194, 216
mehrseitig 149 width- und height-Parameter 295
Title-Feld 320 winansi-Zeichensatz 96
Top-Down-Koordinaten 62 wordspacing-Parameter 239
topdown-Parameter 63, 214
ToUnicode CMap 84, 103
trace, tracefile, tracemsg parameters 212 X
Transparenz 146 XMP-Metadaten 218
explizite 147 XObjects 65
implizite 147
Probleme mit 148
Trapped-Feld 320
340 Index
Z
ZapfDingbats-Schrift 99
Zeichennamen 86
Zeichensätze 95
benutzerdefinierte 98
CJK 117
für Hypertext 107
vom System beziehen 97
Zeilenabstand 112
Zoll 61
zSeries 59
Index 341