Version 4.0.3
Transcription
Version 4.0.3
PDFlib GmbH München Referenzhandbuch ® Eine Bibliothek für dynamisches PDF Version 4.0.3 ActiveX/COM- und .NET-Edition www.pdflib.com Copyright © 1997–2002 PDFlib GmbH und Thomas Merz. Alle Rechte vorbehalten. PDFlib GmbH Tal 40, 80331 München, Deutschland http://www.pdflib.com Tel. +49 • 89 • 29 16 46 87 Fax +49 • 89 • 29 16 46 86 Bei Fragen können Sie sich zunächst die PDFlib-Mailing-Liste und deren Archiv ansehen unter: http://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 Dokumentation 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 Verwendbarkeit 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 Warenzeichen von Unicode, Inc. Unix ist ein Warenzeichen von The Open Group. Java und Solaris sind Warenzeichen von Sun Microsystems, Inc. Die Namen von anderen Produkten und Diensten können Warenzeichen von Unternehmen oder Organisationen sein, die hier nicht angeführt sind. PDFlib enthält modifizierte Bestandteile folgender Software anderer Hersteller: PNG Image Reference Library (libpng), Copyright © 1998, 1999, 2000 Glenn Randers-Pehrson Zlib Compression Library, Copyright © 1995-1998 Jean-loup Gailly und Mark Adler TIFFlib Image Library, Copyright © 1988-1997 Sam Leffler, Copyright © 1991-1997 Silicon Graphics, Inc. PDFlib enthält den Message-Digest-Algorithmus MD5 von RSA Security, Inc. Viva Software GmbH (software.viva.de) trug Verbesserungen für die Fontverarbeitung auf dem Mac bei. Autor: Thomas Merz Grafiken und Design: Alessio Leonardi Deutsche Übersetzung: Katja Karsunke Qualitätskontrolle (Manual): Petra Porst, York Karsunke Qualitätskontrolle (Software): ein paar tausend Freiwillige Inhaltsverzeichnis 1 Einführung 9 1.1 Programmierung mit PDFlib 9 1.2 Funktionalität von PDFlib 12 1.3 Ausgabe und Kompatibilität von PDFlib 12 2 Sprachbindungen von PDFlib 14 2.1 Übersicht 14 2.1.1 Was hat es mit all den Sprachbindungen auf sich? 14 2.1.2 Verfügbarkeit und Plattformen 14 2.1.3 Das Beispiel »Hello world« 14 2.1.4 Fehlerbehandlung 15 2.1.5 Versionskontrolle 15 2.1.6 Unicode-Unterstützung 16 2.1.7 Übersicht über die Sprachbindungen 16 2.2 ActiveX/COM-Sprachbindung 16 2.2.1 Arbeitsweise 16 2.2.2 Installation der ActiveX-Edition von PDFlib 17 2.2.3 Silent-Installation 18 2.2.4 Anwendungsszenarien 19 2.2.5 Fehlerbehandlung in ActiveX 20 2.2.6 Versionskontrolle in ActiveX 21 2.2.7 Unicode-Unterstützung in ActiveX 21 2.2.8 Einsatz von PDFlib mit Active Server Pages 22 2.2.9 Einsatz von PDFlib mit Visual Basic 26 2.2.10 Einsatz von PDFlib mit Windows Script Host 28 2.2.11 Einsatz von PDFlib mit ColdFusion 29 2.2.12 Einsatz von PDFlib mit Borland Delphi 30 2.3 C-Sprachbindung 32 2.4 C++-Sprachbindung 32 2.5 Java-Sprachbindung 32 2.6 .NET-Sprachbindung 32 2.6.1 Arbeitsweise 32 2.6.2 Installation von PDFlib.NET 32 2.6.3 Silent-Installation 33 2.6.4 Fehlerbehandlung in .NET 33 2.6.5 Versionskontrolle in .NET 33 2.6.6 Unicode-Unterstützung in .NET 33 2.6.7 Einsatz von PDFlib mit C# 34 2.6.8 Einsatz von PDFlib mit Visual Basic .NET 35 2.6.9 PDFlib ist nicht für ASP.NET freigegeben 37 Inhaltsverzeichnis 3 2.7 Perl-Sprachbindung 37 2.8 PHP-Sprachbindung 37 2.9 Python-Sprachbindung 37 2.10 RPG-Sprachbindung 37 2.11 Tcl-Sprachbindung 37 3 PDFlib- und PDI-Programmierung 38 3.1 Allgemeine Aspekte 38 3.1.1 Struktur eines PDFlib-Programms 38 3.1.2 Erzeugung von PDF-Dokumenten im Arbeitsspeicher 38 3.1.3 Fehlerbehandlung 39 3.2 Seitenbeschreibungen 40 3.2.1 Koordinatensysteme 40 3.2.2 Begrenzungen für Seiten und Koordinaten 42 3.2.3 Pfade und Farben 43 3.2.4 Templates 44 3.3 Textbehandlung 46 3.3.1 Die PDF-Standardschriften 46 3.3.2 In PDFlib integrierte 8-Bit-Zeichensätze 46 3.3.3 Benutzerdefinierte 8-Bit-Zeichensätze und Codepages 48 3.3.4 Das Eurozeichen 51 3.3.5 Zeichensätze für Hypertext 52 3.3.6 PostScript-, TrueType- und OpenType-Schriften 53 3.3.7 Ressourcekonfiguration und die UPR-Ressourcedatei 57 3.3.8 Japanischer, chinesischer und koreanischer Text 60 3.3.9 Unicode-Unterstützung 65 3.3.10 Textmetrik, Textvarianten und Formatierung in ein Rechteck 67 3.4 Verwendung von Rasterbildern 71 3.4.1 Unterstützte Rasterbildformate 71 3.4.2 Häufig benötigte Codefragmente für Rasterbilder 74 3.4.3 Wiederverwendung von Bilddaten 76 3.4.4 Bilddaten im Speicher und externe Bildreferenzen 76 3.4.5 Bildmasken und Transparenz 76 3.4.6 Einfärben von Bildern 79 3.4.7 Mehrseitige Bilddateien 80 3.5 PDF-Import mit PDI 80 3.5.1 PDI-Funktionen und -Anwendungen 80 3.5.2 Einsatz von PDI-Funktionen mit PDFlib 81 3.5.3 Importierbare PDF-Dokumente 83 3.5.4 PDF-Import, Templates und Vererbung des Grafik- und Textzustands 84 4 Inhaltsverzeichnis 4 PDFlib- und PDI-API-Referenz 85 4.1 Datentypen, Namenskonventionen und Geltungsbereiche 85 4.2 Allgemeine Funktionen 86 4.2.1 Setup 86 4.2.2 Dokument und Seite 87 4.2.3 Parameterbehandlung 89 4.3 Textfunktionen 90 4.3.1 Fontbehandlung 90 4.3.2 Textausgabe 92 4.4 Grafikfunktionen 96 4.4.1 Funktionen für den Grafikzustand 96 4.4.2 Speichern und Wiederherstellen des Grafikzustands 99 4.4.3 Funktionen zur Transformation des Koordinatensystems 100 4.4.4 Pfadkonstruktion 102 4.4.5 Zeichnen und Beschneiden von Pfaden 104 4.5 Farbfunktionen 106 4.6 Rasterbildfunktionen 109 4.7 Funktionen zum PDF-Import (PDI) 114 4.7.1 Dokument und Seite 114 4.7.2 Parameterbehandlung 116 4.8 Hypertextfunktionen 118 4.8.1 Aktion und Modus beim Öffnen des Dokuments 118 4.8.2 Lesezeichen 118 4.8.3 Dokumentinfofelder 120 4.8.4 Seitenübergänge 120 4.8.5 Dateianlagen 121 4.8.6 Notizen 122 4.8.7 Verknüpfungen (Links) 122 4.8.8 Piktogramme (Thumbnails) 125 4.9 Seitenformate 126 5 Die PDFlib-Lizenz 127 5.1 Die »Aladdin Free Public License« 127 5.2 Die kommerzielle PDFlib-Lizenz 127 6 Literaturhinweise 128 A Dynamische Bibliotheken (DLLs) B PDFlib-Kurzreferenz 129 130 C Änderungen an diesem Handbuch 134 Inhaltsverzeichnis 5 Index 6 135 Inhaltsverzeichnis 0 Anwendung des PDFlibLizenzschlüssels Alle Binärversionen von PDFlib und PDI, die Sie von PDFlib GmbH beziehen, sind als Entwicklungsversionen in vollem Funktionsumfang verwendbar, unabhängig davon, ob Sie eine kommerzielle Lizenz erworben haben oder nicht. Bei nicht lizenzierten Versionen wird jedoch quer über allen generierten Seiten der Demostempel www.pdflib.com ausgegeben. Unternehmen, die an einer Lizenzierung von PDFlib interessiert sind und den Demostempel in der Evaluierungsphase oder ersten Demos vermeiden möchten, können ihre Firmen- und Projektdaten an [email protected] senden und einen temporären Lizenzschlüssel anfordern. Nachdem Sie einen Lizenzschlüssel für PDFlib oder PDI erworben haben, müssen Sie ihn erst noch anwenden, damit der Demostempel auch tatsächlich unterdrückt wird. Dazu gibt es mehrere Möglichkeiten: > Fügen Sie in Ihrem Skript oder Programm eine Zeile ein, die die Seriennummer zur Laufzeit setzt: oPDF.set_parameter("serial", "...Ihre Seriennummer...") Die Seriennummer darf nur einmal gesetzt werden, und dies muss unmittelbar nach der Instantiierung des PDFlib-Objekts erfolgen . > Setzen Sie eine Umgebungsvariable (Shellvariable), bevor Sie PDFlib-Funktionen aufrufen. Wie Sie dazu genau vorgehen, hängt vom jeweiligen System an. Der Befehl in einer Unix-Shell könnte zum Beispiel wie folgt aussehen: export PDFLIBSERIAL="...Ihre Seriennummer..." > Benutzer der ActiveX/COM- oder .NET-Edition können die Seriennummer auch übergeben, wenn sie PDFlib/PDI mit der mitgelieferten Installationsroutine installieren. In diesem Fall ist der obige Funktionsaufruf überflüssig (siehe auch Abschnitt 2.2.2, »Installation der ActiveX-Edition von PDFlib«, Seite 17). Beachten Sie, dass PDFlib und PDI unterschiedliche Produkte sind, die unterschiedliche Seriennummern benötigen, obwohl sie in demselben Paket ausgeliefert werden. PDI-Seriennummern gelten zwar auch für PDFlib, aber nicht umgekehrt. Außerdem sind die Seriennummern für PDFlib und PDI plattformabhängig und können somit nur auf der Plattform verwendet werden, für die sie erworben wurden. 7 1 Einführung 1.1 Programmierung mit PDFlib Was ist PDFlib? PDFlib ist eine Bibliothek, mit der Sie Dateien im Portable Document Format (PDF) von Adobe erstellen können. PDFlib fungiert als Backend für Ihre Programme. Sie als Programmierer sind verantwortlich für die Verwaltung der zu verarbeitenden Daten, und PDFlib übernimmt die Generierung des PDF-Codes, der die Daten grafisch darstellt. Die Formatierung und Anordnung der Text- und Grafikobjekte bleibt zwar Ihre Aufgabe, Sie brauchen sich aber nicht um einzelne Details des komplexen PDF-Formats zu kümmern. PDFlib bietet zahlreiche nützliche Funktionen zur Erstellung von Text, Vektorgrafik, Rasterbildern und Hypertextelementen in PDF. Wie wird PDFlib eingesetzt? PDFlib ist auf verschiedensten Plattformen einsetzbar, unter anderem auf Unix, Windows, Mac OS und EBCDIC-basierten Systemen wie IBM eServer iSeries 400 und zSeries S/390. PDFlib ist in der Programmiersprache C geschrie- Abb. 1.1 Das Innenleben von PDFlib PHP Tcl Perl ) c( ar F_ PD t( ) etfon PDF_s () eto _lin F D P PD F_s ho w( ) ( cle cir _ F PD Python ) Java C C++ Activ eX 1.1 Programmierung mit PDFlib 9 ben, unterstützt aber den Zugriff von diversen anderen Programmersprachen und Programmierumgebungen, die Sprachbindungen genannt werden und alle verbreiteten Sprachen für Webanwendungen umfassen. Das Application Programming Interface (API) ist einfach zu erlernen und für alle Sprachbindungen gleich. Derzeit werden folgende Sprachbindungen unterstützt: > ActiveX/COM für den Einsatz mit Visual Basic, Active Server Pages mit VBScript oder JScript, Allaire ColdFusion, Borland Delphi, Windows Script Host und anderen Umgebungen > ANSI C > ANSI C++ > Java inklusive Servlets > .NET für den Einsatz mit C#, VB.NET und anderen Umgebungen > PHP > Perl > Python > RPG (IBM eServer iSeries 400) > Tcl Wozu kann man PDFlib verwenden? PDFlib wird hauptsächlich dazu verwendet, im World Wide Web aus eigener Software heraus dynamisch PDF zu generieren. Genauso wie sich auf dem Webserver dynamisch HTML-Seiten erzeugen lassen, können Sie ein PDFlib-Programm schreiben, das dynamisch PDF erzeugt, zum Beispiel in Reaktion auf Benutzereingaben oder auf Basis von Daten, die dynamisch aus der Datenbank des Webservers abgerufen werden. Die Arbeitsweise und Struktur von PDFlib bietet mehrere Vorteile: > PDFlib kann unmittelbar in die Anwendung, die für die Datengenerierung zuständig ist, integriert werden. Damit wird der umständliche Weg über »Anwendung – PostScript – Acrobat Distiller – PDF« überflüssig. > Aufgrund dieser Vereinfachung bietet PDFlib die schnellstmögliche Methode zur Generierung von PDF, die sich ideal für den Einsatz im Web eignet. > Durch Thread-Sicherheit, stabile Speicherverwaltung und Fehlerbehandlung wird die Implementierung von Server-Anwendungen mit höchsten Performance-Anforderungen unterstützt. > PDFlib ist für eine Vielzahl von Betriebssystemen und Entwicklungsumgebungen verfügbar. PDFlib kann jedoch nicht nur zur dynamischen Erzeugung von PDF im Web eingesetzt werden. Genauso wichtig sind Konverter von X nach PDF, wobei X für ein beliebiges Text- oder Grafikdateiformat steht. Auch in diesem Fall verkürzt sich der Weg von »X– PostScript–PDF« zu »X–PDF«. Dies bringt zahlreiche Vorteile für gängige Grafikdateiformate wie zum Beispiel TIFF, GIF, PNG und JPEG. Mithilfe eines solchen PDF-Konverters lassen sich große Mengen von Text- oder Grafikdateien im Batch-Verfahren viel einfacher konvertieren als mit Adobe Acrobat. Anforderungen an den Einsatz von PDFlib. Mit PDFlib können Sie PDF generieren, ohne sich vorher durch die mehr als 900 Seiten starke PDF-Spezifikation zu quälen. Der Einsatz von PDFlib setzt zwar kein Wissen über die technischen Einzelheiten des PDFFormats voraus, ein allgemeines 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 10 Kapitel 1: Einführung (ActiveX/COM- und .NET-Edition) Tabelle 1.1 PDFlib-Funktionalität zur PDF-Generierung Kategorie Funktionalität PDF-Import > vorhandene PDF-Dokumente können mit der optionalen PDF-Import-Bibliothek (PDI) importiert werden PDF-Ausgabe > PDF-Dokumente beliebiger Länge, direkt im Arbeitsspeicher (für Webserver) oder auf Festplatte Vektorgrafik Schriften > beliebige Anzahl von Seiten und beliebige Seitenformate > Kompression von Text, Vektorgrafik, Rasterbilddaten und Dateianlagen > Kompatibilitätsmodus für PDF 1.2, 1.3 und 1.4 (Acrobat 3, 4 und 5) > übliche Basisfunktionen für Vektorgrafik: Linienzüge, Kurvenzüge, Kreise, Rechtecke etc. > Vektorpfade zum Zeichnen, Füllen und Beschneiden > Graustufen, RGB, CMYK und Schmuckfarbe zum Zeichnen und Füllen von Objekten > Füllen von Flächen und Durchziehen von Linien mit Mustern > effiziente Wiederverwendung von Text oder Vektorgrafik durch Templates > Textausgabe in verschiedenen Schriften; unterstrichener, überstrichener, durchgestrichener Text > Formatieren von Text > Unterstützung der Schriftformate TrueType, PostScript Type 1 (Dateiformate PFB und PFA, plus LWFN auf dem Mac) und OpenType mit oder ohne Schrifteinbettung; Auf Windows und Mac können im System installierte TrueType-Schriften genutzt werden. Hypertext > Unterstützung von AFM- und PFM-Metrikdateien für PostScript-Fonts > Bibliotheksclients können Zeichenmetrik zur exakten Formatierung abrufen > auf IBM eServer iSeries 400 und zSeries S/390: Abfragen von Encodings vom Betriebssystem > Seitenübergänge in der Vollbildanzeige > Verschachtelte Lesezeichen > PDF-Verknüpfungen, Links auf andere Dokumenttypen und Weblinks > Dokumentinformation: vier Standardfelder (Titel, Thema, Autor, Stichwörter) plus unbegrenzte Anzahl von benutzerdefinierten Infofeldern (zum Beispiel Artikelnummer) Internationalisierung Unicode > Dateianlagen und Notizen > Unicode-Unterstützung (siehe unten) > Unterstützung verschiedenster Encodings (sowohl integriert als auch benutzerdefiniert) > Unterstützung von CID-Schriften und CMaps für chinesisch, japanisch und koreanisch > Unterstützung des Eurozeichens > Unterstützung internationaler Standards und herstellerspezifischer Codepages > Unicode-Unterstützung für Hypertextfunktionen: Lesezeichen, Inhalt und Titel von Notizen, Dokumentinfofelder, Beschreibung und Autor von Dateianlagen Rasterbilder Programmierung > Unicode-Codepages für TrueType- und PostScript-Schriften > Unicode-Encoding für japanischen, chinesischen und koreanischen Text > Einbettung von Rasterbildern in den Formaten GIF (nicht-interlaced), PNG, TIFF, JPEG und CCITT > Rasterbilder, die vom Client direkt im Speicher erzeugt werden > Effiziente Wiederverwendung der Bilddaten, zum Beispiel für Logos auf jeder Seite > transparente (maskierte) Bilder und Bildmasken (eingefärbte Bilder) > Einfärben von Bildern mit Schmuckfarbe > Sprachbindungen für ActiveX/COM, C, C++, Java (inkl, Servlets), .NET, Perl, PHP, Python, RPG, Tcl > transparente Unicode-Behandlung für ActiveX, Java und Tcl > Thread-Sicherheit zum Einsatz in »multi-threaded« Serveranwendungen > Error-Handler und Speicherverwaltung konfigurierbar für C und C++ > Ausnahmebehandlung integriert in die Ausnahmebehandlung der Zielsprache > verfügbar für verschiedenste Systeme, einschließlich ASCII- und EBCDIC-basierter Plattformen 1.1 Programmierung mit PDFlib 11 auch ein Anwendungsprogrammierer, der bereits mit einem Grafik-API für Bildschirmanzeige oder Ausdruck gearbeitet 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. In diesem Handbuch werden keine Acrobat-Funktionen erklärt. Diesbezügliche Informationen finden Sie in der Literatur zu Acrobat und in den Literaturhinweisen am Ende dieses Handbuchs. 1.2 Funktionalität von PDFlib Tabelle 1.1 zeigt eine Liste der wichtigsten PDFlib-Funktionen zum Erstellen von PDFDokumenten. 1.3 Ausgabe und Kompatibilität von PDFlib PDFlib-Ausgabe. Die von PDFlib generierte binäre PDF-Ausgabe ist mit dem FlateAlgorithmus (auch als ZIP bekannt) komprimiert, wobei sich die Kompression wahlweise deaktivieren lässt. Komprimiert werden Elemente, die sehr groß werden können, wie zum Beispiel Dateianlagen oder Rasterbilder (sofern sie nicht bereits vorkomprimiert sind, wie es etwa bei JPEG der Fall ist), außerdem Text- und Vektoroperatoren auf Seitenbeschreibungen. Die Abwägung zwischen Kompressionsgeschwindigkeit und Ausgabegröße lässt sich über einen PDFlib-Parameter steuern. Funktionalität von Acrobat 4. Wir sind generell darum bemüht, PDF-Dokumente zu erstellen, die von einem breiten Spektrum von PDF-Viewern verwendbar sind. Die von PDFlib generierte Ausgabe ist zu Acrobat 3 oder höher kompatibel. Manche Merkmale erfordern jedoch Acrobat 4 oder funktionieren nur in der Acrobat-Vollversion und nicht in Acrobat Reader. Eine Übersicht dazu zeigt Tabelle 1.2. Weitere Informationen hierzu finden Sie in der jeweiligen Funktionsbeschreibung. Tabelle 1.2 PDFlib-Funktionen, die Acrobat 4 oder höher benötigen Kategorie Bemerkungen Hypertext > Dateianlagen werden in Acrobat 3 nicht erkannt (Acrobat-4-Vollversion erforderlich) > verschiedene Symbole für Notizen werden in Acrobat 3 nicht erkannt > in Acrobat 4 wurde die maximale Seitengröße in PDF-Dateien erhöht > keine Unterstützung von Unicode-Hypertext in Acrobat 3 > keine Unterstützung des Eurozeichens in Acrobat 3 > keine Unicode-Unterstützung für TrueType-Schriften in Acrobat 3 > CID-Schriften für Chinesisch, Japanisch und Koreanisch benötigen Acrobat 3J oder Acrobat 4 > Der »Pattern«-Farbraum wird im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt (Füll- Seitengröße Unicode Schriften Farbe muster werden mit Acrobat 3 zwar gedruckt, aber nicht am Bildschirm angezeigt) Transparenz JPEG-Bilder externe Bilder 12 > Informationen bezüglich Transparenz werden in Acrobat 3 ignoriert > Acrobat 3 unterstützt nur Bilder mit Baseline- und nicht solche mit Progressive-Kompression > Acrobat 4 (aber nicht der kostenlose Acrobat Reader) unterstützt Referenzen auf externe Rasterbilder über einen URL. Acrobat 3 kann auf diese Art referenzierte Bilder nicht anzeigen. Kapitel 1: Einführung (ActiveX/COM- und .NET-Edition) Kompatibilitätsmodus für Acrobat 3. Wenn Sie keine spezielle Acrobat-4-Funktionalität einsetzen, sind die erzeugten PDF-Dateien im Prinzip zu Acrobat 3 und 4 kompatibel. Aufgrund eines seltenen Kompatibilitätsproblems bei bestimmten Ausgabegeräten bietet PDFlib aber auch einen strengen Kompatibilitätsmodus für Acrobat 3. Um das Problem zu verstehen, muss man zwischen der tatsächlich für eine bestimmte PDFDatei erforderlichen Acrobat-Viewerversion und der allerersten Zeile in der Datei unterscheiden, die %PDF-1.2 bei zu Acrobat 3 kompatiblen Dateien und %PDF-1.3 bei zu Acrobat 4 kompatiblen Dateien lautet. Acrobat-3-Viewer können Dateien, die mit der Zeile %PDF1.3 beginnen, problemlos öffnen, sofern diese keine Acrobat-4-Funktionalität enthält. Auf diesem Verhalten basiert das Verfahren von PDFlib zur Kompatibilität verschiedener Versionen. Im Gegensatz zu Acrobat gibt es jedoch auch PDF-Viewer, die eine wesentlich strengere Art der Versionssteuerung implementieren: Sie weisen einfach alle Dateien ab, die mit der Zeile %PDF-1.3 beginnen, unabhängig davon, ob der eigentliche Inhalt einen Interpreter für PDF 1.2 oder für PDF 1.3 benötigt. Von einigen EfI-RIPs für digitale Druckmaschinen ist zum Beispiel bekannt, dass sie sich in dieser Art (fehl-)verhalten. Um das Problem zu umgehen, bietet PDFlib einen strikten Kompatibilitätsmodus für Acrobat 3, in welchem eine Anfangszeile mit %PDF-1.2 ausgegeben und alle Acrobat-4-Funktionen deaktiviert werden. Um es noch einmal zu betonen: Der in PDFlib verfügbare strikte Kompatibilitätsmodus für Acrobat 3 ist nicht erforderlich, um sicherzustellen, dass PDF-Dateien in Acrobat 3 geöffnet werden können – dies ist automatisch der Fall, wenn Sie keine der oben erwähnten Acrobat-4-Funktionen verwenden. Der strenge Modus ist nur sehr selten erforderlich, und zwar genau dann, wenn Sie mit einem dieser sich so merkwürdig verhaltenden PDF-fähigen RIPs zu tun haben. Kompatibilität zu Acrobat 5. PDFlib akzeptiert zu Acrobat 5 kompatible PDF-Dateien beim Import und wird in zukünftigen Versionen auch Acrobat-5-Funktionalität generieren. Die Ausgabe-Kompatibilität kann auf PDF 1.4 (=Acrobat 5) eingestellt werden, wenn zu Acrobat 5 kompatible PDF-Dateien in das generierte Dokument importiert werden sollen. Die PDF-Importbibliothek PDI bietet vollständige Unterstützung von PDF 1.4 (siehe Abschnitt 3.5.2, »Einsatz von PDI-Funktionen mit PDFlib«, Seite 81). 1.3 Ausgabe und Kompatibilität von PDFlib 13 2 Sprachbindungen von PDFlib 2.1 Übersicht 2.1.1 Was hat es mit all den Sprachbindungen auf sich? Die Programmiersprache C war jahrzehntelang maßgebliches Werkzeug bei der Entwicklung von System- und Anwendungssoftware. Seit geraumer Zeit gibt es eine ganze Reihe anderer Sprachen, die sich entweder auf neue Programmierparadigmen stützen (zum Beispiel C++), den Weg zu leistungsfähigen und plattformunabhängigen Skripten bereiten (zum Beispiel Perl, Tcl oder Python), eine neue Qualität in der Portierbarkeit versprechen (zum Beispiel Java) oder eine Verbindung zwischen unterschiedlichsten Techniken schaffen und dabei plattformabhängig sind (zum Beispiel ActiveX/COM). Hinweis Die vorliegende Handbuchausgabe befasst sich nur mit der ActiveX/COM- und .NET-Edition von PDFlib. Alle anderen Sprachbindungen werden ausführlich in einer anderen Ausgabe des Handbuchs erläutert. Abschnitte, die für Benutzer der ActiveX/COM-Edition von PDFlib nicht relevant sind, wurden in dieser Ausgabe weggelassen. 2.1.2 Verfügbarkeit und Plattformen Die Funktionalität von PDFlib ist auf allen Plattformen und in allen Sprachbindungen identisch (mit ein paar kleineren Ausnahmen, auf die im Handbuch hingewiesen wird). In Anbetracht des von PDFlib unterstützten immensen Spektrums an Plattformen und Sprachen (und zahlreichen verschiedenen Versionen) dürfte es nicht überraschen, dass nicht alle Kombinationen von Plattformen, Sprachen und Versionen getestet werden konnten. Wir sind aber nach Kräften bemüht, PDFlib mit den neuesten Versionen der jeweiligen Umgebungen lauffähig zu machen. Tabelle 2.1 zeigt die Kombinationen aus Sprache und Plattform, die wir für unsere Tests verwendet haben. PDFlib auf Embedded-Systemen. PDFlib kann auch auf Embedded-Systemen eingesetzt werden. Die Bibliothek wurde auf die Umgebungen Windows CE und EPOC sowie auf kundenspezifische Embedded-Systeme portiert. Zum Einsatz in eingeschränkten Umgebungen sind bestimmte Eigenschaften konfigurierbar, um den Speicherbedarf von PDFlib zu reduzieren. Wenn Sie an Einzelheiten interessiert sind, setzen Sie sich mit uns über [email protected] in Verbindung. 2.1.3 Das Beispiel »Hello world« Für unsere Programmierbeispiele haben wir uns für den Klassiker »Hello, world!« entschieden. Er nutzt PDFlib zur Erzeugung einer einseitigen PDF-Datei mit etwas Text auf der Seite. In den folgenden Abschnitten wird das Beispiel »Hello world« für alle unterstützten Sprachbindungen vorgeführt. Der Code für alle Sprachbeispiele ist in der PDFlib-Distribution enthalten. Die Distribution umfasst einfache Beispiele für die Behandlung von Text, Vektorgrafik und Rasterbildern sowie den PDF-Import für alle unterstützten Sprachbindungen. 14 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) Tabelle 2.1 Getestete Kombinationen von Sprachen und Plattformen Windows Mac OS (Classic) IBM eServer iSeries 400, zSeries S/390 ActiveX/COM – ASP (PWS, IIS 4 und 5) WSH (VBScript 5, JScript 5) Visual Basic 6.0 Borland Delphi 5 und 6 ColdFusion 4.5 – – ANSI C gcc und andere ANSI-CCompiler Microsoft Visual C++ 6.0 Metrowerks CodeWarrior 6, 7 Borland C++ Builder 5 Metrowerks CodeWarrior 6, 7 IBM c89 SAS C für MVS ANSI C++ gcc und andere ANSI- Microsoft Visual C++ 6.0 C++-Compiler Metrowerks CodeWarrior 6, 7 Metrowerks CodeWarrior 6, 7 IBM c89 Java Sun JDK 1.2.2 und 1.3 IBM JDK 1.1.8 Inprise JBuilder 3.5 Kaffe OpenVM 1.0.5 Sun JDK 1.1.8, 1.2.2 und 1.3 Inprise JBuilder 3.5 und 4 JRun 3.0 ColdFusion 4.5 MRJ 2.2, basiert auf JDK 1.1.8 JDK 1.2, 1.3 .NET – .NET Framework 1.0 – – Perl Perl 5.005, 5.6 ActivePerl 5.005 und 5.6 MacPerl 5.2.0r4 und 5.6.1a5 – Sprache Unix (Linux, Solaris, HP-UX, AIX u.a.) PHP PHP 4.04 - 4.2.1 PHP 4.04 - 4.2.1 – – Python Python 1.6, 2.0 - 2.2 Python 1.6, 2.0 - 2.2 Python 2.0 und 2.1.1 – RPG – – – V3R7M0 und höher Tcl Tcl 8.3.2 und 8.4a2 Tcl 8.3.2 und 8.4a2 Tcl 8.3.2 – 2.1.4 Fehlerbehandlung PDFlib bietet ausgefeilte Mechanismen zum Umgang mit verschiedenartigen Programmier- und Laufzeitfehlern. Um eine nahtlose Integration in die jeweilige Sprachumgebung zu gewährleisten, wird die Fehlerbehandlung von PDFlib in die der jeweiligen Sprache eigenen Ausnahmebehandlung integriert. C- und C++-Clients können benutzerdefinierten Code installieren, der im Fehlerfall aufgerufen wird. Andere Sprachbindungen arbeiten mit den Ausnahmemechanismen, die in allen modernen Sprachen vorhanden sind. Weitere Informationen über die Ausnahmebehandlung von PDFlib finden Sie in Abschnitt 3.1.3, »Fehlerbehandlung«, Seite 39. Die Abschnitte, die sich in diesem Kapitel mit der Fehlerbehandlung befassen, behandeln sprachspezifische Details der unterstützten Umgebungen. 2.1.5 Versionskontrolle In Anbetracht der kurzen Entwicklungszyklen von Software im allgemeinen und Internet-Software im besonderen ist es wichtig, zukünftige Verbesserungen so einzuplanen, dass vorhandene Clients davon nicht beeinträchtigt werden. Um Kompatibilität zwischen verschiedenen Versionen der Bibliothek zu gewährleisten, unterstützt PDFlib mehrere Mechanismen zur Versionskontrolle, die von der jeweiligen Sprache abhängen. Wenn die Sprache selbst einen Versionierungsmechanismus unterstützt, so wird dieser von PDFlib nahtlos integriert. Der Client braucht sich dann nicht um Versionierung zu kümmern, sondern verwendet einfach die von der Sprache gebotenen Mechanismen. Wenn die Sprache selbst keine geeigneten Versionierungsmöglichkeiten bietet, liefert PDFlib auf Schnittstellenebene eigene Major-, Minor- und Revision-Versionsnum- 2.1 Übersicht 15 mern. Anhand dieser Nummern kann der Client entscheiden, ob die jeweilige PDFlibImplementierung verwendet werden kann oder abgelehnt werden muss, weil eine neuere Version erforderlich ist. 2.1.6 Unicode-Unterstützung PDFlib bietet Unicode-Unterstützung für zahlreiche Funktionen (Einzelheiten hierzu finden Sie in Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65). Die Sprachbindungen weisen allerdings Unterschiede in der nativen Unicode-Unterstützung auf. Unterstützt eine Sprachbindung Unicode-Strings, so erkennt der zugehörende PDFlib-Sprachwrapper dies und verarbeitet die Unicode-Strings automatisch auf korrekte Art und Weise. 2.1.7 Übersicht über die Sprachbindungen Zum schnellen Nachschlagen zeigt Tabelle 2.2 eine Übersicht über die wesentlichen Eigenschaften der verschiedenen PDFlib-Sprachbindungen. Weitere Informationen finden Sie in den jeweiligen Handbuchabschnitten. Tabelle 2.2 Übersicht über die Eigenschaften der verschiedenen Sprachbindungen UnicodeKonvertierung Versionskontrolle EBCDICthread-sicher sicher COM/ActiveX COM-Exceptions ja Class ID und ProgID ja (boththreading) – C vom Client gelieferter ErrorHandler – manuell ja ja Sprache benutzerdefinierte Fehlerbehandlung C++ C++-Exceptions – manuell ja ja Java Java-Exceptions ja automatisch ja ja NET .NET-Exceptions ja Major/Minor/ Revision ja – Perl Perl-Exceptions – über PackageMechanismus – – PHP PHP-Warnungen – manuell ja – Python Python-Exceptions – manuell – – RPG RPG-Exceptions – manuell – ja Tcl Tcl-Exceptions ja (Tcl 8.2 und höher) über PackageMechanismus ja – 2.2 ActiveX/COM-Sprachbindung 2.2.1 Arbeitsweise COM (Component Object Model)1, das von Microsoft entwickelt wurde, ist ein leistungsfähiges Verfahren zur Wiederverwendung von Software-Komponenten. Dabei spielt es keine Rolle, welche Programmiersprache auf der Client-Seite (dem Benutzer der Komponente) oder auf der Server-Seite (der Komponente selbst) eingesetzt wird. Theoretisch 1. Weitere Informationen zu COM und ActiveX finden Sie unter http://www.microsoft.com/com. 16 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) ist COM ein plattformunabhängiger Binärstandard, über den Clients mit Servern im selben Prozess auf demselben Rechner oder auf einem anderen Rechner im Netz kommunizieren können. In der Praxis jedoch ist COM ein Standard für Windows . ActiveX baut auf der COM-Technik von Microsoft auf. Es wird in erster Linie zur Entwicklung interaktiver Inhalte für das World Wide Web verwendet, kann aber auch in Desktop- und anderen Anwendungen eingesetzt werden. Die wiederverwendbaren Software-Komponenten werden ActiveX-Controls genannt (früher OLE-Controls oder OCX). ActiveX belastet den Entwickler zwar mit einer Vielzahl sehr spezieller Techniken, Bezeichnungen und Konzepten (wie zum Beispiel Type-Libraries, Registrierung, verschiedene Threading-Modelle, historischer Ballast etc.), ActiveX-Benutzer werden dafür aber mit nahtloser Integration und fast universeller Verwendbarkeit belohnt (sofern sie sich im Windows-Universum bewegen). Da PDFlib eine reine Entwicklungskomponente ist, eignet sie sich von Natur aus zur ActiveX-Implementierung für den Einsatz unter Windows. Die ActiveX-Implementierung von PDFlib ist als Wrapper-DLL um den PDFlib-Kern gelegt. Die Wrapper-DLL ruft die PDFlib-Kernfunktionen auf und ist verantwortlich für die Kommunikation mit den zugrunde liegenden COM-Mechanismen, Registrierung und Type-Library, COM-Ausnahmebehandlung, Speicherverwaltung und Konvertierung von Unicode-Strings. Die technischen Daten des ActiveX-Wrappers von PDFlib lauten wie folgt (zerbrechen Sie sich nicht den Kopf, wenn Ihnen nicht alle Aspekte geläufig sind – diesbezügliche Kenntnisse sind für den Einsatz von PDFlib nicht erforderlich): > PDFlib fungiert als Win32 in-process ActiveX-Serverkomponente (auch Automation Server genannt) ohne Benutzeroberfläche. > PDFlib ist eine both-threaded Komponente, das heißt, sie wird sowohl als apartmentthreaded als auch als free-threaded Komponente behandelt. Außerdem nutzt PDFlib einen free-threaded marshaller. Clients können das PDFlib-Objekt also direkt verwenden (statt eine Proxy/Stub-Kombination nutzen), was eine erhebliche PerformanceSteigerung zur Folge hat. > PDFlib ist voll Unicode-fähig. > Die PDFlib-Binärdatei pdflib_com.dll ist eine selbstregistrierende DLL mit einer TypeLibrary. > PDFlib ist zustandslos, das heißt statt Properties werden Methoden-Parameter verwendet. > Die duale Schnittstelle von PDFlib unterstützt sowohl frühe als auch späte Bindung. > PDFlib unterstützt ausführliche Fehlerinformationen. Hinweis PDFlib ist gegenwärtig zwar nicht MTS-fähig (Microsoft Transaction Server), kann aber mit MTS eingesetzt werden. 2.2.2 Installation der ActiveX-Edition von PDFlib PDFlib kann in allen Umgebungen eingesetzt werden, die ActiveX-Komponenten unterstützen. Wir zeigen unsere Beispiele in den folgenden Umgebungen: > Visual Basic > Active Server Pages (ASP) mit JScript und VBScript > Windows Script Host (WSH) mit JScript und VBScript > Allaire ColdFusion > Borland Delphi 2.2 ActiveX/COM-Sprachbindung 17 Active Server Pages und Windows Script Host unterstützen JScript und VBScript. Da die Skripten fast identisch sind, werden wir hier nicht alle Kombinationen vorführen. Außerdem gibt es noch viele andere ActiveX-fähige Entwicklungsumgebungen – unter anderem Microsoft Visual C++, Borland C++ Builder oder PowerBuilder. PDFlib funktioniert auch in Visual Basic for Applications (VBA). Voraussetzungen für die PDFlib-Installation. Die Installation von PDFlib ist einfach zu bewerkstelligen. Beachten Sie dabei Folgendes: > PDFlib läuft unter allen Versionen von Windows. Es ist keine bestimmte Betriebssystemversion und kein bestimmtes Service Pack erforderlich. > Wenn Sie PDFlib auf einer NTFS-Partition installieren, brauchen alle PDFlib-Benutzer die Lesen-Berechtigung auf das Installationsverzeichnis und die Ausführen-Berechtigung für ...\PDFlib\bin\pdflib_com.dll. > Der installierende Benutzer benötigt die Schreiben-Berechtigung für die Registrierungsdatenbank. Administrator-Berechtigungen oder Berechtigungen der Gruppe »Hauptbenutzer« reichen in der Regel aus. Die .exe- und MSI-Installationsroutinen von PDFlib. PDFlib wird mit einer konventionellen .exe-Installationsroutine ausgeliefert, die alle erforderlichen Installationsschritte durchführt. Alternativ dazu ist PDFlib als MSI-Paket verfügbar (Microsoft Windows Installer), der über zusätzliche Installations-, Reparatur- und Deinstallationsfunktionen verfügt. Auf Systemen, die mit Windows Installer ausgestattet sind (zum Beispiel Windows 2000 und XP) besitzt die MSI-Installation der PDFlib einige Vorteile gegenüber der .exe-Installation. Um PDFlib mit dem MSI-Paket zu installieren, doppelklicken Sie einfach auf die .msi-Datei oder klicken sie mit der rechten Maustaste an und wählen Installieren. Was passiert bei der ActiveX-Installation von PDFlib? Die Installationsroutinen, die mit der ActiveX-Komponente von PDFlib ausgeliefert werden, regeln automatisch alle Aspekte, die für den PDFlib-Einsatz mit ActiveX relevant sind. Der Vollständigkeit halber beschreiben wir trotzdem im Folgenden, welche Laufzeitumgebung für den PDFlibEinsatz erforderlich ist (die von der Installationsroutine automatisch so eingestellt wird): > Die PDFlib ActiveX-DLL pdflib_com.dll wird ins Installationsverzeichnis kopiert. > Die PDFlib ActiveX-DLL muss in der Windows-Registrierung eingetragen sein. Um eine Registrierung zu erreichen, verwendet die Installationsroutine die selbstregistrierende PDFlib-DLL. > Wird eine lizenzierte Version von PDFlib installiert, dann wird die Seriennummer ins System eingetragen. Die Installationsoption Runtime führt die oben genannten Schritte durch. Die Installationsoption Full kopiert zusätzlich Dokumentation und Beispieldateien ins Installationsverzeichnis. 2.2.3 Silent-Installation Wird PDFlib als Bestandteil eines anderen Software-Pakets ausgeliefert oder auf sehr vielen Rechnern eingesetzt, die mit einem Tool wie SMS verwaltet werden, ist es äußerst mühsam, PDFlib auf jedem Rechner einzeln manuell zu installieren. Für solche Situatio- 18 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) nen gibt es die Möglichkeit, PDFlib automatisch ohne jede Benutzerinteraktion zu installieren. Silent-Installation mit der .exe-Installationsroutine. Die .exe-Installationsroutine von PDFlib wurde mit InstallShield erstellt und unterstützt auch dessen Silent-Installation. Eine normale (nicht-silent) Installation bezieht ihren Input aus Dialogfeldern, in die der Benutzer alle erforderlichen Informationen eingibt. Eine Silent-Installation arbeitet dagegen nicht mit Dialogfeldern, sondern bezieht die Informationen aus einer besonderen Datei des Typs InstallShield Silent Response (.iss). Dabei handelt es sich um eine Textdatei, die in etwa diejenigen Informationen enthält, die ein Benutzer beim normalen Setup in Dialogfelder eingeben würde. Die Response-Datei lässt sich am einfachsten vorbereiten, indem eine interaktive Installation durchgeführt und dabei alle Benutzereingaben aufgezeichnet werden. Um eine (nicht-interaktive) Silent-Installation von PDFlib durchzuführen, gehen Sie wie folgt vor: > Extrahieren Sie die PDFlib-ActiveX-Installationsdateien mit WinZip in das gewünschte Verzeichnis. > Führen Sie in diesem Verzeichnis setup -r aus und geben Sie in den Dialogfeldern genau die Informationen ein, die später in der Silent-Installation verwendet werden sollen. > Kopieren Sie die Response-Datei setup.iss, die in Ihrem Windows-Verzeichnis abgelegt wurde, in das Verzeichnis mit den Installationsdateien. Bei Bedarf können Sie die Angaben in der Response-Datei mit einem Texteditor nachträglich verändern. > Starten Sie die Silent-Installation, indem Sie setup -s im Verzeichnis mit den Installationsdateien ausführen. Silent-Installation mit der MSI-Installationsroutine. Auch die MSI-Installationsroutine unterstützt die Silent-Installation. Mit dem folgenden Befehl in der Befehlszeile können Sie PDFlib zum Beispiel ohne Benutzereingaben installieren: msiexec.exe /I PDFlib-4.0.3.msi /qn Eine vollständige Liste aller Befehlszeilenparameter finden Sie in der Dokumentation zum Microsoft Windows Installer. 2.2.4 Anwendungsszenarien Einsatz der PDFlib-ActiveX-Komponente auf dem Server eines ISP. Die Installation von Software auf dem Server eines Internet Service Provider (ISP) ist in der Regel wesentlich schwieriger als auf einem lokalen Rechner, da ISPs oft sehr widerwillig reagieren, wenn Kunden neue Software installieren möchten. PDFlib ist sehr ISP-freundlich, da sie weder Dateien im Windows-Verzeichnis noch zwingend Registrierungseinträge benötigt: > Es ist nur eine einzige DLL nötig, die sich in einem beliebigen Verzeichnis befinden kann. Diese DLL muss nur mit regsvr32 korrekt registriert worden sein. > Standardmäßig werden nur ein paar wenige private Einträge in der Registrierung vorgenommen, die sich unter HKEY_LOCAL_MACHINE\SOFTWARE\PDFlib befinden. Diese Einträge können auch manuell vorgenommen werden. > PDFlib kann sogar ohne jegliche private Einträge in der Registrierung verwendet werden. Der Benutzer muss die fehlenden Einträge dann durch geeignete Aufrufe 2.2 ActiveX/COM-Sprachbindung 19 der Funktion set_parameter( ) kompensieren und damit die Parameter prefix, resourcefile und serial setzen. Eine Dateiliste finden Sie im nächsten Abschnitt. PDFlib-ActiveX-Komponente als Bestandteil des eigenen Produkts. Wenn Sie als Entwickler eine Runtime-Lizenz für PDFlib erworben haben und PDFlib als Bestandteil Ihres eigenen Produkts ausliefern wollen, müssen Sie die PDFlib-Installation entweder komplett ausliefern und die PDFlib-Installationsroutine als Teil des Produkt-Setups ablaufen lassen oder aber folgende Schritte durchführen: > Integrieren Sie die PDFlib-Dateien, die bei der Option Runtime installiert werden, in eine eigene Installation (siehe auch Abschnitt 2.2.3, »Silent-Installation«, Seite 18). Die von PDFlib benötigten Dateien lassen sich durch einen Blick in das Installationsverzeichnis ermitteln, da nur dort Dateien installiert werden. Die mitgelieferten AFM-Dateien werden nur dann benötigt, wenn die 14 Standardschriften mit anderen Encodings als winansi (bzw. builtin bei den Fonts Symbol und ZapfDingbats) verwendet werden sollen (siehe Abschnitt 3.3.1, »Die PDF-Standardschriften«, Seite 46). > Vergessen Sie keinen der erforderlichen PDFlib-Registrierungsschlüssel. Dazu können Sie die Einträge in der mitgelieferten Registrierungsdateivorlage pdflib.reg ergänzen und diese bei der Installation Ihres eigenen Produkts verwenden. > Zur Selbstregistrierung muss pdflib_com.dll (zum Beispiel über regsvr32) aufgerufen werden. Wurde Ihre Installationsroutine mit InstallShield erstellt, können Sie dies einfach bewerkstelligen, indem Sie die Eigenschaft Self-Registered für die InstallShield-Gruppe, die pdflib_com.dll enthält, auf true setzen. > Übergeben Sie Ihre Seriennummer zur Laufzeit mit der PDFlib-Funktion set_ parameter( ), wobei Sie serial als ersten Parameter und den String mit der Seriennummer als zweiten Parameter übergeben (siehe auch Abschnitt 0, »Anwendung des PDFlib-Lizenzschlüssels«, Seite 7: oPDF.set_parameter("serial", "...Ihre Seriennummer...") 2.2.5 Fehlerbehandlung in ActiveX Die Fehlerbehandlung für die PDFlib-ActiveX-Komponente erfolgt entsprechend der COM-Konventionen: Tritt eine PDFlib-interne Exception auf, wird eine COM-Exception ausgelöst, die den PDFlib-Fehlercode und eine Beschreibung des Fehlers enthält. Außerdem wird der vom PDFlib-Objekt belegte Speicher freigegeben. Tabelle 2.3 gibt eine Übersicht über alle von PDFlib ausgelösten COM-Fehler sowie die entsprechenden PDFlib-Exceptions. ActiveX-Programmierer haben mit den Fehlernummern zum Glück nicht direkt zu tun, da die Type-Library PDFlib_com in der Klasse PDFlib_com.Errors symbolische Konstanten dafür enthält.Die COM-Exception kann im PDFlib-Client abgefangen und auf die Art bearbeitet werden, die die Client-Umgebung für COM-Fehler vorsieht. Die in COM verwendeten Fehlercodes sind 32-Bit-Werte, deren höchstes Bit gesetzt ist. Sie erscheinen deshalb als sehr große negative Zahlen. PDFlib hält sich an die COMKonventionen und gibt Fehlercodes zurück, die in dem Bereich liegen, der für anwendungsspezifische Fehler reserviert ist. Genauer betrachtet, haben die Fehlercodes folgenden Aufbau: COM-Fehlercode = &H80040000 + &H200 + (PDFlib-Fehlercode) 20 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) Tabelle 2.3 Von PDFlib ausgelöste COM-Exceptions PDFlib-Fehlername Dezimalwert Hexadezimalwert Erklärung MemoryError -2147220991 &H80040201 nicht ausreichend Speicher IOError -2147220990 &H80040202 Ein-/Ausgabefehler, zum Beispiel Festplattenspeicher nicht ausreichend RuntimeError -2147220989 &H80040203 falsche Reihenfolge der PDFlib-Funktionsaufrufe IndexError -2147220988 &H80040204 Array-Index-Fehler TypeError -2147220987 &H80040205 Argumenttyp-Fehler DivisionByZero -2147220986 &H80040206 Division durch Null OverflowError -2147220985 &H80040207 arithmetischer Überlauf Syntaxfehler SyntaxError -2147220984 &H80040208 ValueError -2147220983 &H80040209 ein an PDFlib übergebenes Argument ist ungültig SystemError -2147220982 &H8004020A interner PDFlib-Fehler NonfatalError -2147220981 &H8004020B ein kleineres Problem ist aufgetreten (Warnung) UnknownError -2147220980 &H8004020C anderer Fehler (Die erste Hexadezimalzahl entspricht der Visual-Basic-Konstanten vbObjectError und die zweite dem von Microsoft vorgesehenen Offset für komponentenspezifische Fehler.) 2.2.6 Versionskontrolle in ActiveX Statt einfacher Major- und Minor-Versionsnummern implementiert COM das Konzept eines global eindeutigen Identifier (GUID) für eine Class-ID, der eine bestimmte Programmierschnittstelle eindeutig beschreibt. Statt sich mit verschiedenen Versionsnummern herumzuschlagen, kann eine neue Software-Version entscheiden, ob eine bestimmte Schnittstelle, die über ihre GUID identifiziert wird, weiter unterstützt werden soll oder nicht. PDFlib_com nutzt als ActiveX-Komponente den Class-ID-Mechanismus. Der GUID für PDFlib_com ist in deren Type-Library enthalten (welche wiederum in pdflib_com.dll enthalten ist) sowie in der Windows-Registrierung. Da PDFlib sowohl unter dem generischen Programm-Identifier (ProgID) PDFlib_com.PDF als auch unter einer versionsspezifischen ProgID registriert ist, werden Benutzer kaum direkt mit dem GUID zu tun bekommen. 2.2.7 Unicode-Unterstützung in ActiveX 32-Bit-Versionen von ActiveX/COM bieten native Unicode-Unterstützung. Der ActiveXSprachwrapper konvertiert automatisch alle COM-Strings in Unicode oder ISO Latin 1 (PDFDocEncoding). Die Unicode-Fähigkeit von ActiveX kann jedoch zu subtilen Problemen mit 8-Bit-Encodings (wie zum Beispiel winansi) und Unicode-Zeichen in literalen Strings führen. Ausführliche Informationen hierzu finden Sie in Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65. Wenn Sie die Unicode-Unterstützung von PDFlib mit ActiveX einsetzen möchten, müssen Sie den Unicode-Modus aktivieren, indem Sie den Parameter nativeunicode auf true setzen (siehe die Beispiele in den nächsten Abschnitten). 2.2 ActiveX/COM-Sprachbindung 21 2.2.8 Einsatz von PDFlib mit Active Server Pages Besondere Hinweise zu Active Server Pages1. Beim Einsatz externer Dateien (zum Beispiel Rasterbilddateien) muss die Funktion MapPath von ASP verwendet werden, um die Namen von Pfaden auf der lokalen Festplatte auf Pfade abzubilden, die in ASP-Skripten nutzbar sind. Wenn Sie noch keine Erfahrungen mit MapPath haben, sollten Sie sich die mit PDFlib ausgelieferten ASP-Beispiele ansehen oder die ASP-Dokumentation zu Rate ziehen. Außerdem sollten Sie in ASP-Skripten keine absoluten Pfadnamen verwenden, da diese ohne MapPath unter Umständen nicht funktionieren. Wenn Sie von PDFlib-ASP-Skripten aus auf Dateien zugreifen, die sich auf einem anderen Rechner befinden, dürfen Sie keine UNC-Pfadnamen verwenden, da diese in ASP nicht funktionieren. Stattdessen müssen Sie in IIS ein neues virtuelles Verzeichnis eintragen. Dazu geben Sie im Administrationstool auf der Registerkarte Basisverzeichnis unter Netzwerkfreigabe auf einem anderen Computer den UNC-Namen an. Danach ist das entfernte Verzeichnis als virtuelles Verzeichnis in IIS verfügbar. Das Verzeichnis mit Ihren ASP-Skripten muss die Ausführen-Berechtigung besitzen, und außerdem die Schreiben-Berechtigung, sofern die PDF-Ausgabe nicht im Arbeitsspeicher (in-core) erzeugt wird (die mitgelieferten ASP-Beispiele generieren PDF alle im Arbeitsspeicher). Sie können die Ausführung von COM-Objekten wie PDFlib_com auf Active Server Pages beschleunigen, indem Sie das Objekt außerhalb des eigentlichen Skriptcodes auf der ASP-Seite instantiieren, womit der Geltungsbereich des Objekts von der Seite auf die Sitzung ausgeweitet wird. Genauer gesagt, verwenden Sie zur Erstellung des Objekts PDFlib_com dann statt CreateObject (wie es im Beispiel im nächsten Abschnitt gezeigt wird): <%@ LANGUAGE = "JavaScript" %> <% var oPDF; oPDF = Server.CreateObject("PDFlib_com.PDF"); oPDF.open_file(""); ... das Tag OBJECT mit den Attributen RUNAT, ID und ProgID: <OBJECT RUNAT=Server ID=oPDF ProgID="PDFlib_com.PDF"> </OBJECT> <%@ LANGUAGE = "JavaScript" %> <% oPDF.open_file(""); ... Sie können die Geschwindigkeit noch weiter steigern, indem Sie das geschilderte Verfahren mit dem Attribut Scope=Application auf die Datei global.asa anwenden, womit der Geltungsbereich des Objekts auf die Anwendung ausgeweitet wird. Weitere ASP-Beispiele finden Sie in der PDFlib-Distribution. 1. Active Server Pages ist ein Verfahren zur Ausführung von Skripten in verschiedenen Sprachen auf dem Server. Es ist in Webservern von Microsoft und verschiedenen anderen Server-Produkten verfügbar. Weitere Informationen zu ASP finden Sie unter http://msdn.microsoft.com/workshop/server/default.asp. 22 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) Das Beispiel »Hello world« für Active Server Pages (ASP) mit JScript1. Bei den ASPBeispielen erstellen wir keine PDF-Ausgabedatei, sondern generieren die PDF-Daten im Speicher und senden sie über HTTP direkt an den Client. Dieses Verfahren ist in einer Webserver-Umgebung wesentlich sinnvoller. <%@ LANGUAGE = "JavaScript" %> <% var font; var oPDF; oPDF = Server.CreateObject("PDFlib_com.PDF"); if (oPDF == null) { Response.write("Couldn't create PDFlib object!"); Response.end(); } // Open new PDF file oPDF.open_file(""); oPDF.set_info("Creator", "hello.js.asp"); oPDF.set_info("Author", "Thomas Merz"); oPDF.set_info("Title", "Hello, world (ActiveX/ASP/JScript)!"); // start a new page oPDF.begin_page(595, 842); font = oPDF.findfont("Helvetica-Bold", "winansi", 0); oPDF.setfont(font, 24); oPDF.set_text_pos(50, 700); oPDF.show("Hello, world!"); oPDF.continue_text("(says ActiveX/ASP/JScript)"); oPDF.end_page(); oPDF.close(); Response.Expires = 0; Response.Buffer = true; Response.ContentType = "application/pdf"; Response.Addheader("Content-Disposition", "inline; filename=" + "hello.js.asp.pdf"); Response.BinaryWrite(oPDF.get_buffer()); Response.End(); %> Das Beispiel »Hello world« für Active Server Pages (ASP) mit VBScript <%@ LANGUAGE = VBScript %> <% Option Explicit 1. JScript ist eine Erweiterung von ECMAScript (siehe http://www.ecma.ch/stand/ecma-262.htm), das wiederum auf Netscapes JavaScript basiert. Weitere Informationen zu JScript finden Sie unter http://msdn.microsoft.com/scripting/jscript/ default.htm. 2.2 ActiveX/COM-Sprachbindung 23 Dim font Dim oPDF Dim buf Set oPDF = Server.CreateObject("PDFlib_com.PDF") if not isObject(oPDF) Then Response.write "Couldn't create PDFlib object!" Response.end End If ' Open new PDF file oPDF.open_file "" oPDF.set_info "Creator", "hello.vbs.asp" oPDF.set_info "Author", "Thomas Merz" oPDF.set_info "Title", "Hello, world (Active X/ASP/VBScript)!" ' start a new page oPDF.begin_page 595, 842 font = oPDF.findfont("Helvetica-Bold", "winansi", 0) oPDF.setfont font, 24 oPDF.set_text_pos 50, 700 oPDF.show "Hello, world!" oPDF.continue_text "(says ActiveX/ASP/VBScript)" oPDF.end_page oPDF.close buf = oPDF.get_buffer() Response.Expires = 0 Response.Buffer = true Response.ContentType = "application/pdf" Response.Addheader "Content-Disposition", "inline; filename=" & "hello.vbs.asp.pdf" Response.Addheader "Content-Length", LenB(buf) Response.BinaryWrite(buf) Response.End() Set oPDF = nothing %> Fehlerbehandlung in JScript. JScript bietet in Version 5.01 erstmalig eine strukturierte Ausnahmebehandlung, ähnlich wie in C++ oder Java. JScript-Exceptions lassen sich jedoch nicht typisieren, und eine Exception kann nur von einer einzigen Klausel bearbeitet werden. Die Erkennung und Reaktion auf eine Exception erfolgt über eine try ... catch Klausel: try { ...PDFlib-Anweisungen... } catch (exc) { 1. JScript 5.0 ist in Microsoft Internet Explorer 5.0 und Microsoft Internet Information Services 5.0 verfügbar. 24 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) Response.write("Error " + exc.number + ": " + exc.description); Response.end(); } Hinweis Wegen Problemen in der Integer-Behandlung von JScript können Exception-Nummern nicht direkt mit Hexadezimalwerten verglichen werden. Ein Vergleich mit Dezimalwerten funktioniert aber einwandfrei. Fehlerbehandlung in VBScript. Leider verfügt VBScript über keinerlei Mechanismen zum Abfangen von Fehlern, man kann sie lediglich ignorieren. Um festzustellen, ob bei vorangegangenen Aufrufen der ActiveX-Komponente ein Fehler auftrat, muss man das ERR-Objekt in regelmäßigen Abständen überprüfen. Da es in VBScript keine On Error GoTo Klausel gibt, muss man den Skriptcode mit Aufrufen der Fehlerüberprüfungsroutine spicken oder man riskiert, dass zwischen dem ersten Fehler und dem Aufruf der Fehlerüberprüfung weitere Fehler auftreten: On Error Resume Next Err.Clear ...PDFlib-Anweisungen... CheckPDFError ...weitere PDFlib-Anweisungen... Sub CheckPDFError() If Err.number <> 0 then WScript.Echo "Error " & Hex(Err.number) & ": " & Err.description Err.Clear End If end Sub Unicode-Unterstützung in JScript. JScript bietet interne Unicode-Unterstützung. Unicode-Zeichen können direkt in String-Literale geschrieben werden, wobei sie als EscapeSequenz eingegeben werden, zum Beispiel: oPDF.set_parameter("nativeunicode", "true"); Unicodetext = "\u039B\u039F\u0393\u039F\u03A3"; Alternativ können sie mit der Methode String.fromCharCode aus numerischen Werten zusammengesetzt werden, zum Beispiel: Unicodetext = String.fromCharCode(0x39B, 0x39F, 0x393, 0x39F, 0x3A3); Unicode-Unterstützung in VBScript. VBScript bietet interne Unicode-Unterstützung. Ähnlich wie in Visual Basic können Unicode-Strings mit der Funktion ChrW aus numerischen Werten zusammengesetzt werden, zum Beispiel: oPDF.set_parameter "nativeunicode", "true" Unicodetext = ChrW(&H39B) & ChrW(&H39F) & ChrW(&H393) & ChrW(&H39F) & ChrW(&H3A3) 2.2 ActiveX/COM-Sprachbindung 25 2.2.9 Einsatz von PDFlib mit Visual Basic Besondere Hinweise für Visual Basic1. Bei externen ActiveX-Komponenten unterstützt Visual Basic sowohl frühe Bindung (zur Kompilierzeit) als auch späte Bindung (zur Laufzeit). Bei PDFlib sind zwar beide Bindungsarten erlaubt, die frühe Bindung ist jedoch eindeutig vorzuziehen. Dazu sind folgende Schritte erforderlich: > Erstellen Sie über Project, References... eine Referenz von Ihrem VB-Projekt auf PDFlib und selektieren Sie das Control PDFlib_com. > Deklarieren Sie Objektvariablen vom Typ PDFlib_com.PDF statt vom generischen Typ Object: Dim oPDF As PDFlib_com.PDF Set oPDF = CreateObject("PDFlib_com.PDF") ' oder: Set oPDF = New PDFlib_com.PDF Die Erstellung einer Referenz und die Verwendung der frühen Bindung bringen mehrere Vorteile mit sich: > VB kann den Code auf Schreibfehler überprüfen. > IntelliSense (automatische Befehlsergänzung) und kontextsensitive Hilfe sind verfügbar. > Der VB-Objektbrowser zeigt alle PDFlib-Methoden mit ihren Parametern und einer Kurzbeschreibung an. > VB-Programme sind viel schneller mit früher als mit später Bindung. Die PDFlib-Programmierung in Visual Basic ist – abgesehen von einer Ausnahme – einfach. Aufgrund eines von Microsoft bestätigten Fehlers in Visual Basic 6 können einige PDFlib-Funktionen nicht direkt verwendet werden, da Visual Basic die Namen einiger PDFlib-Methoden fälschlicherweise mit integrierten VB-Methoden überschreibt. Die folgende Zeile lässt sich in VB 6 beispielsweise nicht erfolgreich kompilieren: oPDF.circle 10, 10, 30 Zur Umgehung dieses Problems schlug der technische Support von Microsoft folgende Variante vor: oPDF.[circle] 10, 10, 30 Der Trick dabei sind die eckigen Klammern um den Methodennamen. Von dem Problem sind nur die beiden folgenden PDFlib-Funktionen betroffen: circle scale In der ActiveX-Komponente von PDFlib ist der Datentyp integer eine vorzeichenbehaftete 32-Bit-Zahl. In Visual Basic entspricht dies dem Datentyp long. Verlangt die PDFlibAPI-Referenz also ein Argument vom Typ int, müssen Visual-Basic-Programmierer den Typ long verwenden (obwohl VB auch bei int-Argumenten korrekt kompiliert). 1. Visual Basic ist ein kommerzielles Produkt von Microsoft. Weitere Informationen finden Sie unter http://msdn.microsoft.com/vbasic/prodinfo. 26 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) Das Beispiel »Hello world« in Visual Basic Attribute VB_Name = "hello" Option Explicit Sub main() Dim ret As Long, font As Long Dim oPDF As PDFlib_com.PDF Set oPDF = New PDFlib_com.PDF ' Open new PDF file ret = oPDF.open_file("hello_ax_vb.pdf") If (ret = -1) Then MsgBox "Couldn't open PDF file!" End End If oPDF.set_info "Creator", "hello.bas" oPDF.set_info "Author", "Thomas Merz" oPDF.set_info "Title", "Hello, world (ActiveX/VB)!" ' start a new page oPDF.begin_page 595, 842 font = oPDF.findfont("Helvetica-Bold", "winansi", 0) oPDF.setfont font, 24 oPDF.set_text_pos 50, 700 oPDF.show "Hello, world!" oPDF.continue_text "(says ActiveX/VB)" oPDF.end_page oPDF.close ' finish page ' close PDF document set oPDF = Nothing End Sub Fehlerbehandlung in Visual Basic. Ein Visual-Basic-Programm kann Fehler erkennen und darauf reagieren. Exceptions werden in Visual Basic mit der Klausel On Error GoTo abgefangen: Sub main() Dim oPDF As PDFlib_com.PDF On Error GoTo ErrExit ...PDFlib-Anweisungen... End ErrExit: MsgBox Hex(Err.Number) & ": " & Err.Description End Sub Unicode-Unterstützung in Visual Basic. Visual Basic bietet interne Unicode-Unterstützung. (Der Programmeditor von Visual Basic scheint jedoch nicht vollständig Unicode- 2.2 ActiveX/COM-Sprachbindung 27 fähig zu sein.) Unicode-Strings können mit der Funktion ChrW aus numerischen Werten zusammengesetzt werden: oPDF.set_info "nativeunicode", "true" Unicodetext = ChrW(&H39B) & ChrW(&H39F) & ChrW(&H393) & ChrW(&H39F) & ChrW(&H3A3) 2.2.10 Einsatz von PDFlib mit Windows Script Host Windows Script Host1 unterstützt JScript und VBScript, die wir bereits ausführlich in Abschnitt 2.2.8, »Einsatz von PDFlib mit Active Server Pages«, Seite 22, besprochen haben. Wir zeigen hier deshalb nur noch das »Hello world«-Beispiel für VBScript. Das Beispiel »Hello world« für Windows Script Host (WSH) mit VBScript ' hello.vbs ' ' PDFlib client: hello example for ActiveX with Windows Script Host and VBS ' Requires the PDFlib ActiveX component ' Option Explicit On Error Resume Next Dim font Dim oPDF Set oPDF = CreateObject("PDFlib_com.PDF") ' Open new PDF file if (oPDF.open_file("hello_ax_vbs.pdf") = -1) then WScript.Echo "Couldn't open PDF file!" WScript.Quit(1) end if oPDF.set_info "Creator", "hello.asp" oPDF.set_info "Author", "Thomas Merz" oPDF.set_info "Title", "Hello, world (Active X/VBS)!" ' start a new page oPDF.begin_page 595, 842 font = oPDF.findfont("Helvetica-Bold", "winansi", 0) oPDF.setfont font, 24 oPDF.set_text_pos 50, 700 oPDF.show "Hello, world!" oPDF.continue_text "(says ActiveX/VBS)" oPDF.end_page oPDF.close set oPDF = Nothing 1. WSH ist mit Befehlszeile (cscript.exe) oder mit Fensteroberfläche (wscript.exe) verfügbar. Es ist in Microsoft Internet Explorer 5, Windows 98, 2000 und XP enthalten. Weitere Informationen finden Sie unter http://msdn.microsoft.com/ scripting. 28 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) 2.2.11 Einsatz von PDFlib mit ColdFusion Besondere Hinweise zu ColdFusion1. ColdFusion für Windows unterstützt COMObjekte wie PDFlib über das Tag CFOBJECT. Nach der Installation (und damit Registrierung) der PDFlib-ActiveX/COM-Edition kann PDFlib aus ColdFusion heraus ohne weitere Maßnahmen verwendet werden. Da wir mit ColdFusion keine Möglichkeit fanden, PDF im Speicher zu generieren und an den Client zu übertragen, erzeugt das folgende Beispiel eine temporäre PDF-Datei. Gemäß der ColdFusion-Dokumentation müssen Funktionen, die keine Argumente erfordern (zum Beispiel save), mit einem leeren Klammernpaar geschrieben werden. Hinweis PDFlib unterstützt gegenwärtig nur die Windows-Version von ColdFusion. Das Beispiel »Hello world« für ColdFusion <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>PDFlib ColdFusion sample</title> </head> <body> <CFOBJECT type="COM" name="oPDF" class="PDFlib_com.PDF" action="CREATE"> <CFSET tmp_file=GetTempFile("C:\\tmp\\", "hello_cfm.pdf")> <CFSET res=oPDF.open_file(tmp_file)> <CFIF res is -1> Couldn't open PDF file! <CFABORT/> </CFIF> <CFSET oPDF.set_info("Creator", "hello.cfm")> <CFSET oPDF.set_info("Author", "Thomas Merz")> <CFSET oPDF.set_info("Title", "Hello, world (ActiveX/ColdFusion)")> <!--- start a new page ---> <CFSET oPDF.begin_page(595, 842)> <CFSET font = oPDF.findfont("Helvetica-Bold", "winansi", 0)> <CFSET oPDF.setfont(font, 24)> <CFSET oPDF.set_text_pos(50, 700)> <CFSET oPDF.show("Hello, world!")> <CFSET oPDF.continue_text("(says ActiveX/ColdFusion)")> <CFSET oPDF.end_page()> <CFSET oPDF.close()> <CFCONTENT TYPE="application/pdf" FILE="#tmp_file#" DELETEFILE="yes"> </body> </html> 1. Siehe http://www.macromedia.com/software/coldfusion 2.2 ActiveX/COM-Sprachbindung 29 Um das PDF-Dokument in einer Datei auf der Festplatte zu speichern, können Sie nach dem Aufruf von close( ) folgende Zeile einsetzen: <CFFILE action="COPY" source="#tmp_file#" destination="c:\document1.pdf"> Fehlerbehandlung in ColdFusion. ColdFusion unterstützt eine strukturierte Ausnahmebehandlung, die für COM-Exceptions von PDFlib herangezogen werden kann. Die von PDFlib gelieferte Fehlermeldung kann über die ColdFusion-Variable CFCATCH.detail abgefragt werden. Um PDFlib-Exceptions im ColdFusion-Code abzufangen, können Sie das folgende Fragment als Basis verwenden: <CFTRY> ...PDFlib-Anweisungen... <CFCATCH> <CFOUTPUT> Abgefangene PDFlib-Exception: #CFCATCH.detail# <CFABORT/> </CFOUTPUT> </CFCATCH> </CFTRY> Unicode-Unterstützung in ColdFusion. Da wir in ColdFusion keinerlei Unicode-Unterstützung fanden, ist die PDFlib-Funktionalität zur automatischen Unicode-Konvertierung nicht verfügbar. ColdFusion-Entwickler müssen Unicode-Strings manuell zusammenstellen (siehe Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65). 2.2.12 Einsatz von PDFlib mit Borland Delphi Besondere Hinweise zu Borland Delphi1. Um PDFlib mit Delphi 5 oder 6 einzusetzen, müssen Sie die PDFlib-Type-Library in Ihrem Projekt wie folgt referenzieren: Klicken Sie auf Project, Import Type Library... und wählen Sie PDFlib aus der Liste (erscheint der Eintrag PDFlib nicht, dann klicken Sie auf Hinzufügen..., um die Datei pdflib_com.dll von der Festplatte zu selektieren). Wählen Sie einen beliebigen Eintrag in Palette page und klicken Sie auf Install.... Diese Schritte müssen Sie pro Delphi-Installation nur einmal durchführen (nicht für jedes einzelne Projekt). Das Beispiel »Hello world« für Borland Delphi unit hello; interface uses Windows, Classes, Forms, Dialogs, ExtCtrls, Controls, StdCtrls, PDFlib_com_TLB, OleServer; type TForm1 = class(TForm) Panel1: TPanel; InsertBtn: TButton; pdf: TPDF; procedure InsertBtnClick(Sender: TObject); end; 1. Siehe http://www.borland.com/delphi 30 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.InsertBtnClick(Sender: TObject); var f: Integer; begin if pdf.open_file('hello_delphi.pdf') = -1 then begin ShowMessage('Couldn´t open hello_delphi.pdf!'); Exit; end; pdf.set_info('Creator', 'hello.pas'); pdf.set_info('Author', 'Rainer Schaaf'); pdf.set_info('Title', 'Hello World (Delphi)'); pdf.begin_page(595,842); f := pdf.findfont('Helvetica-Bold', 'host', 0); pdf.setfont(f, 18.0); pdf.set_text_pos(50, 700); pdf.show('Hello World'); pdf.continue_text('(says Delphi)'); pdf.end_page; pdf.close; end; end. Fehlerbehandlung in Borland Delphi. Delphi unterstützt eine strukturierte Ausnahmebehandlung, die für Exceptions von OLE-Objekten wie PDFlib herangezogen werden kann. Um PDFlib-Exceptions im Delphi-Code abzufangen, können Sie das folgende Fragment als Basis verwenden: uses SysUtils; ... try ...PDFlib-Anweisungen... except On E: Exception do begin ShowMessage(E.Message); end; end; Unicode-Unterstützung in Borland Delphi. Delphi bietet mit dem Datentyp WideString native Unicode-Unterstützung. Um die PDFlib-Unicode-Unterstützung in Delphi zu nutzen, müssen Sie Strings vom Typ WideString verwenden: unicodetext: WideString; ... 2.2 ActiveX/COM-Sprachbindung 31 pdf.set_parameter('nativeunicode', 'true'); unicodetext := #$039B; 2.3 C-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.4 C++-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.5 Java-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.6 .NET-Sprachbindung 2.6.1 Arbeitsweise Die .NET-Architektur1 von Microsoft unterstützt zahlreiche Programmiersprachen, wobei sie sich auf die Common Language Runtime (CLR) stützt, die eine allgemeine Umgebung zur Ausführung von Programmen bereitstellt. Die .NET-Edition von PDFlib unterstützt alle wesentlichen .NET-Konzepte. Technisch gesehen handelt es sich bei der .NET-Edition von PDFlib um eine gemanagte C++-Klasse (mit einem gemanagten Wrapper um die PDFlib-Kernbibliothek), die unter Kontrolle des .NET-Frameworks abläuft. Diese Klasse wird als statische Assembly mit einem starken Namen (strong name) ausgeliefert. Die PDFlib-Assembly (pdflib_dotnet.dll) enthält die Bibliothek selbst sowie zusätzliche Metainformationen. 2.6.2 Installation von PDFlib.NET PDFlib.NET kann in allen Umgebungen, die das .NET-Framework unterstützen, verwendet werden. Wir zeigen Beispiele für folgende Umgebungen: > C# > Visual Basic .NET Auch andere Entwicklungsumgebungen für .NET werden von PDFlib unterstützt, wenngleich wir dafür keine eigenen Beispiele anführen. Voraussetzungen zur Installation von PDFlib.NET. Die Installation ist einfach durchzuführen. Beachten Sie dabei folgendes: > Vor der Installation von PDFlib.NET muss selbstverständlich die Installation des .NET-Frameworks erfolgen. 1. Siehe http://msdn.microsoft.com/vstudio 32 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) > PDFlib.NET benötigt selbst weder eine spezielle Windows-Version noch ein bestimmtes Service-Pack. Die MSI-Installationsroutine von PDFlib.NET installiert die PDFlib-Assembly einschließlich der zugehörigen Dateien (vorwiegend Dokumentation und Beispiele) interaktiv auf dem Rechner. Installation von PDFlib.NET im Global Assembly Cache. Der Global Assembly Cache ist ein zentraler Ablageort für .NET-Komponenten. PDFlib wird nicht automatisch im GAC installiert, Sie können dies aber manuell mit dem Hilfsprogramm gacutil (das zu Visual Studio .NET gehört) bewerkstelligen. Dazu verwenden Sie folgenden Befehl: gacutil.exe /i "C:\Program Files\PDFlib\PDFlib.NET 4.0.3\bin\PDFlib_dotnet.dll" Mit demselben Befehl, jedoch der Option /u, können Sie PDFlib aus dem GAC deinstallieren. Alternativ zu gacutil können Sie das Microsoft .NET Framework Configuration Tool verwenden, das Bestandteil des .NET Framework SDK ist. 2.6.3 Silent-Installation Die MSI-Installationsroutine unterstützt auch die Silent-Installation. Mit folgendem Befehl können Sie PDFlib zum Beispiel ohne jede Benutzerinteraktion von der Befehlszeile aus installieren: msiexec.exe /I PDFlib.NET-4.0.3.msi /qn Eine vollständige Liste der Befehlszeilenoptionen finden Sie in der Dokumentation zum Microsoft Windows Installer. Außerdem wird ein Verfahren namens xcopy deployment unterstützt. Dabei können Sie die PDFlib-Assembly (pdflib_dotnet.dll) einfach mit dem xcopy-Befehl oder per FTP auf den Server kopieren. 2.6.4 Fehlerbehandlung in .NET PDFlib.NET unterstützt .NET-Exceptions und löst eine Exception mit detaillierter Fehlermeldung aus, sobald ein Laufzeitproblem auftritt. Der Client ist für das Abfangen der Exception und eine angemessene Reaktion zuständig. Anderenfalls fängt das .NETFramework die Exception ab, was gewöhnlich zum Beenden der Anwendung führt. Um Informationen über die Exception zu übermitteln, definiert PDFlib eine eigene Exception-Klasse namens PDFlib_dotnet.PDFException mit den Members msg und type. 2.6.5 Versionskontrolle in .NET PDFlib.NET unterstützt das .NET-Standardversionierungsschema mit Major-, Minor-, Build- und Revisionsnummer. Die Major-, Minor- und Build-Versionsnummer enthält jedoch die Major-, Minor- und Patchlevel-Versionsnummer von PDFlib. 2.6.6 Unicode-Unterstützung in .NET Das .NET-Framework bietet native Unicode-Unterstützung. Die Wrapperklasse PDFlib.NET konvertiert automatisch alle .NET-Strings nach Unicode bzw. ISO Latin 1 (PDFDocEncoding). Die Unicode-Fähigkeit von .NET kann jedoch zu ernsthaften Proble- 2.6 .NET-Sprachbindung 33 men bei 8-Bit-Zeichensätzen (wie zum Beispiel winansi) sowie Unicode-Zeichen in literalen Strings führen. Einzelheiten hierzu finden Sie in Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65. Um die Unicode-Unterstützung von PDFlib mit .NET nutzen zu können, aktivieren Sie den Unicode-Modus, indem Sie den Parameter nativeunicode auf true setzen. 2.6.7 Einsatz von PDFlib mit C# Spezielle Hinweise zu C#. Um PDFlib.NET in Ihrem C#-Projekt nutzen zu können, müssen Sie in Visual C# .NET eine Referenz auf die PDFlib.NET-Assembly erzeugen. Dazu klicken Sie auf Project, Add Reference..., Browse... und wählen PDFlib_dotnet.dll aus dem Installationsverzeichnis. Mit dem Befehlszeilencompiler können Sie PDFlib.NET wie folgt referenzieren: csc.exe /r:..\..\bin\PDFlib_dotnet.dll hello.cs Das Beispiel »Hello world« in C#. using System; using System.Text; using PDFlib_dotnet; class Hello { static void Main(string[] args) { PDF p; int font; p = new PDFlib(); // Open new PDF file if (p.open_file("hello.pdf") == -1) { Console.WriteLine("Error: cannot open PDF file 'hello.pdf'.\n"); return; } p.set_info("Creator", "hello.cs"); p.set_info("Author", "Rainer Schaaf"); p.set_info("Title", "Hello, world (.NET/C#)!"); font = p.findfont("Helvetica-Bold", "winansi", 0); // start a new page p.begin_page(595, 842); p.setfont(font, 24); p.set_text_pos(50, 700); p.continue_text("Hello, world!"); p.continue_text("(says .NET/C#)"); p.end_page(); // finish page p.close(); // close PDF document } 34 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) // finish the PDFlib Object } Fehlerbehandlung in C#. Im Client-Code können von PDFlib ausgelöste .NET-Exceptions mit der üblichen Kombination von try und catch behandelt werden: try { ...PDFlib-Anweisungen... } catch (PDFlibException e) Console.WriteLine("PDFlib-Exception abgefangen:\n{0}", e.msg); } Unicode-Unterstützung in C#. Unicode-Strings können in C# durch Übergabe einer passenden Escape-Sequenz zusammengesetzt werden, zum Beispiel: p.set_parameter("nativeunicode", "true"); Unicodetext = "\u039B\u039F\u0393\u039F\u03A3"; 2.6.8 Einsatz von PDFlib mit Visual Basic .NET Spezielle Hinweise zu Visual Basic .NET. Um PDFlib.NET in Ihrem VB.NET-Projekt nutzen zu können, müssen Sie in Visual Basic .NET eine Referenz auf die PDFlib.NET-Assembly erzeugen. Dazu klicken Sie auf Project, Add Reference..., Browse... und wählen dann PDFlib_dotnet.dll aus dem Installationsverzeichnis. Mit dem Befehlszeilencompiler können Sie PDFlib.NET wie folgt referenzieren. vbc.exe /r:..\..\bin\pdflib_dotnet.dll hello.vb Das Beispiel »Hello world« für Visual Basic .NET. Imports System Imports PDFlib_dotnet Class hello Public Shared Sub Main() Dim p As PDFlib_dotnet.PDFlib Dim font As Integer p = New PDFlib() ' Open new PDF file If (p.open_file("hello.pdf") = -1) Then Console.WriteLine("Error: cannot open PDF file 'hello.pdf'") End End If p.set_info("Creator", "hello.vb") p.set_info("Author", "Rainer Schaaf") p.set_info("Title", "Hello, world (VB.NET)!") ' start a new page p.begin_page(595, 842) font = p.findfont("Helvetica-Bold", "winansi", 0) 2.6 .NET-Sprachbindung 35 p.setfont(font, 24) p.set_text_pos(50, 700) p.show("Hello, world!") p.continue_text("(says .NET/VB)") p.end_page() p.close() ' finish page ' close PDF document End Sub End Class Fehlerbehandlung in Visual Basic .NET. Visual Basic .NET unterstützt zwei Arten von Ausnahmebehandlung: > strukturierte Ausnahmebehandlung (die auch in anderen modernen Sprachen wie C# verwendet wird) > traditionelle unstrukturierte Ausnahmebehandlung (die einzig mögliche Ausnahmebehandlung in Visual Basic 6.0) Der Client-Code kann von PDFlib ausgelöste .NET-Exceptions auf beide der oben erwähnten Arten behandeln, die Syntax ist jedoch unterschiedlich. Wir empfehlen, Exceptions mit strukturierter Ausnahmebehandlung abzufangen. Dazu wird eine try...catchKlausel verwendet: try ...PDFlib-Anweisungen... } catch e As PDFlibException Console.WriteLine("PDFlib-Exception abgefangen:\n{0}", e.msg); end try Um Exceptions mit traditioneller unstrukturierter Fehlerbehandlung abzufangen, verwenden Sie eine On Error GoTo-Klausel: Imports Microsoft.VisualBasic Public Shared Sub Main() On Error GoTo ErrExit ...PDFlib-Anweisungen... Exit Sub ErrExit: Console.WriteLine("PDFlib-Exception abgefangen: {0}", Err.Description) End Sub Unicode-Unterstützung in Visual Basic .NET. Unicode-Strings können in Visual Basic .NET mit der Funktion ChrW aus numerischen Werten aufgebaut werden: Imports Microsoft.VisualBasic ... p.set_parameter("nativeunicode", "true") Unicodetext = ChrW(&H39B) & ChrW(&H39F) & ChrW(&H393) & ChrW(&H39F) & ChrW(&H3A3) 36 Kapitel 2: Sprachbindungen von PDFlib (ActiveX/COM- und .NET-Edition) 2.6.9 PDFlib ist nicht für ASP.NET freigegeben Obwohl PDFlib.NET für den Einsatz mit ASP.NET konzipiert wurde, können wir den Einsatz der .NET-Edition von PDFlib mit ASP.NET aufgrunds eines Bugs im .NET-Framework, der von Microsoft bestätigt wurde (Bugnummer Q309694) derzeit nicht empfehlen. Dieser Framework-Bug betrifft alle Komponenten, die Übergänge von unmanaged to managed Code enthalten (was bei PDFlib der Fall ist), falls diese in Umgebungen eingesetzt werden, die Application Domains dynamisch laden und wieder entladen (was wiederum bei ASP.NET der Fall ist). Obwohl einfache ASP.NET-Anwendungen mit PDFlib funktionieren, löst ASP.NET eine Exception vom Typ AppDomainUnloaded aus, sobald eines von mehreren Ereignissen eintritt. Zudiesen Auslösern gehört das Editieren von Konfigurationsdateien ebenso wie das Erreichen von Grenzen der Speichernutzung u.a.m. Obwohl diese Auslöser für sich genommen harmlos sind, bewirken, dass die Laufzeitumgebung eine Application Domain entlädt und dynamisch wieder lädt, was obige Exception auslöst. Solange dieser Bug im .NET-Framework nicht von Microsoft behoben wurde, raten wir vom Einsatz von PDFlib.NET mit ASP.NET oder eigenen Applikationen, die AppDomains nutzen, ausdrücklich ab. 2.7 Perl-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.8 PHP-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.9 Python-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.10 RPG-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht vorhanden.) 2.11 Tcl-Sprachbindung (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Referenzhandbuchs nicht enthalten.) 2.7 Perl-Sprachbindung 37 3 PDFlib- und PDI-Programmierung 3.1 Allgemeine Aspekte 3.1.1 Struktur eines PDFlib-Programms PDFlib-Anwendungen müssen sich an einige strukturelle Regeln halten, die sehr einfach zu verstehen sind. Es sollte aber keinerlei Probleme bereiten, Anwendungen unter Einhaltung dieser Bedingungen 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 korrekte PDFlib-Client-Programme, wenn man ein Dokument einfach auf ganz »natürliche« Art und Weise anlegt. PDFlib erzwingt die korrekte Reihenfolge von Funktionsaufrufen durch streng definierte Geltungsbereiche (siehe Abschnitt 4.1, »Datentypen, Namenskonventionen und Geltungsbereiche«, Seite 85). Jede Funktionsbeschreibung enthält auch Angaben über den jeweiligen Geltungsbereich. Der Aufruf einer Funktion aus einem anderen Geltungsbereich führt unmittelbar zu einer PDFlib-Exception. PDFlib löst außerdem eine Exception aus, wenn die von einem Bibliotheksclient übergebenen Parameter nicht korrekt sind. 3.1.2 Erzeugung von PDF-Dokumenten im Arbeitsspeicher Neben der Generierung von PDF-Dokumentdateien kann PDFlib auch dazu veranlasst werden, PDF-Dokumente direkt im Arbeitsspeicher zu erzeugen (in-core). Dieses Verfahren ist schneller, da kein Schreiben auf die Festplatte erforderlich ist. Das PDF-Dokument könnte dann zum Beispiel direkt via HTTP übertragen werden. Es dürfte insbesondere Webmaster erfreuen zu hören, dass die Server nicht unbedingt mit temporären PDF-Dateien überhäuft werden müssen. Mit dieser Art der PDF-Generierung können Sie die Daten entweder stückweise verarbeiten (zum Beispiel jedes Mal, wenn eine Seite komplett ist) oder das vollständige PDFDokument am Ende in einem Stück (nach PDF_close( )) verwenden. Die stückweise Generierung und Weiterverarbeitung der PDF-Daten ist in mehrerer Hinsicht vorteilhaft. Erstens sinken die Speicheranforderungen, da die Daten nicht vollständig im Speicher vorgehalten werden müssen. Außerdem lässt sich die Leistung erheblich steigern, wenn das erste Stück bereits über eine langsame Verbindung gesendet werden kann, während das nächste Stück gerade generiert wird. Die Gesamtgröße der Daten ist aber erst nach Abschluss des letzten Stücks bekannt. Aktive Schnittstelle zur PDF-Generierung im Arbeitsspeicher. Um PDF-Daten im Arbeitsspeicher zu generieren, übergeben Sie an PDF_open_file( ) einfach einen leeren Dateinamen und holen die Daten über PDF_get_buffer( ) ab: oPDF.open_file ("") ...Dokument anlegen... oPDF.close ' Puffer mit PDF holen und in Datei schreiben 38 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) ' Das ist in VB nicht besonders sinnvoll, wohl aber in ASP Open "file.pdf" For Binary Access Write As #1 Put #1, , oPDF.get_buffer Close #1 Set oPDF = Nothing Hinweis Um die PDF-Daten aus dem Puffer zu holen, benötigt man Binärzugriff. Dies ist unter Umständen nicht in allen Umgebungen möglich, da die jeweilige Entwicklungsumgebung gewissen Einschränkungen unterliegen kann. 3.1.3 Fehlerbehandlung Eine bestimmte Art von Fehlern wird in vielen Sprachen nicht zu Unrecht als Ausnahme (Exception) bezeichnet – es handelt sich um bloße Ausnahmesituationen, die während eines Programmlaufs nicht allzu häufig erwartet werden. Die generelle Strategie besteht darin, konventionelle Verfahren zur Fehlerbenachrichtigung (also besondere Funktionsrückgabewerte) für Funktionsaufrufe zu verwenden, die häufig zu Fehlern führen. Besondere Verfahren zur Ausnahmebehandlung setzt man dagegen in selten zu erwartenden Fällen ein, wo man den Code nicht mit Bedingungen zupflastern möchte. Diese Methode wird auch von PDFlib verfolgt. So geht man bei manchen Operationen davon aus, dass sie relativ häufig schiefgehen, zum Beispiel: > der Versuch, ohne geeignete Berechtigung eine Ausgabedatei zu öffnen > der Einsatz eines Fonts, für den keine Metrikdaten verfügbar sind > der Versuch, eine beschädigte Bilddatei zu öffnen > der Versuch, eine verschlüsselte PDF-Datei zu importieren PDFlib zeigt solche Fehler durch die Rückgabe eines speziellen Werts an (normalerweise – 1), der bei den einzelnen Funktionen in Kapitel 4 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 die Bibliothek auf eine solche Ausnahmesituation, wird eine COM-Exception ausgelöst, ohne dass spezielle Werte an die aufrufende Funktion zurückgegeben werden. PDFlib-Exceptions lassen sich in mehrere Kategorien unterteilen, die in Tabelle 2.3 aufgeführt werden. Der Error-Handler erhält den Typ des PDFlib-Fehlers mit einer beschreibenden Nachricht. Nicht-fatale Fehlermeldungen (Warnungen) weisen in der Regel auf ein Problem in Ihrem PDFlib-Code hin, das Sie näher untersuchen sollten. Die Verarbeitung kann nach nicht-fatalen Fehlern jedoch fortgeführt werden. Aus diesem Grund lassen sich Warnungen mit folgendem Funktionsaufruf unterbinden: oPDF.set_parameter "warning", "false" Als Strategie ist zu empfehlen, Warnungen im Entwicklungsstadium zu aktivieren (und genau zu untersuchen) und im laufenden Betrieb zu deaktivieren. 3.1 Allgemeine Aspekte 39 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 nach oben. Das Standardkoordinatensystem kann von PDFlib-Clientprogrammen durch Rotieren, Skalieren, Verschieben oder Scheren modifiziert werden, so dass sich neue benutzerspezifische Koordinaten ergeben. Für diese Transformationen werden die Funktionen rotate( ), scale( ), translate( ) und skew( ) verwendet. Nach der Transformation müssen alle Koordinaten in Grafik- und Textfunktionen an das neue Koordinatensystem angepasst übergeben werden. Zu Beginn einer neuen Seite wird wieder auf das Standardkoordinatensystem umgestellt. Um PDFlib-Anwendern beim Arbeiten mit dem Koodinatensystem von PDF behilflich zu sein, enthält die PDFlib-Distribution die PDF-Datei grid.pdf, die die Koordinaten für gängige Seitenformate zeigt. Als nützliches Hilfsmittel zur PDFlib-Entwicklung können Sie sich die Seite mit dem für Sie interessanten Format auf eine durchsichtige Folie ausdrucken. (Verwenden Sie keine billigen Overhead-Folien, da diese kaum hitzebeständig sind und Ihren Laserdrucker ruinieren können!) Acrobat 5 (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 und nicht, wie in PDF üblich, auf die linke untere Ecke beziehen. Lassen Sie sich nicht von PDF-Ausdrucken mit scheinbar falschem Seitenformat irritieren. 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 Skalierung des Ausdrucks führt. > Nicht-PostScript-Druckertreiber können Objekte nicht immer in ihrer exakten Größe drucken. Hinweis Koordinatentransformationen haben keinen Einfluss auf Hypertextfunktionen, zum Beispiel zur Erstellung von Notizen, Verknüpfungen oder Dateianlagen. Diese arbeiten immer mit dem Standardkoordinatensystem. Verwendung metrischer Koordinaten. Durch eine Skalierung des Koordinatensystems können Sie problemlos auch metrische Koordinaten einsetzen. Der Skalierungsfaktor ergibt sich aus der Definition der Einheit Punkt oben: oPDF.[scale] 28.3465, 28.3465 Nach diesem Aufruf interpretiert PDFlib alle Koordinaten (außer für Hyptertextfunktionen, siehe oben) in Zentimeter, da 72/2.54 = 28.3465. 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 40 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) PDFlib-Funktionen zum Drehen, Verschieben, Skalieren und Scheren des Koordinatensystems, diese wirken sich aber nicht auf bereits auf der Seite vorhandene Objekte aus, sondern nur auf später gezeichnete. Das folgende Beispiel generiert erst ein wenig horizontalen Text, dann wird das Koordinatensystem gedreht, um vertikalen Text auszugeben. Das Sichern und Wiederherstellen des Grafikkontexts (mit save/restore) ermöglicht es, nach der Ausgabe des vertikalen Texts ohne weiteres wieder horizontalen Text im ursprünglichen Koordinatensystem auszugeben: oPDF.set_text_pos 50, 600 oPDF.show "Dies ist horizontaler Text" textx = oPDF.get_value("textx", 0) texty = oPDF.get_value("texty", 0) oPDF.save oPDF.translate textx, texty oPDF.rotate 90 oPDF.set_text_pos 18, 0 oPDF.show "Vertikaler Text" oPDF.restore ' Textposition bestimmen ' Textposition bestimmen ' Ursprung an Textende verschieben ' Koordinaten drehen ' Abstand zu horizontalem Text vorsehen oPDF.continue_text "Weiterer horizontaler Text" Einsatz von Top-Down-Koordinaten. Im Gegensatz zum Bottom-Up-Koordinatensystem von PDF arbeiten manche grafischen Umgebungen mit Top-Down-Koordinaten. Wenn Sie diese Art vorziehen, können Sie sich das entsprechende Koordinatensystem problemlos mit den Transformationsfunktionen von PDFlib einrichten. Da die Transformationen aber auch die Textausgabe beeinflussen, sind weitere Aufrufe erforderlich, damit der Text nicht gespiegelt erscheint. Das folgende Codefragment zeigt, wie Sie ein Koordinatensystem mit dem Ursprung in der linken oberen Ecke der Seite einrichten, wobei die y-Koordinate nach unten zeigt, die übliche Textrichtung aber beibehalten wird und der Text aufrecht auf der Seite steht: oPDF.begin_page Width, Height oPDF.translate 0, Height oPDF.[Scale] 1, -1 ' Seitenformat einrichten ' Koordinatenursprung verschieben ' an horizontaler Achse spiegeln font = oPDF.findfont("Helvetica-Bold", "host", 0) oPDF.setfont font, -18 oPDF.set_value "horizscaling", -100 ' Beispieltext ' Text aufrecht stellen ' Spiegelung ausgleichen oPDF.set_text_pos 50, 100 oPDF.show "Hello world!" ' Top-Down-Koordinaten verwenden Um Text in einem Textfeld mit der oberen linken Ecke (x, y), der Breite w und der Höhe h zu formatieren, verwenden Sie die folgende Zeile (dies ist erforderlich, da die Funktion die Höhe h zur Anfangsposition y addiert und Text mit negativer Schriftgröße in die entgegengesetzte Richtung läuft): c = show_boxed(text, x, y-h, w, h, "justify", "") Ebenso können Sie folgendes Fragment nutzen, um Bilder im Top-Down-Koordinatensystem korrekt zu positionieren: 3.2 Seitenbeschreibungen 41 ' Bild in linke untere Ecke der Seite platzieren oPDF.save oPDF.translate 0, Height ' Ursprung temporär nach links unten verschieben oPDF.scale 1, -1 oPDF.place_image lImage, 0, 0, 1 oPDF.restore 3.2.2 Begrenzungen für Seiten und Koordinaten Seitengröße. Im Gegensatz zu PDF und PDFlib, die keinerlei Einschränkungen hinsichtlich der verwendbaren Seitengröße aufweisen, gibt es bei Acrobat-Implementierungen in der Softwarearchitektur begründete Formatbeschränkungen. Andere PDFInterpreter können aber durchaus mit größeren oder kleineren Formaten umgehen. Im Kompatibilitätsmodus für Acrobat 3 löst PDFlib die Exception PDF_RuntimeError aus, wenn die für Acrobat 3 spezifischen Grenzen überschritten wurden. Im Kompatibilitätsmodus für Acrobat 4 (Standard) oder Acrobat 5 gibt PDFlib lediglich eine nicht-fatale Warnung aus, wenn die für Acrobat 4 spezifischen Grenzen überschritten wurden. Tabelle 3.1 zeigt die Einschränkungen bezüglich der Seitengröße in den verschiedenen Acrobat-Versionen; Abmessungen für Standardseitenformate finden Sie in Tabelle 4.26. Tabelle 3.1 Minimale und maximale Seitengröße verschiedener PDF-Viewer PDF-Viewer Minimale Seitengröße Maximale Seitengröße Acrobat 3 1" = 72 pt = 2.54 cm 45" = 3240 pt = 114.3 cm Acrobat 4 und 5 1/24" = 3 pt = 0.106 cm 200" = 14400 pt = 508 cm Verschiedene Angaben für die Seitengröße. Im Gegensatz zu vielen PDFlib-Entwicklern, die nur die Höhe und Breite der Seite festlegen, können in speziellen Anwendungen (insbesondere für die Druckvorstufe) zusätzliche Größenangaben wünschenswert sein. PDFlib unterstützt alle in Acrobat 4/PDF 1.3 spezifizierten Größenangaben. PDFlibClients können folgende Größenangaben verwenden, die in unterschiedlichen Umgebungen sinnvoll sind: > MediaBox: beschreibt die Größe des Ausgabemediums und entspricht unserer herkömmlichen Vorstellung von der Seitengröße. > CropBox: gibt an, mit welcher Größe Acrobat die Seite anzeigen soll. > TrimBox: beschreibt die Größe der (eventuell beschnittenen) Endseite. > ArtBox: beschreibt den Teilbereich einer PDF-Seite, der für die Montage auf einer anderen Seite gedacht ist. > BleedBox: gibt an, auf welche Größe die Seite in einer Produktionsumgebung beschnitten werden soll, und berücksichtigt eventuell benötigte Druckformaterweiterungen, die wegen Ungenauigkeiten im Ausgabeprozess nötig sind. PDFlib verwendet keinen dieser Werte, nimmt sie aber in die Ausgabedatei auf. Standardmäßig wird eine MediaBox entsprechend der für die Seite festgelegten Höhe und Breite, aber keiner der anderen Einträge erzeugt. Das folgende Codefragment beginnt eine neue Seite und setzt die vier Werte für die CropBox: oPDF.begin_page 595, 842 oPDF.set_value "CropBox/llx", oPDF.set_value "CropBox/lly", oPDF.set_value "CropBox/urx", oPDF.set_value "CropBox/ury", 42 ' neue Seite beginnen 10 10 500 800 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Anzahl der Seiten im Dokument. In PDFlib gibt es keine Begrenzung für die Anzahl der Seiten in einem Dokument. Im Gegensatz zu früheren PDFlib-Versionen, die bei großen Dateien eine Ausgabe erzeugten, deren Anzeige in Acrobat sehr langsam war, wurde die Generierung der PDF-Strukturen in PDFlib 4 dahingehend optimiert, die Navigation auch bei Dokumenten mit hunderten oder tausenden von Seiten in Acrobat ganz erheblich zu beschleunigen. Ausgabegenauigkeit und Koordinatenbereich. Die Genauigkeit numerischer Werte in der PDFlib-Ausgabe wurde sehr sorgsam danach bemessen, den Anforderungen von PDF und der unterstützten Umgebungen zu genügen und dabei gleichzeitig eine möglichst geringe Dateigröße zu erzeugen. Wie in Tabelle 3.2 ausgeführt, hängt die Genauigkeit von PDFlib von den absoluten Koordinatenwerten ab. Dieser Aspekt kann zwar sehr häufig ignoriert werden, bei manchen anspruchsvollen Anwendungen ist jedoch darauf zu achten, bei Skalierungsoperationen die PDF-inhärenten Koordinatengrenzen nicht zu überschreiten. Tabelle 3.2 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 vom Typ ValueError 3.2.3 Pfade und Farben Grafikpfade. 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 Teilpfaden, bestehen. Auf einen Pfad können verschiedene Operationen angewandt werden (siehe Abschnitt 4.4.5, »Zeichnen und Beschneiden von Pfaden«, Seite 104): > Beim Stroking (Zeichnen) wird der Pfad selbst gezeichnet, wobei die vom Client übergebenen Zeichenparameter 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 Bildbereich für nachfolgende Zeichenoperationen reduziert, 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 PDFDatei, aber unsichtbar ist. Dies wird aber nur selten genutzt. Es führt zu einem Fehler, wenn Sie einen Pfad konstruieren, ohne eine der obigen Operationen auf ihn anzuwenden. Durch das System der Geltungsbereiche stellt PDFlib sicher, dass sich Clients an diese Einschränkung halten. Alle diesbezüglichen Regeln lassen 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: 3.2 Seitenbeschreibungen 43 oPDF.moveto 100, 100 oPDF.lineto 200, 100 oPDF.stroke Die meisten Grafikfunktionen arbeiten mit dem Konzept eines aktuellen Punkts, den man sich wie die aktuelle Stiftposition beim Zeichnen vorstellen kann. Farbe. PDFlib-Clients können die Farben festlegen, die zum Zeichnen und Füllen von Pfaden und Zeichen verwendet werden sollen. Farben können in mehreren Farbräumen definiert 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 zwischen 0=keine Farbe und 1=volle Farbe, für Cyan, Magenta, Yellow (Gelb) und Black (Schwarz); (0, 0, 0, 0)=weiß, (0, 0, 0, 1)=schwarz. Beachten Sie die Unterschiede zur RGB-Definition. > Schmuckfarbe (Separation-Farbraum): eine Farbe beliebigen Namens mit einer alternativen Darstellung in einem der oben erwähnten Farbräume; sie wird generell für die Erstellung von Dokumenten verwendet, die auf einer Druckmaschine mit einer oder mehreren kundenspezifischen Farben gedruckt werden sollen. Der Farbauftrag liegt zwischen 0=keine Farbe und 1=maximale Intensität der Schmuckfarbe. > Füllmuster: Kachelung mit einem Objekt, das aus beliebigem Text, Vektorgrafiken oder Rasterbildern besteht (Füllmuster werden im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt, da sie in Acrobat 3 nicht am Bildschirm angezeigt werden). Der Standardwert für Linien- und Füllfarbe ist schwarz, das heißt (0, 0, 0) im RGB-Farbraum. 3.2.4 Templates Templates in PDF. PDFlib unterstützt ein PDF-Merkmal, das technisch form XObjects heißt. Da diese Bezeichnung jedoch zu leicht mit interaktiven Formularen verwechselt werden könnte, verwenden wir dafür den Namen 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 einem 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 mehrmals) 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 Ausgabedatei entsprechend verringert. Templates eignen sich für Elemente, die wiederholt auf mehreren Seiten auftreten, zum Beispiel ein feststehender Hintergrund, ein Firmenlogo oder grafische Elemente, die aus CADSoftware oder Software für Landkarten stammen. Templates werden zudem häufig für Schnitt- und Registermarken oder spezielle asiatische Glyphen verwendet. Wichtige Informationen zu den grafischen Eigenschaften von Templates finden Sie in Abschnitt 3.5.4, »PDF-Import, Templates und Vererbung des Grafik- und Textzustands«, Seite 84. 44 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Hinweis PDF-Templates sind ein effizientes Mittel, um die Größe einer PDF-Datei zu verringern. Dieser Vorteil ist leider nicht mehr gegeben, wenn Sie PDF-Dateien, die Templates enthalten, auf einem PostScript-Drucker ausdrucken. Je nach Anzahl der verwendeten Templates müssen Sie sich dabei auf Druckjobs einstellen, die wesentlich größer sind als die zugehörigen PDF-Dateien. Einsatz von Templates mit PDFlib. Templates können nur außerhalb einer Seitenbeschreibung definiert, aber innerhalb einer Seitenbeschreibung verwendet werden. Templates 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 place_image( ), genauso wie Sie Bilder auf der Seite platzieren (siehe Abschnitt 3.4.2, »Häufig benötigte Codefragmente für Rasterbilder«, Seite 74). Das generelle Codefragment hierfür sieht wie folgt aus: ' Template definieren lTemplate = oPDF.begin_template(template_width, template_height); ...mit Text-, Vektorgrafik- und Rasterbildfunktionen zeichnen... oPDF.end_template ... oPDF.begin_page page_width, page_height ' Template verwenden oPDF.place_image lTemplate, 0.0, 0.0, 1.0 ...weitere Zeichenoperationen... oPDF.end_page ... oPDF.close_image lTemplate 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 4.6, »Rasterbildfunktionen«, Seite 109, außer place_ image( ) und 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) werden dürfen. > Die Funktionen in Abschnitt 4.8, »Hypertextfunktionen«, Seite 118. Hypertextelemente müssen immer auf der Seite definiert werden, auf der sie im Dokument erscheinen sollen. Sie können nicht als Bestandteil eines Templates generiert werden. Hinweis Auf Templates können Sie zudem alle Bildbearbeitungsalgorithmen anwenden, die in Abschnitt 3.4.2, »Häufig benötigte Codefragmente für Rasterbilder«, Seite 74, beschrieben werden. Setzen Sie dabei für get_value ("imagewidth", image) einfach die Breite des Templates ein und verfahren Sie ebenso für die Höhe. Template-Unterstützung in Software von Drittanbietern. Templates (form XObjects) sind integraler Bestandteil der PDF-Spezifikation und können mit Acrobat problemlos angezeigt und gedruckt werden. Da diese Art von PDF-Konstrukt von Acrobat Distiller jedoch nur sehr selten generiert wird, können nicht alle PDF-Viewer damit umgehen. So lässt sich zum Beispiel in Acrobat 4 das TouchUp-Textwerkzeug nicht zur Manipulation von Templates verwenden (dieser Fehler ist in Acrobat 5 behoben). Der PDF-Editor PitStop 5 ist zwar in der Lage, Templates zu verschieben, kann aber nicht auf einzelne 3.2 Seitenbeschreibungen 45 Elemente innerhalb eines Templates zugreifen. Adobe Illustrator 9 und 10 dagegen bieten vollständige Template-Unterstützung. 3.3 Textbehandlung 3.3.1 Die PDF-Standardschriften PDF-Viewer unterstützen standardmäßig 14 Schriften, die nicht in PDF-Dateien eingebettet zu werden brauchen. Auch wenn eine Schrift nicht in die PDF-Datei eingebettet wurde, müssen PDF und somit auch PDFlib die Breite der einzelnen Zeichen kennen. Aus diesem Grund enthält die PDFlib-Binärversion Metrikdaten für die Standardschriften. Die integrierten Metrikdaten sind aber nur für den Zeichensatz host verfügbar (siehe unten). Wird ein anderer Zeichensatz verwendet, sind Metrikdateien erforderlich. Aus diesem Grund enthält die PDFlib-Distribution Metrikdateien für die PDF-Standardschriften. Die Standardschriften sind: Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, ZapfDingbats 3.3.2 In PDFlib integrierte 8-Bit-Zeichensätze PDF unterstützt beliebige Zeichensätze (die Abbildung von numerischen Codes auf die Zeichen) für 8-Bit-Textschriften, und ebenso ist PDFlib in der Lage, verschiedene Zeichensätze für Text zu unterstützen. Alle von PDFlib intern unterstützten Zeichensätze werden dabei über symbolische Namen referenziert. Tabelle 3.3 zeigt die symbolischen Namen für die von PDFlib intern unterstützten Zeichensätze. Außerdem können Zeichensätze in externen Encoding-Dateien verfügbar sein, die mit PDFlib ausgeliefert (siehe unten) oder vom Benutzer definiert werden (siehe Abschnitt 3.3.3, »Benutzerdefinierte 8-Bit-Zeichensätze und Codepages«, Seite 48). Alle unterstützten Zeichensätze lassen sich in einem Dokument beliebig kombinieren. Im Prinzip können sogar verschiedene Zeichensätze für eine einzige Schrift verwendet werden, was jedoch nur selten von Interesse sein dürfte. Hinweis Für eine bestimmte Schrift können nicht unbedingt alle Zeichensätze verwendet werden. Der Benutzer muss deshalb sicherstellen, dass die Schrift alle Zeichen enthält, die vom jeweiligen Zeichensatz benötigt werden. Dieses Problem kann auch bei den Acrobat-Standardschriften auftreten (siehe Tabelle 3.4). Tabelle 3.3 Von PDFlib intern unterstützte Zeichensätze 46 Zeichensatz Beschreibung winansi Windows-Codepage 1252, eine Obermenge von ISO 8859-1 macroman Mac-Roman-Encoding, das heißt der Macintosh-Standardzeichensatz ebcdic EBCDIC-Codepage 1047; wird z.B. auf den Systemen IBM AS/400 und S/390 verwendet builtin Original-Zeichensatz für Symbolschriften oder nicht lateinische Textschriften host macroman auf dem Mac, ebcdic auf EBCDIC-basierten Systemen und winansi auf allen anderen Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Der winansi-Zeichensatz. Dieser Zeichensatz stellt den Windows-ANSI-Zeichensatz dar, genauer gesagt Codepage 1252 einschließlich der drei Zeichen, die Microsoft für Windows 98/2000/XP hinzugefügt hat (Euro, Zcaron und zcaron). Der Zeichensatz winansi stellt eine Obermenge von ISO 8859-1 (Latin-1) dar und kann somit auch auf Unix-Systemen verwendet werden. Hinweis Die meisten PostScript-Schriften enthalten die drei zusätzlichen Zeichen noch nicht. In den Standardschriften von Acrobat 4 und 5 sind sie aber enthalten. Der macroman-Zeichensatz. Dieser Zeichensatz zeigt den Mac-OS-Zeichensatz mit folgenden Abweichungen: An Position 219 befindet sich das alte Währungssysmbol und nicht das Eurozeichen, wie es von Apple neu definiert wurde (diese Inkompatibilität ist durch die PDF-Spezifikation bedingt). Außerdem sind weder das Apple-Zeichen noch die mathematischen Symbole vorhanden, die im Mac-OS-Zeichensatz definiert sind. Der ebcdic-Zeichensatz. Dieser Zeichensatz stellt EBCDIC (Extended Binary Coded Decimal Interchange Code) dar, der von IBM definiert wurde und auf Mainframe-Systemen wie IBM AS/400 oder S/390 im Einsatz ist. Genauer gesagt verwendet der Zeichensatz ebcdic von PDFlib die EBCDIC-Codepage 1047. Wie auch bei den anderen PDFlib-Zeichensätzen steht ebcdic immer zur Verfügung, nicht nur auf EBCDIC-basierten Systemen. Der Unterschied besteht jedoch darin, dass die integrierten Metrikdaten für die Standardschriften auf solchen Systemen nach dem ebcdic-Zeichensatz angeordnet sind und sich der Zeichensatz host (siehe unten) auch auf den ebcdic-Zeichensatz bezieht. Der builtin-Zeichensatz. Der Name builtin bezieht sich nicht auf eine bestimmte Anordnung der Zeichen, sondern bedeutet eigentlich einfach »nimm die Schrift wie sie ist und ändere den Zeichensatz nicht«. Dieses Konzept wird auch als schriftspezifischer (font specific) Zeichensatz bezeichnet und spielt bei Logo- und Symbolschriften oder nicht lateinischen Schriften (wie Griechisch oder Kyrillisch) eine entscheidende Rolle. Solche Schriften 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 Symbolschriften verwendet werden, zum Beispiel für die Schriften Symbol oder ZapfDingbats. Ob es sich um eine solche Schrift handelt, lässt sich aus folgendem Eintrag in der AFM-Datei ermitteln: EncodingScheme FontSpecific Textschriften können umkodiert (das heißt an eine bestimmte Codepage oder einen bestimmten Zeichensatz angepasst) werden. Mit Symbolschriften ist dies nicht möglich, so dass dort der Zeichensatz builtin verwendet werden muss. Hinweis Leider hat sich das Konzept der schriftspezifischen Zeichensätze bei Schriftentwicklern und Schriftherstellern nicht vollständig durchgesetzt (dies mag an mangelhaften Entwicklungstools liegen). So findet man viele lateinische Textschriften mit vorgeblich schriftspezifischem Zeichensatz und zahlreiche Symbolschriften, die fälschlicherweise als Textschriften gekennzeichnet sind. Der host-Zeichensatz. Wie bei builtin spielt auch der Zeichensatz host eine Sonderrolle, da es sich um keinen bestimmten Zeichensatz handelt. Der Zeichensatz host wird auf dem Mac auf macroman, auf EBCDIC-basierten Systemen auf ebcdic und auf allen ande- 3.3 Textbehandlung 47 ren System auf winansi abgebildet. Er eignet sich damit in erster Linie zur Entwicklung plattform unabhängiger Testprogramme (zum Beispiel derjenigen in der PDFlib-Distribution) oder anderen vom Zeichensatz her einfachen Anwendungen. Wenn PDFlibClientprogramme stets den nativen Zeichensatz des Systems (host) verwenden, erzeugen sie auch immer PDF-Text mit »korrektem« Zeichensatz. Im Gegensatz zu allen anderen Aspekten von PDFlib ist der Zeichensatz host an sich nicht portierbar. Aus diesem Grund empfiehlt er sich auch nicht für den produktiven Betrieb, und sollte dort durch winansi oder eine andere geeignete Kodierung ersetzt werden. 3.3.3 Benutzerdefinierte 8-Bit-Zeichensätze und Codepages Um weitere Flexibilität in der Schriftbehandlung zu ermöglichen, unterstützt PDFlib neben den vordefinierten Zeichensätzen (siehe Abschnitt 3.3.2, »In PDFlib integrierte 8Bit-Zeichensätze«, Seite 46) 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 Zeichensatztabellen mit PostScript-Glyphennamen akzeptiert PDFlib Unicodebasierte Codepage-Tabellen. Auf diese Zeichen kann mit 8-Bit-Codes zugegriffen werden. Folgende Schritte sind erforderlich, um einen benutzerdefinierten Zeichensatz in einem PDFlib-Programm zu verwenden: > Generieren Sie eine Beschreibung des Zeichensatzes in einer einfachen Textdatei. > Konfigurieren Sie den Zeichensatz in der PDFlib-Ressourcedatei (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57) oder über set_ parameter( ). > Stellen Sie eine Schrift bereit (Metrik- und ggf. Fontdatei), die alle im Zeichensatz verwendeten Zeichen enthält. Natürlich müssen die Zeichen in der Schrift entsprechend der Zeichensatztabelle die korrekten PostScript-Glyphennamen tragen. In der Encoding-Datei werden einfach zeilenweise alle Glyphennamen und die dazugehörigen Nummern aufgelistet. Der folgende Ausschnitt zeigt zum Beispiel die Definition des Zeichensatzes ISO 8859-2 (Latin 2): % Encoding-Definition für PDFlib % ISO 8859-2 (Latin-2) space 32 % 0x20 exclam 33 % 0x21 quotedbl 34 % 0x22 ...weitere Glyphenzuordnungen... yacute 253 % 0xFD tcommaaccent 254 % 0xFE dotaccent 255 % 0xFF Das nächste Beispiel zeigt einen Ausschnitt aus einer Unicode-Codepage für denselben Zeichensatz ISO 8859-2: % Codepage-Definition for PDFlib % ISO 8859-2 (Latin-2) 0x0020 32 % 0x20 0x0021 33 % 0x21 0x0022 34 % 0x22 ...weitere Glyphenzuordnungen... 0x00FD 253 % 0xFD 48 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) 0x0163 0x02D9 254 255 % 0xFE % 0xFF Formal ausgedrückt ist der Inhalt einer Zeichensatz- oder Codepage-Datei nach folgendem Muster 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 Tabulatorzeichen sowie ein Zeichencode (hexadezimal oder dezimal) zwischen 0 und 255 (dezimal). Dabei sind nur Unicode-Werte der Adobe Glyph List (AGL) zulässig (siehe Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65). > 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. Per Konvention bezeichnen wir Tabellen mit Zeichennamen als Encoding-Dateien (encoding files, *.enc) und Tabellen mit Unicode-Werten als Codepage-Dateien (*.cpg). PDFlib behandelt beide auf dieselbe Art (und kümmert sich nicht um Dateinamen) und konvertiert automatisch zwischen Zeichensatz- und Codepage-Dateien, sobald dies erforderlich ist. Diese Konvertierung basiert auf Adobes Standardliste der PostScript-Glyphennamen (der Adobe Glyph List oder AGL1). Die AGL ist in PDFlib integriert und enthält mehr als 1000 Glyphennamen. Encoding-Dateien sind bei PostScript-Schriften mit Glyphennamen erforderlich, die nicht dem Standard entsprechen, während Codepages sich besser für den Umgang mit TrueType-Schriften eignen, die auf Unicode basieren. Die Beziehung zwischen dem Namen der Encoding-Datei und dem Namen des eigentlichen Zeichensatzes (der mit findfont( ) zu verwenden ist) wird in der PDFlib-Ressourcedatei oder über set_parameter( ) festgelegt (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57). Mitgelieferte Encoding-Dateien. Die PDFlib-Distribution enthält mehrere Encodingund Codepage-Dateien, die unter Umständen nützlich sind, wenn Sie einen dieser Zeichensätze direkt verwenden oder ihn als Ausgangspunkt für eigene Encoding-Dateien verwenden möchten. Dazu müssen die PDFlib-Ressourcekonfigurationsdatei sowie die Fontmetrikdateien verfügbar sein (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57). Tabelle 3.4 zeigt eine Übersicht der mit PDFlib ausgelieferten Codepages und ihren Einsatz mit wichtigen Kategorien von Schriften. So enthalten die Acrobat-Standardschriften im Gegensatz zu den Schriftklassen PostScript 3, OpenType Pro und TrueType »Big Fonts« zum Beispiel nicht alle Zeichen, die für ISO 8859-2 oder ISO 8859-5 benötigt werden. Ermittlung von PostScript-Zeichennamen. Um einen eigenen Zeichensatz zu schreiben oder die richtigen Schriften für einen mitgelieferten Zeichensatz zu finden, benötigen Sie eine exakte Definition des von einem Zeichensatz benötigten Zeichenvorrats sowie die genauen Glyphennamen, die in der Fontdatei verwendet werden. Sie müssen also sicherstellen, dass die gewählte Schrift alle vom Zeichensatz benötigten Zeichen enthält. 1. Die AGL kann unter http://partners.adobe.com/asn/developer/type/glyphlist.txt abgerufen werden. 3.3 Textbehandlung 49 Tabelle 3.4 Mit PDFlib ausgelieferte Zeichensätze und ihr Einsatz mit verschiedenen Schriftkategorien Codepage Unterstützte Sprachen PS Level 1/2, Acrobat 4/51 PostScript 32 OpenType Pro Fonts3 »Big Fonts«, z.B. Tahoma iso8859-1 (Latin-1) Westeuropäische Sprachen ja ja ja ja iso8859-2 (Latin-2) Slawische Sprachen in Mitteleuropa nein ja ja ja4 iso8859-3 (Latin-3) Esperanto und Maltesisch nein nein ja ja iso8859-4 (Latin-4) Estnisch, die baltischen Sprachen und Grönländisch nein nein ja ja iso8859-5 Bulgarisch, Russisch und Serbisch4 nein nein ja ja iso8859-6 Arabisch nein nein nein ja iso8859-7 Modernes Griechisch nein nein 2 Zeichen fehlen ja iso8859-8 Hebräisch und Jüdisch4 nein nein nein ja iso8859-9 (Latin-5) Westeuropäisch und Türkisch 5 Zeichen fehlen ja ja ja5 iso8859-10 (Latin-6) Nordische Sprachen (Variation von Latin-4) nein nein 1 Zeichen fehlt ja iso8859-13 (Latin-7) Baltische Sprachen nein ja ja ja iso8859-14 (Latin-8) Keltisch6 nein nein nein nein iso8859-15 (Latin-9) Ergänzt Latin-1 um das Eurozeichen und einige französische und finnische Zeichen ja7 ja ja ja iso8859-16 (Latin-10) Ungarisch, Polnisch, Rumänisch und nein Slowenisch ja ja ja cp1250 Mitteleuropäisch ja ja ja 4 nein cp1251 Kyrillisch nein nein ja ja cp1252 Westeuropäisch ja ja ja ja cp1253 Griechisch nein nein 2 Zeichen fehlen ja cp1254 Türkisch 5 Zeichen fehlen ja ja ja5 cp1255 Hebräisch4 nein nein nein ja cp1256 Arabisch nein nein nein 5 Zeichen fehlen cp1257 Baltisch nein ja ja ja cp1258 Vietnamesisch nein nein nein ja 1. Ursprünglicher Adobe Latin Zeichensatz (Type-1-Schriften seit 1982) 2. Erweiterter Adobe Latin Zeichensatz (CE-Fonts) (Type 1 Schriften seit PostScript 3) 3. Entspricht im Wesentlichen der Adobe Glyph List (AGL). 4. Funktioniert in Acrobat 4 nicht richtig. Dieser Fehler wurde in Acrobat 5 behoben. 5. Acrobat 4 zeigt das Zeichen »Großes I mit Punkt« (221 = 0xDD) im Gegensatz zu Acrobat 5 nicht korrekt an. 6. 14 Zeichen funktionieren in Acrobat 4/5 nicht, da sie nicht in der Adobe Glyph List (AGL) liegen. 7. Bis auf das Eurozeichen in PostScript Level 1 und 2. 50 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Die mit Acrobat 4/5 mitgelieferten Standardschriften unterstützen zum Beispiel weder ISO 8859-2 (Latin 2) noch die Windows-Codepage 1250. Falls Sie den Fonteditor FontLab1 zur Hand haben (der sich übrigens großartig für jede Art von Schrift- und Zeichensatzangelegenheiten eignet), können Sie die von einer Schrift unterstützten Zeichensätze ermitteln (schlagen Sie in der FontLab-Dokumentation unter dem Stichwort »Codepages« nach).2 Zur Erleichterung für den PDFlib-Benutzer wird das PostScript-Programm print_ glyphs.ps mit PDFlib ausgeliefert, das die Namen aller in einer PostScript-Schrift vorhandenen Zeichen ermittelt. Dazu fügen Sie am Ende dieser Datei mit einem Texteditor den Namen der fraglichen Schrift ein und senden die Datei (gemeinsam mit der Schrift) an einen PostScript-Level-2- oder Level-3-Drucker, distillieren sie oder betrachten sie mit einem Level-2-kompatiblen PostScript-Viewer. Das Programm druckt alle in der Schrift vorhandenen Zeichen, und zwar alphabetisch nach Glyphennamen sortiert. Ist ein von einem benutzerdefinierten Zeichensatz benötigtes Zeichen in einer Schrift nicht vorhanden, so fehlt es auch im PDF-Dokument. 3.3.4 Das Eurozeichen Um das Zeichen für die europäische Währung Euro sauber anzuzeigen und zu drucken, müssen eine Reihe von Faktoren berücksichtigt werden. Wir möchten hier deshalb einige Hinweise geben, die Ihnen im Umgang mit dem Eurozeichen von Nutzen sein können. Vor allem anderen müssen Sie einen Zeichensatz wählen, der das Eurozeichen enthält, und überprüfen, an welcher Position es sich befindet. Einige Beispiele: > Im Zeichensatz winansi befindet es sich an Position 0x80 (hexadezimal) oder 128 (dezimal). > Die Zeichensätze macroman und iso8859-1 enthalten kein Eurozeichen. > Der Zeichensatz iso8859-15 stellt eine Erweiterung von iso8859-1 dar, in der das Eurozeichen an Position 0xA4 (hexadezimal) oder 164 (dezimal) ergänzt wurde. Danach müssen Sie eine Schrift aussuchen, die das Eurozeichen enthält. Dies ist bei vielen, aber durchaus nicht allen modernen Schriften der Fall. Auch hier einige Beispiele: > Die Standardschriften von Acrobat enthalten das Eurozeichen erst ab Version 4.05. In älteren Versionen ist es nicht vorhanden. > 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 Symbol-Font verwenden, der sich dort an Position 0xA0 (hexadezimal) oder 160 (dezimal) befindet. Er ist in der Version des Symbol-Font, die ab Acrobat Version 4.0 ausgeliefert wird, sowie im in PostScript-3-Geräte eingebauten Symbol-Font verfügbar. Wenn Sie die Schrift nicht einbetten, zeigt Acrobat den Text mit einer seiner Ersatzschriften an. Diese enthalten das Eurozeichen erst ab Acrobat Version 4.0. Das kann zu uneinheitlichen Ergebnissen bei Anzeige und Ausdruck führen. 1. Siehe http://www.fontlab.com 2. Informationen über die in PostScript-Schriften verwendeten Glyphennamen finden Sie unter http://partners.adobe.com/ asn/developer/typeforum/unicodegn.html (Schriftanbieter müssen sich aber nicht an diese Empfehlungen für Glyphennamen halten). 3.3 Textbehandlung 51 0 1 0 1 2 3 4 5 6 7 8 9 A B C D E F 000 001 002 003 004 005 006 007 010 011 012 013 014 015 016 017 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037 H I J K L M N O 2 ! " # $ % & ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 040 041 042 043 044 045 046 047 050 051 052 053 054 055 056 057 060 061 062 063 064 065 066 067 070 071 072 073 074 075 076 077 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 6 a b c d e f g h i j k l m n o 140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 7 p q r s t u v w x y z { | } ~ 160 161 162 163 164 165 166 167 170 171 172 173 174 175 176 177 8 9 A B C D E F 200 201 202 203 204 205 206 207 210 211 212 213 214 215 216 217 220 221 222 223 224 225 226 227 230 231 232 233 234 235 236 237 ` ¬ ¼ Ì ' ½ Í ® ¾ Î ¯ ¿ Ï ¡ ¢ ° ± ² À Á Â Ð Ñ Ò ¥ µ Å Õ ¦ ¶ Æ Ö § · Ç × ¨ ¸ È Ø £ ³ Ã Ó 240 241 242 243 244 245 246 247 250 251 252 253 254 255 260 261 262 263 264 265 266 267 270 271 272 273 274 300 301 302 303 304 305 306 307 310 311 312 313 320 321 322 323 324 325 326 327 330 331 332 340 341 342 343 344 345 346 347 350 351 360 361 362 363 364 365 366 367 370 371 ¤ ´ Ä Ô ª º Ê Ú « » Ë Û 256 257 275 276 277 314 315 316 317 333 334 335 336 337 352 353 354 355 356 357 372 373 374 375 376 377 © ¹ É Ù Abb. 3.1 Der Zeichensatz PDFDocEncoding mit hexadezimalen und oktalen Codes, so wie er in PDF 1.3 definiert ist. Dieser kann nicht für Seitenbeschreibungen verwendet werden! 3.3.5 Zeichensätze für Hypertext PDF unterstützt zwei Methoden zur Kodierung von Hypertextelementen wie Lesezeichen, Anmerkungen und Dokumentinfofeldern (Dokumentzusammenfassung). Bis Acrobat 3 mussten alle Hypertextstrings mit einem speziellen 8-Bit-Zeichensatz namens PDFDocEncoding kodiert werden (PDFDocEncoding kann nicht für Text in Seitenbeschreibungen verwendet werden). Ab Acrobat 4 können in allen Hypertextelementen Unicode-Strings benutzt werden. Weitere Informationen über Unicode finden Sie in Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65. PDFDocEncoding (siehe Abbildung 3.1) stellt eine Obermenge von ISO 8859-1 (Latin 1) dar und enthält deshalb alle ASCII-Zeichen im unteren Bereich. PDFDocEncoding und die Windows-Codepage 1252 sind recht ähnlich, weichen aber im Bereich zwischen 128 und 160(&H80 und &HA0) stark voneinander ab. Viele Clients können ohne zusätzliche Maßnahmen unmittelbar mit PDFDocEncoding arbeiten. Da sich der Mac-Zeichensatz aber gravierend von PDFDocEncoding unterscheidet, müssen Mac-Strings gesondert konvertiert werden, wenn sie in Hypertextelementen vorkommen und nicht-ASCII-Zeichen enthalten. Mac-Sonderzeichen müssen in 52 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Unicode umgewandelt werden, bevor sie in Hypertextelementen einsetzbar sind. Diese Umwandlung muss vom Client durchgeführt werden. 3.3.6 PostScript-, TrueType- und OpenType-Schriften Schrifteinbettung in PDF. PDF unterstützt Schriften jenseits der 14 Standardschriften auf verschiedene Art und Weise. PDFlib kann Fonts in die generierte PDF-Ausgabe einbetten. Alternativ dazu kann ein Fontdeskriptor eingebettet werden, der nur die Metrik der Zeichen (ohne die eigentlichen Zeichenbeschreibungen) sowie allgemeine Schriftinformationen 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 im PDF-Dokument enthaltenen Fontdeskriptors eine Ersatzschrift konstruiert. Tabelle 3.5 zeigt die verschiedenen Situationen bei der Schriftverwendung und die jeweils erforderlichen Font- und Metrikdateien. Wird eine Schrift mit fontspezifischem Zeichensatz verwendet (Symbolschrift), aber nicht in die PDF-Ausgabe eingebettet, ist das PDF-Dokument unbrauchbar, sofern die fragliche Schrift nicht bereits auf dem Zielsystem installiert ist (denn Acrobat kann nur lateinische Textschriften simulieren). Solche PDF-Dokumente sind von Natur aus nicht portierbar, wenngleich sie in beschränktem Rahmen wie zum Beispiel beim innerbetrieblichen Dokumentenaustausch sinnvoll sein können. Tabelle 3.5 Schrifteinsatz mit erforderlichen Metrik- und Fontdateien Schrifteinsatz Metrikdatei erforderlich? Fontdatei erforderlich? Eine der 14 Standardschriften mit host-Encoding1,2 nein nein3 Eine der 14 Standardschriften mit anderem Zeichensatz als host2 ja (AFM-Dateien in PDFlibDistribution enthalten) nein TrueType- oder OpenType-Schrift, die auf dem Mac- oder Windowsystem installiert ist (Systemschriften) nein nein PostScript-Nichtstandardschriften ohne Einbettung ja nein PostScript-Nichtstandardschriften mit Einbettung ja ja Weitere Schrift/Zeichensatz-Kombinationen, für die die Metriken in PDFlib vorhanden sind (siehe unten) nein ja, wenn Einbettung erwünscht TrueType-Schriften mit oder ohne Einbettung nein ja OpenType-Schriften mit TT- oder PS-Zeichenbeschreibungen nein ja Standard-CID-Schriften4 nein nein Nicht-Standard-CID-Schriften (nicht unterstützt) (nicht unterstützt) 1. Eine Liste der Standardschriften finden Sie in Abschnitt 3.3.1, »Die PDF-Standardschriften«, Seite 46. 2. Eine Definition des PDFlib-Systemzeichensatzes finden Sie in Abschnitt 3.3.2, »In PDFlib integrierte 8-Bit-Zeichensätze«, Seite 46. 3. Zeichenbeschreibungen können im PostScript-, aber nicht im TrueType-Format zur Einbettung bereitgestellt werden. 4. Weitere Informationen über CID-Fonts finden Sie in Abschnitt 3.3.8, »Japanischer, chinesischer und koreanischer Text«, Seite 60. OpenType-Schriften. OpenType ist ein neues Fontformat, das PostScript und TrueType kombiniert und ein plattformunabhängiges Dateiformat nutzt. Windows 2000, Windows XP und Mac OS X verfügen über integrierte OpenType-Unterstützung. Es gibt zwei Varianten von OpenType-Schriften: > OpenType-Schriften mit TrueType-Zeichenbeschreibungen (*.ttf) entsprechen weitgehend den herkömmlichen TrueType-Schriften. 3.3 Textbehandlung 53 > OpenType-Schriften mit PostScript-Zeichenbeschreibungen (*.otf) enthalten PostScript-Daten in einem TrueType-Dateiformat. Diese Variante wird auch CFF genannt. PDFlib unterstützt beide Varianten von OpenType-Schriften. Die Informationen in den folgenden Abschnitten zur Konfiguration von PostScript- und TrueType-Schriften beziehen sich auch auf OpenType-Schriften. PostScript-Type-1-Schriften. 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-spezifische Format PFM (Printer Font Metrics) für Fontmetrikdaten. Da PFM-Dateien keine vollständigen Metrikinformationen enthalten, sondern nur die unter Windows verwendeten Glyphen (Codepage 1252), können sie nur mit den Zeichensätzen winansi oder builtin eingesetzt werden, während sich auf AFM basierende Fontmetriken in jeden von der Schrift unterstützten Zeichensatz umsortieren lassen. > Das plattformunabhängige Format PFA (Printer Font ASCII) und das Windows-spezifische Format PFB (Printer Font Binary) für Zeichenbeschreibungen im PostScript-Type1-Format (manchmal auch »ATM-Schriften« genannt). PostScript-Type-3-Schriften werden nicht unterstützt. > Auf dem Mac werden auch die Mac-typischen ressourcenbasierten PostScript-Type1-Schriften, manchmal LWFN-Schriften (LaserWriter Font) genannt, unterstützt. > OpenType-Schriften mit PostScript-Zeichenbeschreibungen (*.otf). Wenn Sie zu einer PostScript-Schrift die Zeichenbeschreibungs-, aber nicht die Metrikdatei besitzen, können Sie versuchen, die fehlenden Metrikdaten mit einem der frei verfügbaren Hilfsprogramme zu generieren. Das Softwarepaket T1lib beispielsweise1 enthält das Programm type1afm zur Erzeugung von AFM-Metriken aus PFA- oder PFBZeichenbeschreibungsdateien. PostScript-Schriftnamen. Um eine Schrift in PDFlib nutzen zu können, müssen Sie den richtigen PostScript-Schriftnamen (unter Berücksichtigung von Groß- und Kleinschreibung) verwenden. Es gibt mehrere Möglichkeiten, den korrekten Namen für eine PostScript-Schrift herauszufinden: > Öffnen Sie die Zeichenbeschreibungsdatei (*.pfa oder *.pfb) und finden Sie den String nach dem Eintrag /FontName. Entfernen Sie den Schrägstrich / am Anfang und verwenden Sie den Rest als Schriftnamen. > Ist ATM (Adobe Type Manager) installiert, können Sie auf die Zeichenbeschreibungsdatei (*.pfb) oder auf die Metrikdatei (*.pfm) doppelklicken, und ein Schriftbeispiel sowie der PostScript-Name der Schrift werden angezeigt. > Öffnen Sie die AFM-Metrikdatei und suchen Sie nach dem Eintrag FontName. Hinweis Der PostScript-Schriftname kann ganz anders lauten als der Fontname in Windows. So erscheint die Schrift »AvantGarde-Demi« (PostScript-Name) im Windows-Schriftmenü zum Beispiel als »AvantGarde, Bold«. Genauso ist der Schriftname, der in den .inf-Dateien für Windows erscheint, für den Einsatz mit PDF nicht relevant. Performance bei PostScript-Schriften. Es ist wichtig sich klarzumachen, inwieweit die Schriftbehandlung die Performance von PDFlib beeinflusst. Im Allgemeinen wird auf 1. Siehe http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html 54 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) die Metrikdaten einer Schrift (im Arbeitsspeicher oder auf der Festplatte) zugegriffen, wenn eine bestimmte Kombination von Schrift und Zeichensatz zum ersten Mal verwendet wird. Alle weiteren Zugriffe auf dieselbe Kombination erfolgen über den internen Fontcache von PDFlib, was keine Leistungseinbußen zur Folge hat. Bezüglich der Performance bei der Schriftbehandlung ist folgendes anzumerken: > PFM-Metrikdateien können wegen der geringen Größe und des Binärformats viel schneller gelesen werden als auf Text basierende AFM-Metrikdateien. Sie sind aber nicht für alle Zeichensätze einsetzbar. > AFM-Dateien enthalten viele nützliche Informationen über zahlreiche Aspekte des Schriftgebrauchs und können außerdem für beliebige Zeichensätze verwendet werden. Obwohl für PDFlib nur die bloßen Laufweiten erforderlich sind, muss die AFMDatei vollständig geparst werden. TrueType- und OpenType-Schriften. PDFlib unterstützt auf allen Systemen TrueTypeund OpenType-Schriften. Die TrueType-Fontdatei muss im TTF-Format von Windows bereitgestellt werden. Alternativ dazu können die Schriften auf dem Mac und unter Windows im System installiert sein. Im Gegensatz zu PostScript-Type-1-Schriften erfordern TrueType- und OpenType-Schriften keine zusätzliche Metrikdatei, da die Metrikdaten aus der Fontdatei selbst extrahiert werden. PDFlib unterstützt gegenwärtig folgende Varianten von TrueType-Schriften: > Unicode-kompatible TrueType-Schriften (cmap-Tabelle mit Plattformkennung 3, Zeichensatzkennung 1). Die meisten modernen TrueType-Schriften für Windows fallen in diese Kategorie und können mit dem PDFlib-Zeichensatz winansi verwendet werden. Andere Unicode-kompatible Schriften können mit einem beliebigen PDFlib-Zeichensatz benutzt werden, solange die Schrift auch tatsächlich alle vom Zeichensatz definierten Zeichen enthält. Mit der unten beschriebenen Software »font properties extension« können Sie überprüfen, welche Codepages von einer bestimmten Schrift unterstützt werden. > Symbol-Schriften mit einem benutzerdefinierten Zeichensatz (cmap-Tabelle mit Plattformkennung 3, Zeichensatzkennung 0). Für solche Schriften muss der PDFlibZeichensatz builtin gewählt werden. > Mac-TrueType-Schriften sowie die meisten TrueType-Schriften für Windows sind auch mit dem PDFlib-Zeichensatz macroman einsetzbar, da sie neben den WindowsInformationen auch die notwendigen Mac-Daten enthalten (cmap-Tabelle mit Plattformkennung 1, Zeichensatzkennung 0). Die oben erwähnte Unterscheidung zwischen Text- und Symbolschriften scheint offensichtlich zu sein, in der Praxis ist es manchmal aber gar nicht einfach, die Kategorie einer Schrift festzustellen. Aus diversen Gründen können Textschriften zum Beispiel als TrueType-Symbolschriften kodiert sein und umgekehrt. Im Falle eines unpassenden Zeichensatzes unterstützt Sie PDFlib, indem sie innerhalb der PDFlib-Exception eine Meldung mit Vorschlägen für andere Zeichensätze anzeigt. Hinweis PDFlib unterstützt keine TrueType-Collections (*.ttc). Betriebssystemschriften. Neben dem Zugriff auf Fontdateien, die in PDFlib manuell konfiguriert sind (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57) können TrueType- und OpenType-Schriften auch direkt vom Betriebssystem bezogen werden. Solche Schriften bezeichnen wir als Betriebssystemschriften. Statt sich mit Font- und Konfigurationsdateien herumzuschlagen, installieren Sie 3.3 Textbehandlung 55 die Schrift einfach im Betriebssystem (das heißt, Sie legen sie einfach im Verzeichnis fonts ab) und schon kann sie von PDFlib verwendet werden. Im Betriebssystem installierte Schriften werden nicht zur Einbettung von Standardschriften verwendet. Die Unterstützung von Betriebssystemschriften ist auf dem Mac und unter Windows verfügbar: > Unter Windows werden Betriebssystemschriften für TrueType- und OpenTypeSchriften (TT- und PS-Variante) unterstützt. > Auf Mac OS 9 und Mac OS X werden Betriebssystemschriften für TrueType-Schriften (Suitcases), flache TrueType-Schriften im Windows-Stil, Datafork-TrueType-Schriften (.dfont) sowie OpenType-Schriften (TT- und PS-Variante) unterstützt. Ältere MacSchriften funktionieren nur mit dem macroman-Zeichensatz, während neuere Schriften oft auch andere Zeichensätze unterstützen. TrueType-Schriftnamen. Wird eine Schrift in PDFlib benutzt, so muss dies immer mit dem genauen TrueType-Schriftnamen (unter Berücksichtigung von Groß- und Kleinschreibung) erfolgen. Dieser entspricht dem Namen, der in der Benutzerschnittstelle erscheint. Um diesen Namen in Windows herauszufinden, doppelklicken Sie einfach auf die TrueType-Fontdatei. Verwenden Sie den Namen in der ersten Zeile des angezeigten Fensters mit Schriftinformationen (natürlich ohne einen der Begriffe TrueType oder OpenType in Klammern). Benutzen Sie nicht den Namen in der zweiten Zeile nach Schriftart! Auch können Schriftnamen entsprechend der jeweiligen Windows-Version teilweise lokalisiert sein. So kann der übliche Bestandteil Bold auf einem deutschen System als Fett erscheinen. In PDFlib müssen Sie die übersetzte Variante verwenden, um die Schriftdaten vom Betriebssystem zu beziehen. Dagegen müssen Sie die generische (nicht lokalisierte) Variante des Schriftnamens heranziehen, um die Schriftdaten direkt aus der Fontdatei abzurufen. Der Name einer TrueType-Schrift im generierten PDF-Dokument kann von den in PDFlib (oder Windows) benutzten Namen abweichen. Das ist normal und liegt darin begründet, dass PDF den PostScript-Namen einer TrueType-Schrift verwendet, der aber nicht unbedingt mit dem ursprünglichen TrueType-Namen übereinstimmt (zum Beispiel TimesNewRomanPSMT bzw. Times New Roman). Wenn Sie sich intensiver mit TrueType-Schriften beschäftigen möchten, dann können Sie sich die von Microsoft kostenlos erhältliche Software »font properties extension«1 besorgen, die zahlreiche Einträge der TrueType-Tabellen einer Schrift in lesbarer Form anzeigt. Hinweis Im Gegensatz zu PostScript-Schriften dürfen die Namen von TrueType- und OpenType-Schriften Leerzeichen enthalten. Rechtliche Aspekte der Schrifteinbettung. Es ist wichtig anzumerken, dass der bloße Besitz einer Fontdatei nicht unbedingt dazu berechtigt, die Schrift in ein PDF-Dokument 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 besondere Online- oder Einbettungslizenzen. Schließlich gibt es auch noch die Variante, die Einbettung nur bei Verwendung von Untergruppen zu erlauben. Überprüfen Sie deshalb bitte die rechtlichen Aspekte, bevor Sie Schriften mit PDFlib einbetten. PDFlib hält sich 1. Siehe http://www.microsoft.com/typography/property/property.htm 56 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) an Einbettungsbeschränkungen, wenn diese in einer TrueType-Schrift spezifiziert sind. Dies wird über ein Einbettungsflag bewerkstelligt, das auf no embedding1 gesetzt sein kann. In diesem Fall kommt PDFlib der Bitte des Herstellers nach und weist jeden Versuch zurück, die Schrift einzubetten. 3.3.7 Ressourcekonfiguration und die UPR-Ressourcedatei Um die von PDFlib behandelten Schriften und Zeichensätze plattformunabhängig und benutzerdefinierbar zu machen, kann eine Konfigurationsdatei angegeben werden, in der die verfügbaren Schriften gemeinsam mit den Namen der Font- und Metrikdateien sowie weiterer Encoding-Dateien aufgeführt sind. Außerdem kann die Konfiguration dynamisch zur Laufzeit durch Anfügen von Ressourcen mit set_parameter( ) erfolgen. Für die Konfigurationsdatei haben wir ein einfaches Textformat namens Unix PostScript Resource (UPR) ausgegraben, das in der Ära von Display PostScript erfunden wurde und immer noch auf diversen Systemen im Einsatz ist. Wir haben uns jedoch erlaubt, das ursprüngliche UPR-Format für unsere Zwecke zu erweitern. Das von PDFlib verwendete UPR-Dateiformat wird unten beschrieben.2 Es gibt zudem ein Hilfsprogramm namens makepsres (das oft mit dem X Window System mitgeliefert wird), das aus PostScriptFont- und -Metrikdateien automatisch UPR-Dateien generiert. Hinweis Als Alternative zur Konfiguration von Schriften über UPR-Dateien oder set_parameter( ) ist in manchen Situationen der von PDFlib angebotene Einsatz von Schriften sinnvoll, die im Betriebssystem installiert sind (siehe Abschnitt 3.3.6, »PostScript-, TrueType- und OpenType-Schriften«, Seite 53). 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. > Generell hebt ein Gegenschrägstrich die Sonderbedeutung des nachfolgenden Zeichens auf. So bewirkt ein Gegenschrägstrich ’\’ am Zeilenende, dass die Zeile auch nach dem Newline-Zeichen fortgeführt wird. In Windows-Verzeichnisnamen müssen zwei Gegenschrägstriche ’\\’ oder ein einfacher Schrägstrich ’/’ benutzt werden. > Der Punkt ’ . ’ dient als Abschnittsende und muss mit einem führenden Gegenschrägstrich versehen werden, wenn er am Anfang einer Zeile als normales Zeichen interpretiert werden soll. > Es wird prinzipiell zwischen Groß- und Kleinschreibung unterschieden. > Kommentare beginnen mit dem Prozentzeichen ’%’ und und enden am Zeilenende. > Leer- und Tabulatorzeichen werden ignoriert. UPR-Dateien bestehen aus folgenden Komponenten: > Eine Kopfzeile zur Identifizierung der Datei, die folgendermaßen aussieht: PS-Resources-1.0 > Ein Abschnitt, der alle Arten von Ressourcekategorien auflistet, die in der Datei beschrieben werden. Jede Zeile beschreibt eine Kategorie. Die Liste wird mit einem 1. Genauer gesagt: wenn das Flag fsType in der OS/2-Tabelle der Schrift den Wert 2 hat. 2. Eine vollständige Spezifikation befindet sich in dem Buch »Programming the Display PostScript System with X« (Appendix A), das unter http://partners.adobe.com/asn/developer/PDFS/TN/DPS.refmanuals.TK.pdf erhältlich ist. 3.3 Textbehandlung 57 Punkt abgeschlossen. Die verfügbaren Ressourcekategorien werden unten beschrieben. Dieser Abschnitt ist nur aus Kompatiblitätsgründen vorhanden und wird von PDFlib ignoriert. Hinweis Das Pfadpräfix in der UPR-Datei wird nicht von allen PDFlib-Editionen unterstützt. So ist es zum Beispiel bei der PDFlib-ActiveX-Komponente wirkungslos, da diese stattdessen Einträge aus der Windows-Registrierung verwendet und standardmäßig alle Dateien im PDFlib-Verzeichnis fonts erwartet. Wenn Sie auf Ressourcen in anderen Verzeichnissen zugreifen möchten, müssen Sie mit doppelten Gleichheitszeichen arbeiten (siehe unten). > Ein Abschnitt für jede der Ressourcekategorien, die am Dateianfang aufgeführt wurden. Jeder Abschnitt beginnt mit einer Zeile für die Ressourcekategorie, gefolgt von einer beliebigen Anzahl von Zeilen, die die verfügbaren Ressourcen beschreiben. Diese Liste wird durch eine Zeile mit einem einzelnen Punkt abgeschlossen. Jede Ressourcezeile besteht aus dem Namen der Ressource (bei Gleichheitszeichen sind Anführungszeichen erforderlich), einem Gleichheitszeichen sowie dem zugehörenden relativen oder absoluten Dateinamen für die Ressource. Relative Dateinamen werden als relativ zum PDFlib-Verzeichnis fonts interpretiert. Werden zwei Gleichzeitszeichen verwendet, so gilt der Dateiname als absolut und das Pfadpräfix wird nicht vorangestellt. Unterstützte Ressourcekategorien. Tabelle 3.6 führt die von PDFlib unterstützten Ressourcekategorien auf. In der UPR-Datei können zur Kompatibilität mit Display-PostScript-Installationen auch andere Ressourcekategorien vorkommen, diese werden aber stillschweigend ignoriert. Tabelle 3.6 In PDFlib unterstützte Ressourcekategorien Ressourcekategoriename Erklärung FontAFM PostScript-Fontmetrikdatei im AFM-Format FontPFM PostScript-Fontmetrikdatei im PFM-Format FontOutline PostScript-, TrueType- oder OpenType-Zeichenbeschreibungsdatei Encoding Textdatei mit 8-Bit-Zeichensatz oder Codepagetabelle Vermeiden Sie redundante Ressourceeinträge. Nehmen Sie zum Beispiel eine bestimmte Fontmetrikinformation nur einmal auf. Achten Sie zudem darauf, dass der Schriftname in der UPR-Datei exakt mit dem tatsächlichen Schriftnamen übereinstimmt (auch wenn PDFlib Abweichungen toleriert). Auf Mac OS Classic muss der Doppelpunkt ’:’ als Trennzeichen in Verzeichnisangaben verwendet werden. Die Schriftnamen der ressourcenbasierten PostScript-Type-1Schriften (LWFN-Fonts) müssen mit dem vollständigen Pfad einschließlich des VolumeNamens angegeben werden: Foo-Italic=Classic:Data:Fonts:FooIta UPR-Beispieldatei. Das folgende Listing zeigt ein Beispiel für eine von PDFlib verwendete UPR-Konfigurationsdatei. Darin werden die Metriken der 14 Standardschriften von PDF einschließlich der Metrik- und Zeichenbeschreibungsdateien für weitere Schriften sowie ein benutzerdefinierter Zeichensatz beschrieben: 58 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) PS-Resources-1.0 FontAFM FontPFM FontOutline Encoding . FontAFM Code-128=Code_128.afm Courier=Courier.afm Courier-Bold=Courier-Bold.afm Courier-BoldOblique=Courier-BoldOblique.afm Courier-Oblique=Courier-Oblique.afm Helvetica=Helvetica.afm Helvetica-Bold=Helvetica-Bold.afm Helvetica-BoldOblique=Helvetica-BoldOblique.afm Helvetica-Oblique=Helvetica-Oblique.afm Symbol=Symbol.afm Times-Bold=Times-Bold.afm Times-BoldItalic=Times-BoldItalic.afm Times-Italic=Times-Italic.afm Times-Roman=Times-Roman.afm ZapfDingbats=ZapfDingbats.afm . FontPFM Foobar-Bold=foobb___.pfm % Beispiel für absoluten Pfadnamen ohne Anfügen des Pfadpräfix % (zwei Gleichheitszeichen) Mistral==c:/psfonts/pfm/mist____.pfm . FontOutline Code-128=Code_128.pfa ArialMT=Arial.ttf . Encoding iso8859-2=iso8859-2.enc cp1250=cp1250.cpg . Suchen der UPR-Ressourcedatei. Sollen nur in PDFlib integrierte Ressourcen verwendet werden (PDF-Standardschriften mit Systemzeichensatz), dann ist keine UPR-Konfigurationsdatei erforderlich, da PDFlib selbst über alle notwendigen Ressourcen verfügt. Sollen andere Ressourcen verwendet werden, sucht PDFlib an verschiedenen Stellen nach einer Ressourcedatei. Dieser Vorgang ist konfigurierbar und besteht aus folgenden Schritten: > Die PDFlib-ActiveX-Komponente ermittelt mittels eines Registrierungseintrags die Datei pdflib.upr im Unterverzeichnis fonts des PDFlib-Installationsverzeichnisses. Kann diese Datei nicht geöffnet werden, wird ein IOError ausgelöst. > Kann die Ressourcedatei zwar geöffnet, die erforderliche Ressourcekategorie aber nicht gefunden werden, so wird ein SystemError ausgelöst. Konfiguration von Ressourcen ohne UPR-Datei. Statt mit einer UPR-Datei zu arbeiten, können Sie einzelne Ressourcen auch direkt mit der Funktion set_parameter( ) im Quellcode konfigurieren. Diese Funktion erhält einen Kategorienamen sowie den zugehörenden Ressourceeintrag, in etwa so, wie diese auch im entsprechenden Abschnitt in der UPR-Datei erscheinen, zum Beispiel: 3.3 Textbehandlung 59 oPDF.set_parameter "FontAFM", "Foobar-Bold=foobb___.afm" oPDF.set_parameter "FontOutline", "Foobar-Bold=foobb___.pfa" Wie in der UPR-Datei wird ein Dateiname als absolut interpretiert, wenn er nach doppelten Gleichheitszeichen steht. Ist nur ein einziges Gleichheitszeichen vorhanden, wird das Pfadpräfix verwendet, sofern es konfiguriert ist. 3.3.8 Japanischer, chinesischer und koreanischer Text CJK-Unterstützung in Acrobat und PDF1. Bereits in Acrobat 3J wurden japanische Schriften unterstützt. Mit Acrobat 4 wurde die vollständige Unterstützung von japanischen, chinesischen und koreanischen CID-Schriften (Character ID) eingeführt. Das gilt genauso für die nicht-japanischen Versionen des Acrobat-Vollprodukts und den kostenlos erhältlichen Acrobat Reader. Um CJK-Dokumente in Acrobat zu verwenden, ist einer der folgenden Schritte erforderlich: > Verwenden Sie eine lokalisierte CJK-Version von Acrobat. > Wenn Sie eine Nicht-CJK-Version des Acrobat-Vollprodukts verwenden, wählen Sie in der benutzerdefinierten Acrobat-Installation die Option »Unterstützung für asiatische Sprachen« (Windows) oder »Language Kit« (Mac). Die erforderlichen Hilfsdateien (Zeichen und Zeichensätze) werden dann von der Acrobat-CD installiert. > Beim Acrobat Reader installieren Sie eines der asiatischen Fontpakete, die auf der Acrobat-CD oder im Web verfügbar sind.2 CJK-Zeichensätze und -Schriften. Von diversen Standardisierungsgremien, Firmen und anderen Organisationen wurde über die Jahre hinweg ein breites Spektrum an CJKZeichensätzen entwickelt. Zum Glück werden alle der vorherrschenden Zeichensätze standardmäßig auch von Acrobat und PDF unterstützt. Acrobat 4 unterstützt unterschiedlichste Zeichensätze für CJK-Schriften. Da ein Zeichensatz für CJK-Text wesentlich komplizierter ist als für lateinischen Text, reicht ein einfacher Zeichensatz mit 256 Einträgen einfach nicht aus. Stattdessen arbeiten PostScript und PDF mit dem Konzept der character collections und character maps (CMaps) zur Anordnung der Zeichen in einer Schrift. Vom Konzept her kann man sich CMaps wie sehr große Zeichensätze für CJKSchriften vorstellen. Acrobat unterstützt einen Satz von Standardschriften für CJK-Text. Diese Schriften werden mit der Acrobat-Installation ausgeliefert (oder mit den asiatischen Fontpaketen) und müssen somit nicht in der PDF-Datei eingebettet sein (genauso wie die 14 Standardschriften für lateinischen Text). Diese Schriften enthalten alle Zeichen, die in den gängigen Zeichensätzen vorkommen und unterstützen sowohl horizontalen als auch vertikalen Text. Tabelle 3.7 zeigt die Standardschriften und CMaps. Die Acrobat-4-Schriften können auch mit Acrobat 5 verwendet werden, für Anzeige und Ausdruck werden jedoch die entsprechenden Acrobat-5-Schriften benutzt, falls eine benötigte Schrift nicht auf dem System installiert ist. Wie aus Tabelle 3.7 hervorgeht, unterstützen die standardmäßig vorhandenen CMaps die meisten CJK-Zeichensätze, die auf Mac-, Windows- und Unix-Systemen ver1. Bei dieser Gelegenheit soll das grundlegende Werk »CJKV information processing – Chinese, Japanese, Korean & Vietnamese 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 http://www.adobe.com/products/acrobat/cacrrasianfontpack.html 60 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) wendet werden, sowie einige andere herstellerspezifische Zeichensätze. Dabei werden inbesondere die wichtigen japanischen Zeichensätze Shift-JIS, EUC, ISO 2022 und Unicode (UCS-2) unterstützt. Tabellen mit allen unterstützten Zeichen sind bei Adobe1 erhältlich; CMap-Beschreibungen finden sich in Tabelle 3.8. Tabelle 3.7 Acrobats Standardschriften und CMaps (Zeichensätze) für Japanisch/Chinesisch/Koreanisch Sprache Schriftname Vereinfachtes Chinesisch STSong-Light1 Traditionelles Chinesisch MHei-Medium1 Beispiel STSongStd-Light-Acro2 MSung-Light1 Unterstützte CMaps (Zeichensätze) GB-EUC-H, GB-EUC-V, GBpc-EUC-H, GBpc-EUC-V, GBK-EUC-H, GBK-EUC-V, GBKp-EUC-H, GBKp-EUC-V, GBK2K-H, GBK2K-V, UniGB-UCS2-H, UniGB-UCS2-V B5pc-H, B5pc-V, HKscs-B5-H, HKscs-B5-V, ETen-B5-H, ETen-B5-V, ETenms-B5-H, ETenms-B5-V, CNS-EUC-H, CNS-EUC-V, UniCNS-UCS2-H, UniCNS-UCS2-V MSungStd-Light-Acro2 Japanisch HeiseiKakuGo-W51 HeiseiMin-W31 KozMinPro-Regular-Acro2 Koreanisch HYGoThic-Medium1 HYSMyeongJo-Medium1 83pv-RKSJ-H, 90ms-RKSJ-H, 90ms-RKSJ-V, 90mspRKSJ-H, 90msp-RKSJ-V, 90pv-RKSJ-H, Add-RKSJ-H, Add-RKSJ-V, EUC-H, EUC-V, Ext-RKSJ-H, Ext-RKSJ-V, H, V, UniJIS-UCS2-H, UniJIS-UCS2-V, UniJIS-UCS2HW-H, UniJIS-UCS2-HW-V KSC-EUC-H, KSC-EUC-V, KSCms-UHC-H, KSCmsUHC-V, KSCms-UHC-HW-H, KSCms-UHC-HW-V, KSCpc-EUC-H, UniKS-UCS2-H, UniKS-UCS2-V HYSMyeongJoStd-MediumAcro2 1. In Acrobat 4 verfügbar; in Acrobat 5 werden sie durch andere Schriften ersetzt. 2. Nur in Acrobat 5 verfügbar. CJK-Schriftunterstützung in PDFlib. Wenn man sich die Gemeinsamkeiten zwischen Standardschriften und Zeichensätzen einerseits sowie CJK-Standardschriften und CMaps andererseits vor Augen führt, ist es nicht weiter verwunderlich, dass sowohl lateinische als auch CJK-Schriften mit der selben PDFlib-Schnittstelle ausgewählt werden können. Der CMap-Name wird anstelle des Encodings übergeben. Außerdem ist zu berücksichtigen, dass eine CJK-Schrift nur eine bestimmte Menge von CMaps unterstützt (siehe Tabelle 3.7). Damit in der PDFlib-ActiveX-Edition breite Zeichen verwendet werden können, muss der Parameter nativeunicode auf true gesetzt werden. Das Beispiel für KozMinPro-Regular-Acro in Tabelle 3.7 wurde mit folgendem Code erzeugt: oPDF.set_parameter "nativeunicode", "true" font = oPDF.findfont("KozMinPro-Regular-Acro", "Ext-RKSJ-H", 0) oPDF.setfont font, 24 oPDF.set_text_pos x, y oPDF.show ChrW(&H93FA) & ChrW(&H967B) & ChrW(&H8CEA) In obigem Codefragment wird eine der japanischen Standardschriften gewählt, mit einer zu Shift-JIS kompatiblen CMap (Ext-RKSJ) und horizontaler Schreibrichtung (H). Der 1. Unter http://partners.adobe.com/asn/developer/typeforum/cidfonts.html finden Sie eine Fülle von Informationen zu CID-Schriften inklusive Tabellen mit allen unterstützten Glyphen (suchen Sie nach »character collection«). 3.3 Textbehandlung 61 Tabelle 3.8 Vordefinierte CMaps für Japanisch/Chinesisch/Koreanisch (aus der »PDF Reference«) Sprache Unterstützte CMaps Vereinfachtes GB-EUC-H Chinesisch GB-EUC-V Traditionelles Chinesisch Japanisch Koreanisch 62 Beschreibung Microsoft Codepage 936 (lfCharSet 0x86), GB 2312-80-Zeichensatz, EUCCN-Encoding GBpc-EUC-H GBpc-EUC-V1 Macintosh, GB-312-80-Zeichensatz, EUC-CN-Encoding, Script Manager Code 2 GBK-EUC-H1 GBK-EUC-V1 Microsoft Codepage 936 (lfCharSet 0x86), GBK-Zeichensatz, GBK-Encoding GBKp-EUC-H2 GBKp-EUC-V2 Wie GBK.EUC-H, ersetzt aber lateinische Zeichen halber Breite durch proportionale Zeichen und ordnet dem Zeichencode 0x24 das Dollarzeichen ($) statt des Yuan-Symbols (¥) zu. GBK2K-H2 GBK2K-V2 GB-18030-2000-Zeichensatz, gemischtes 1-, 2- und 4-Byte-Encoding UniGB-UCS2-H1 UniGB-UCS2-V1 Unicode-Encoding (UCS-2) für die Character-Collection Adobe GB1 B5pc-H B5pc-V Macintosh, Big-Five-Zeichensatz, Big-Five-Encoding, Script Manager Code 2 HKscs-B5-H2 HKscs-B5-V2 Hong Kong SCS (Supplementary Character Set), eine Erweiterung von BigFive-Zeichensatz und -Encoding ETen-B5-H ETen-B5-V Microsoft Codepage 950 (lfCharSet 0x88), Big-Five-Zeichensatz mit ETenErweiterungen ETenms-B5-H1 ETenms-B5-V1 Wie ETen-B5-H, ersetzt aber lateinische Zeichen halber Breite durch proportionale Zeichen CNS-EUC-H CNS-EUC-V CNS-11643-1992-Zeichensatz, EUC-TW-Encoding UniCNS-UCS2-H1 UniCNS-UCS2-V1 Unicode-Encoding (UCS-2) für die Character-Collection Adobe-CNS1 83pv-RKSJ-H Macintosh, JIS-X-0208-Zeichensatz mit KanjiTalk6-Erweiterungen, ShiftJIS-Encoding, Script Manager Code 1 90ms-RKSJ-H 90ms-RKSJ-V Microsoft Codepage 932 (lfCharSet 0x80), JIS-X-0208-Zeichensatz mit NEC- und IBM-Erweiterungen 90msp-RKSJ-H1 90msp-RKSJ-V1 Wie 90ms-RKSJ-H, ersetzt aber lateinische Zeichen halber Breite durch proportionale Zeichen 90pv-RKSJ-H Macintosh, JIS-X-0208-Zeichensatz mit KanjiTalk7-Erweiterungen, ShiftJIS-Encoding, Script Manager Code 1 Add-RKSJ-H Add-RKSJ-V JIS-X-0208-Zeichensatz mit Fujitsu FMR-Erweiterungen, Shift-JIS-Encoding EUC-H1 EUC-V1 JIS-X-0208-Zeichensatz, EUC-JP-Encoding Ext-RKSJ-H Ext-RKSJ-V JIS-C-6226-Zeichensatz (JIS78) mit NEC-Erweiterungen, Shift-JIS-Encoding H V JIS-X-0208-Zeichensatz, ISO-2022-JP-Encoding UniJIS-UCS2-H1 UniJIS-UCS2-V1 Unicode-Encoding (UCS-2) für die Character-Collection Adobe Japan1 UniJIS-UCS2-HW-H1 UniJIS-UCS2-HW-V1 Wie UniJIS-UCS2-H, ersetzt aber proportionale lateinische Zeichen durch Zeichen halber Breite KSC-EUC-H KSC-EUC-V KS-X-1001:1992-Zeichensatz, EUC-KR-Encoding KSCms-UHC-H KSCms-UHC-V Microsoft Codepage 949 (lfCharSet 0x81), KS-X-1001:1992-Zeichensatz plus 8822 zusätzliche Hangul-Zeichen, Unified-Hangul-Code-Encoding (UHC) Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Tabelle 3.8 Vordefinierte CMaps für Japanisch/Chinesisch/Koreanisch (aus der »PDF Reference«) Sprache Unterstützte CMaps Beschreibung KSCms-UHC-HW-H1 KSCms-UHC-HW-V1 Wie KSCms-UHC-H, ersetzt aber proportionale lateinische Zeichen durch Zeichen halber Breite KSCpc-EUC-H Macintosh, KS-X-1001:1992-Zeichensatz mit Mac-OS-KH-Erweiterungen, Script Manager Code 3 UniKS-UCS2-H1 UniKS-UCS2-V1 Unicode-Encoding (UCS-2) für die Character-Collection Adobe-Korea1 1. Erst ab PDF 1.3 / Acrobat 4 verfügbar. 2. Erst ab PDF 1.4 / Acrobat 5 verfügbar. Parameter fontname muss den genauen Schriftnamen enthalten (genauer gesagt, den Wert des Eintrags /CIDFontName in der zugehörenden CID-PostScript-Zeichenbeschreibungsdatei), wobei kein Suffix für den Zeichensatz oder die Schreibrichtung enthalten sein darf. Der Parameter encoding enthält den Namen einer der unterstützten CMaps (die Auswahl ist abhängig von der jeweiligen Schrift) und zeigt außerdem die Schreibrichtung an (siehe unten). PDFlib unterstützt alle standardmäßig in Acrobat enthaltenen CMaps und beschwert sich, wenn Schrift und CMap nicht zusammenpassen. Wenn Sie PDFlib zum Beispiel anweisen, eine koreanische Schrift mit einem japanischen Zeichensatz zu verwenden, wird eine Exception vom Typ ValueError ausgelöst. Technisch gesehen ist die Einbettung von CID-Schriften in PDF 1.3 zwar möglich, aber kaum praktikabel wegen der Größe einer CID-Schrift und der Tatsache, dass die meisten CJK-Schriftlizenzen eine Einbettung untersagen. Aus diesem Grund wird der Parameter embed bei CID-Schriften nicht verwendet und muss den Wert 0 haben. PDFlib benötigt für CID-Schriften keine schriftspezifischen Metrikdaten und unternimmt auch keinerlei Versuche, die vom Client übergebenen Textstrings zu dekodieren oder zu überprüfen, ob sie hinsichtlich der zugrunde liegenden CMap korrekt kodiert sind. Aus diesem Grund werden die folgenden Funktionen für CID-Schriften derzeit nicht unterstützt: > Berechnen der Textbreite mit stringwidth( ) > Formatierung von Text in ein Rechteck mit show_boxed( ) > Aktivierung der Modi für Unterstreichen, Überstreichen und Durchstreichen > Ermittlung der textx/texty-Position Hinweis PDFlib unterstützt gegenwärtig nur die CID-Standardschriften, die mit Acrobat mitgeliefert werden (siehe Tabelle 3.7). Es können keine benutzerdefinierten CID-Schriften und auch keine japanischen, chinesischen oder koreanischen TrueType-Schriften verwendet werden. Fette Schriftschnitte lassen sich aber über den Rendering-Modus 2 simulieren (siehe Parameter textrendering). CJK-Zeichenbreiten. PDFlib geht davon aus, dass alle einschließlich der lateinischen Zeichen in CJK-Schriften die gleiche Breite besitzen. Die Zeichenbreite entspricht der Schriftgröße. PDFlib unterstützt für CJK-Schriften bislang kein Konzept der halben und vollen Zeichenbreite. Sollen Ihre lateinischen Zeichen schmaler sein als die CJK-Zeichen, müssen Sie zu einer lateinischen 8-Bit-Schrift wie zum Beispiel Courier oder Helvetica wechseln. Horizontale und vertikale Schreibrichtung. PDFlib unterstützt sowohl horizontale als auch vertikale Schreibrichtung. Der entsprechende Modus wird über einen geeigneten 3.3 Textbehandlung 63 CMap-Namen ausgewählt. Diese zeigen durch die Endung -H bzw. -V an, dass sie eine horizontale bzw. vertikale Schreibrichtung vorgeben. Hinweis Bei manchen PDFlib-Funktionen muss die Semantik an die jeweilige Schreibrichtung angepasst werden. Beispielsweise sollte 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 Funktionsbeschreibungen. Zeichencodes für CJK-Text in PDFlib. Text muss vom Client so übergeben werden, dass die Zeichencodes dem Zeichensatz für die CID-Schrift entsprechen. PDFlib überprüft nicht, ob der übergebene Text dem geforderten Zeichensatz entspricht. Bei MultibyteZeichensätzen muss das höchstwertige Byte vorne stehen. Die PDFlib-Sprachbindungen, die native Unicode-Unterstützung bieten(inklusive ActiveX/COM), konvertieren an die Bibliothek übergebene Unicode-Strings automatisch. Aus diesem Grund sollten Unicode-kompatible CMaps nur mit diesen Sprachbindungen verwendet werden, wenn der Parameter nativeunicode auf true gesetzt ist (siehe auch Abschnitt 3.3.9, »Unicode-Unterstützung«, Seite 65). 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 hinaus ginge. Wir möchten jedoch einige Hinweise geben, die dem PDFlib-Benutzer nützlich sein können. Wenn Sie beim Drucken von CJK-Dokumenten mit Acrobat Probleme haben, sollten Sie folgende Ursachen in Betracht ziehen: > CID-Schriften können nicht auf allen PostScript-Druckern ausgegeben werden. Native Unterstützung für CID-Schriften 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 (sofern sie nicht mit den Type-0-Schrifterweiterungen ausgestattet sind). Bei frühen Level-2-Geräten kann man aber davon ausgehen, dass der Druckertreiber passende Kompatibilitätsroutinen an Level-2-Drucker vor Version 2015 lädt. > Aufgrund der immensen Anzahl von Zeichen benötigen CID-Schriften enormen Druckerspeicher (CID-Fontdateien beanspruchen in der Regel 5 bis 10 MB auf der Festplatte). Nicht alle Drucker verfü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 aufrüsten, um PDF-Dokumente mit CID-Schriften 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, aktivieren Sie die Option Als Bild drucken. Acrobat sendet dann eine Rasterbildversion der Seite an den Drucker (allerdings mit 300 dpi). 64 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) 3.3.9 Unicode-Unterstützung Seit Version 4 unterstützt Acrobat den Unicode-Standard, der im wesentlichen ISO 106461 entspricht. Unicode ist ein riesiger Zeichensatz, der alle weltweit gegenwärtig verwendeten und viele alte Sprachen und Schriften umfasst und in vielen Anwendungen und Betriebssystemen unterstützt wird. PDFlib bietet Unicode-Unterstützung bei folgenden Funktionen: > Lesezeichen (siehe Abbildung 3.2) > Inhalt und Titel von Notizen (siehe Abbildung 3.2) > Inhalt von vor- und benutzerdefinierten Dokumentinfofeldern (nicht jedoch die Namen von benutzerdefinierten Feldern – das wird durch die PDF-Spezifikation unterbunden) > Beschreibung und Verfasser von Dateianlagen > CJK-Text auf Seitenbeschreibungen, falls ein Unicode-kompatibler Zeichensatz verwendet wird (siehe Abschnitt 3.3.8, »Japanischer, chinesischer und koreanischer Text«, Seite 60) > 8-Bit-Codepages für TrueType-, PostScript- und OpenType-Schriften Bevor wir näher auf die Unicode-Implementierung eingehen, sollten Sie sich folgende Einschränkungen der Unicode-Unterstützung in Acrobat klar machen: > Acrobat 4 zeigt nicht alle Zeichen der Adobe Glyph List korrekt an (dieser Fehler ist in Acrobat 5 behoben). Das Problem zeigt sich zum Beispiel bei kyrillischen Zeichen. > Der Einsatz von PDF-Dokumenten mit Unicode hängt maßgeblich von der UnicodeUnterstützung des Zielsystems ab. Leider bieten die wenigsten derzeit verfügbaren Systeme in der Standardkonfiguration volle Unicode-Unterstützung. Windows NT/ 2000/XP und Mac OS unterstützen Unicode zwar intern, ein Problem bleibt jedoch die mangelhafte Verfügbarkeit geeigneter Unicode-Schriften. > Unter Windows kann Acrobat in einer Anmerkung nur eine einzige Unicode-Schrift verwenden. Dies scheint mit einem betriebssystemspezifischen Problem zu tun zu haben (nämlich mit Einschränkungen des in der Acrobat-Implementierung verwendeten Texteingabefelds der Anmerkungsfunktion). Unicode-Codepages für PostScript- und TrueType-Schriften. PDFlib unterstützt Unicode in Seitenbeschreibungen für alle Zeichen, die in der Adobe Glyph List (AGL) verzeichnet sind. Während Textstrings noch 8-Bit-Zeichen enthalten müssen, kann eine beliebige Anzahl von bis zu maximal 256 Zeichen mittels einer auf Unicode basierenden Codepagedefinitionsdatei ausgewählt werden. Diese Art der Unicode-Unterstützung ist für TrueType-Schriften verfügbar, die auf Unicode basieren, sowie für PostScript-Schriften mit Glyphennamen in der AGL. Weitere Informationen über Codepages und die AGL finden Sie in Abschnitt 3.3.3, »Benutzerdefinierte 8-Bit-Zeichensätze und Codepages«, Seite 48. Unicode-Zeichensätze für CID-Schriften. PDF erlaubt Unicode-kodierten Text auf Dokumentseiten (im Gegensatz zum oben erwähnten Hypertext). Leider gilt dies nur für CID-Schriften, nicht aber für normale PostScript-Type-1-Schriften. Um Unicode-konformen chinesischen, japanischen oder koreanischen Text auf einer Seite zu platzieren, 1. Siehe http://www.unicode.org 3.3 Textbehandlung 65 Abb. 3.2 Unicode-Lesezeichen (links) und Unicode-Notizen (rechts) muss eine Unicode-kompatible CMap verwendet werden. Solche CMaps sind einfach am Präfix Uni im Namen zu erkennen (siehe Tabelle 3.8). Sie unterstützen aber nur diejenigen Zeichen, die für die jeweilige Sprache erforderlich sind, und keine anderen UnicodeZeichen. PDF_PDF_Unicode-Zeichensatz für Hypertextelemente. Benutzer der PDFlib-ActiveXEdition können an die Unicode-fähigen Hypertextfunktionen (Lesezeichen, Anmerkungen etc.) direkt UCS-2-kodierten Unicode-Text übergeben, sofern der Parameter nativeunicode auf true gesetzt ist. Das folgende Codefragment (in hexadezimaler Schreibweise) erstellt zum Beispiel ein Lesezeichen mit dem griechischen String Λ ΟΓ ΟΣ (siehe Abbildung 3.2): oPDF.set_parameter "nativeunicode", "true" bookmark = oPDF.add_bookmark(ChrW(&H39B) & ChrW(&H39F) & ChrW(&H393) & ChrW(&H39F) &_ ChrW(&H3A3), 0, 0) Falsche Unicode-Zeichenzuordnungen unter Windows. Folgende PDFlib-Sprachbindungen sind Unicode-fähig und können Unicode-Strings automatisch in das von PDFlib erwartete Format konvertieren: > ActiveX/COM > Java (abhängig von den Spracheinstellungen) > .NET > Tcl (erfordert Tcl ab 8.2) Um das unten beschriebene Problem bei der Zeichenkonvertierung zu vermeiden, ist die Unicode-Unterstützung bei diesen Sprachbindungen standardmäßig deaktiviert. Zur Aktivierung setzen Sie den PDFlib-Parameter nativeunicode auf true (siehe auch Abschnitt 4.3.2, »Textausgabe«, Seite 92): oPDF.set_parameter "nativeunicode", "true" 66 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Der Parameter nativeunicode bedeutet, dass der Wrapper-Code intern folgende Fälle unterscheidet und die jeweils passende Konvertierung anwendet: > 8-Bit-Strings, also Strings, die nur Zeichen zwischen U+0000 to U+00FF enthalten, werden (für Hypertext) als PDFDocEncoding interpretiert oder als 8-Bit-Zeichen gemäß des aktuellen Zeichensatzes (für Seitenbeschreibungen). > Unicode-Strings für Hypertextfunktionen werden gemäß der PDF-Referenz kodiert . Unicode-Strings müssen gemäß UCS-2 kodiert sein. UTF-8-Kodierung wird gegenwärtig nicht unterstützt. > Unicode-Strings für Seitenbeschreibungen werden ohne jede Konvertierung übergeben. Dazu muss eine Unicode-kompatible CMap selektiert sein (siehe Tabelle 3.7). Entwickler brauchen sich generell nicht um die oben ausgeführten Zeichensatzdetails zu kümmern, sondern können einfach mit dem von der jeweiligen Umgebung unterstützten Unicode-Text arbeiten. (Weitere Informationen über die Verwendung von Unicode innerhalb der verwendeten Sprachen finden Sie in Kapitel 2 bei der Beschreibung der jeweiligen Sprachbindungen). Es gibt jedoch ein subtiles Problem in Bezug auf in ActiveX-, Java-, .NET- oder Tcl-Quellcode eingebettete literale Unicode-Zeichen, das wir an einem kleinen Beispiel erläutern möchten. Die native Unterstützung von COM oder .NET für Unicode-Strings funktioniert wunderbar bei den Hypertextelementen von PDF, kann aber bei Seitenbeschreibungen und 8-Bit-Zeichensätzen, die nicht Unicode-kompatibel sind, problematisch sein. So sind zum Beispiel die meisten, aber nicht alle Zeichen der Windows-Codepage 1252 kompatibel (genauer gesagt, ist der Bereich &H80–&H9F nicht kompatibel). Betrachten Sie folgenden Versuch, den Gedankenstrich mit PDFlib anzuzeigen: ' Literales Zeichen &H96 = Alt-150 im Code. Funktioniert nur bei nativeunicode = false oPDF.show("–"); Wird diese Zeile unter Windows mit Codepage 1252 und nativeunicode == true verwendet, wird das literale Zeichen für den Gedankenstrich (&H96 in der Codepage 1252) in das entsprechende Unicode-Zeichen konvertiert (&H2013 in diesem Beispiel), was für einen 8-Bit-PDF-Zeichensatz wie winansi völlig ungeeignet ist. Um diesem Problem bei aktiviertem »nativem Unicode« vorzubeugen, ist die obige Zeile wie folgt umzuformulieren: ' Problemlose Zeichenauswahl außerhalb Latin-1 bei nativeunicode = true oPDF.show ChrW(&H96) Damit wird der Code &H96 für das gewünschte Zeichen an PDFlib übergeben und dort korrekt gemäß des gewählten Zeichensatzes interpretiert. 3.3.10 Textmetrik, Textvarianten und Formatierung in ein Rechteck Textposition. PDFlib verwaltet eine aktuelle Textposition, die unabhängig von dem aktuellen Punkt ist, der beim Zeichnen von Grafik verwendet wird. Die aktuelle Textposition kann über die Parameter textx/texty und der aktuelle Punkt über currentx/currenty abgefragt werden. Schrift- und Zeichenmetrik. PDFlib verwendet dasselbe System für Zeichen- und Fontmetriken wie PostScript und PDF. Es soll hier kurz beschrieben werden. 3.3 Textbehandlung 67 Die Schriftgröße, die von PDFlib-Anwendern festgelegt werden muss, ist der Abstand zwischen zwei aufeinanderfolgenden Textzeilen, der minimal erforderlich ist, damit keine Zeichen teilweise ü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 Zwischenraum zwischen den Zeilen umfasst. Der Zeilenabstand (leading, line spacing) bezeichnet den vertikalen Abstand zwischen den Grundlinien 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 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 gemessen und müssen deshalb vor der Verwendung mit der nötigen Schriftgröße multipliziert werden. Die Werte für Versalhöhe, Oberlänge und Unterlänge für eine bestimmte Schrift sind in der Fontmetrikdatei enthalten und können wie folgt von PDFlib abgefragt werden: font = oPDF.findfont("Times-Roman", "winansi", 0) oPDF.setfont font, fontsize capheight = oPDF.get_value("capheight", font) * fontsize ascender = oPDF.get_value("ascender", font) * fontsize descender = oPDF.get_value("descender", font) * fontsize Hinweis Position und Größe von hochgestellten und tiefgestellten Zeichen kann von PDFlib nicht abgefragt werden, da diese Informationen in AFM-Metrikdateien nicht verfügbar sind. CPI-Berechnungen. Die meisten Schriften besitzen variable Zeichenbreiten, nur bei den so genannten äquidistanten Schriften ist die Laufweite aller Zeichen gleich. Um die PDF-Fontmetrik auf die Bemaßung Zeichen pro Zoll (characters per inch, CPI) abzubilden, die häufig beim Hochleistungsdruck verwendet wird, mögen einige Rechenbeispiele für die äquidistante Schrift Courier hilfreich sein. In Courier haben alle Zeichen eine Breite von 600 Einheiten, wobei der volle Zeichenbereich auf 1000 Einheiten pro Punkt festgelegt ist (dieser Wert lässt sich aus der entsprechenden AFM-Metrikdatei ermitteln). Bei Text der Größe 12 Punkt haben zum Beispiel alle Zeichen eine absolute Breite von 12 Punkt * 600/1000 = 7,2 Punkt Abb. 3.3 Font- und Zeichenmetrik Fontgröße (font size) Grundlinie (baseline) 68 Versalhöhe (capheight) Oberlänge (ascender) Unterlänge (descender) Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) bei einem optimalen Zeilenabstand von 12 Punkt. Da ein Zoll (inch) aus 72 Punkt besteht, 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 Zeichenbreite 6 Punkt, was eine 72/6 = 12 cpi Schrift ergibt; 8 Punkt Courier ergibt 15 cpi. oPDF.set_parameter "kerning", "false" ' Kerning deaktivieren Unterstreichen, Überstreichen und Durchstreichen von Text. PDFlib kann angewiesen werden, Linien unter, über oder auf Text zu 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 set_parameter( ) lässt sich das Unter-, Über- oder Durchstreichen wie folgt ein- und ausschalten: oPDF.set_parameter "underline", "true" ' Unterstreichen aktivieren Die Striche erhalten die aktuelle Zeichenfarbe, die aktuellen Parameter für Linienenden und Strichmuster werden dagegen ignoriert. Warnung für Ästhethen: 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 CID-Schriften nicht unterstützt. Modi der Textdarstellung. PDFlib unterstützt mehrere Darstellungsmodi, die das Erscheinungsbild von Text beeinflussen. Dazu gehört Text, der durch Umrisslinien dargestellt wird, sowie die Möglichkeit, Text als Clipping-Pfad zu verwenden. Text lässt sich auch unsichtbar darstellen. Dies mag zum Beispiel sinnvoll sein, um Text auf eingescannten Bildern zu platzieren, so dass er zwar indiziert und durchsucht werden kann, aber nicht direkt sichtbar ist. Tabelle 3.9 zeigt die Darstellungsmodi, die mit set_value( ) gesetzt werden können. Tabelle 3.9 Werte für den Textdarstellungsmodus Wert Erklärung Wert Erklärung 0 Umrisslinien füllen (normaler Text) 4 Umrisslinien füllen und zum Clipping-Pfad hinzufügen 1 Umrisslinien zeichnen 5 Umrisslinien zeichnen und zum Clipping-Pfad hinzufügen 2 Umrisslinien sowohl zeichnen als auch füllen 6 Umrisslinien sowohl zeichnen als auch füllen und zum Clipping-Pfad hinzufügen 3 unsichtbarer Text 7 Umrisslinien zum Clipping-Pfad hinzufügen oPDF.set_value "textrendering", 1 ' Umrisslinien zeichnen Textfarbe. Text wird gewöhnlich mit der aktuellen Füllfarbe dargestellt, die mit setcolor( ) gesetzt werden kann. Bei einem von 0 verschiedenen Darstellungsmodus werden je nach Modus die Linien- und die Füllfarbe verwendet. Formatierung von Text in ein Rechteck. PDFlib bietet zwar die Funktion stringwidth( ) zur Berechnung der Textbreite, viele Clients benötigen aber eine einfache Möglichkeit zur Textboxformatierung, um zum Beispiel einen Text in eine vorgegebene Spalte ein- 3.3 Textbehandlung 69 In an attempt to reproduce sounds more accurately, pinyin spellings often differ markedly from the older ones, and personal names are usually spelled without apostrophes or hyphens; an apostrophe is sometimes used, however, to avoid ambiguity when syllables are run together (as in Chang´an to distinguish it from Chan´gan). Abb. 3.4 Formatierung von Text in ein Rechteck: Die untere Kante dient als letzte Grundlinie, nicht als Clipping-Grenze. zupassen. PDFlib bietet zwar entsprechende Funktionen, man darf sich die Bibliothek aber nicht als vollständiges Layoutprogramm vorstellen. Die Funktion show_boxed( ) bietet eine bequeme Methode zur Formatierung von Text in ein Rechteck einschließlich einer Reihe von Formatierungsoptionen. Der Text kann in einer rechteckigen Box linksbündig, rechtsbündig, zentriert oder im Blocksatz ausgerichtet werden. Die erste Textzeile beginnt an einer Grundlinie, deren vertikale Position der Oberkante der übergebenen Box minus dem Zeilenabstand entspricht. Die Unterkante der Box dient als letzte Grundlinie. Aus diesem Grund können sich Unterlängen der letzten Textzeile außerhalb der Box befinden (siehe Abbildung 3.4). Die Ausrichtung erfolgt durch Anpassung des Wortabstandes (die letzte Zeile bleibt dabei linksbündig ausgerichtet). Dazu muss der Text natürlich Leerzeichen enthalten (sind keine Leerzeichen vorhanden, fügt PDFlib auch keine ein). Komplexe Textverarbeitungsfunktionen wie Silbentrennung sind nicht verfügbar – PDFlib bricht den Text einfach an den vorhandenen Leerzeichen um. Der Text wird an den Rändern des Rechtecks keinesfalls beschnitten. Wenn Sie im Parameter feature den Wert blind übergeben, können Sie feststellen, ob ein String in eine bestimmte Box passt, ohne dass eine Ausgabe erzeugt wird. ASCII-Zeichen für Newline (ox0A, in VBScript: vbCrLf) werden im übergebenen Text erkannt und bewirken einen neuen Absatz. CR/NL-Kombinationen werden wie ein einzelnes Newline-Zeichen behandelt. Andere Formatierungszeichen (insbesondere Tabulatoren) werden nicht unterstützt. Es folgt ein kleines Beispiel zum Einsatz der Funktion show_boxed( ). Es zeichnent mit rect( ) einen zusätzlichen Rahmen um die Box, der bei der Fehlersuche hilfreich sein kann: Text = "In an attempt to reproduce sounds more accurately, pinyin spellings often ... " fontsize = 13 font = oPDF.findfont("Helvetica", "host", 0) oPDF.setfont font, fontsize x y w h = = = = 50 650 357 6 * fontsize c = oPDF.show_boxed(Text, x, y, w, h, "justify", "") If (c > 0) Then ' Nicht alle Zeichen konnten im Rechteck platziert werden; darauf reagieren ... End If 70 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) oPDF.rect x, y, w, h oPDF.stroke Folgende Voraussetzungen und Einschränkungen der Funktion show_boxed( ) sind zu erwähnen: > Der Text sollte keine aufeinander folgenden Leerzeichen enthalten. > Wegen diverser Einschränkungen in der Unterstützung des Wortabstandes bei PDF muss sich das Leerzeichen im Zeichensaztz an Position &H20 befinden. Dies ist zwar bei den meisten gängigen Zeichensätzen der Fall, die Ausrichtung funktioniert damit aber beim EBCDIC-Zeichensatz nicht. > Der einfache Formatierungsalgorithmus kann bei unpassenden Kombinationen aus langen Wörtern und engen Spalten scheitern, da es keinen Algorithmus zur Silbentrennung gibt. > Da der untere Teil des Rechtecks als Grundlinie verwendet wird, können Unterlängen in der letzten Zeile aus dem Rechteck hinausreichen. > Es ist nicht sehr intuitiv, PDF_show_boxed( ) mit in der linken oberen Ecke ausgehenden Koordinaten zu verwenden. Beachten Sie hierzu Abschnitt 3.2.1, »Koordinatensysteme«, Seite 40. > Es ist gegenwärtig nicht möglich, Text in mehreren Portionen an die Routine zur Formatierung in ein Rechteck zu übergeben. Sie können die nach dem Aufruf von PDF_ show_boxed( ) aktuelle Textposition aber mit den Parametern textx und texty ermitteln. > Die Schrift kann innerhalb des Rechtecks nicht geändert werden. > Die Formatierung von Text in ein Rechteck wird für CID-Schriften/CJK-Zeichensätze nicht unterstützt. 3.4 Verwendung von Rasterbildern 3.4.1 Unterstützte Rasterbildformate Die Einbettung von Rasterbildern in das generierte PDF-Dokument stellt eine wesentliche Funktion von PDFlib dar. PDFlib verarbeitet gegenwärtig alle Rasterbildformate, die unten beschrieben werden. Bei den meisten Formaten reicht PDFlib die komprimierten Bilddaten unverändert an die PDF-Ausgabe weiter, da PDF intern die meisten in Rasterbildformaten verwendeten Kompressionsverfahren unterstützt. Diese Technik (in den folgenden Beschreibungen Pass-Through-Modus genannt) bewirkt einen äußerst schnellen Bildimport, da die Dekompression und die darauf folgende erneute Kompression der Bilddaten entfallen. In diesem Modus kann PDFlib die Integrität der komprimierten Bilddaten nicht überprüfen. Unvollständige oder beschädigte Daten bewirken Fehleroder Warnmeldungen, wenn das PDF-Dokument in Acrobat angezeigt wird (zum Beispiel »Nicht genügend Daten für ein Bild«). Wenn eine Rasterbilddatei nicht erfolgreich importiert werden konnte und Sie Einzelheiten über die Ursachen wissen möchten, dann setzen Sie den Parameter imagewarning auf true (siehe Abschnitt 4.6, »Rasterbildfunktionen«, Seite 109): oPDF.set_parameter "imagewarning", "true" ' Warnungen aktivieren PNG-Bilder. PDFlib unterstützt alle Varianten von PNG-Bildern (Portable Network Graphics).1 PNG-Bilder werden meistens im Pass-Through-Modus verarbeitet. PNG-Bilder, 3.4 Verwendung von Rasterbildern 71 die das Zeilensprungverfahren (Interlacing) nutzen, einen Alphakanal enthalten (der in jedem Fall verlorengeht, siehe unten) oder eine Farbtiefe von 16 Bit besitzen, müssen dekomprimiert werden, was bedeutend länger dauert als der Pass-Through-Modus. Enthält ein PNG-Bild Transparenzinformationen, so bleibt diese im generierten PDF erhalten (siehe Abschnitt 3.4.5, »Bildmasken und Transparenz«, Seite 76). Alphakanäle werden von PDFlib nicht unterstützt. JPEG-Bilder. JPEG-Bilder werden immer im Pass-Through-Modus verarbeitet. PDFlib unterstützt folgende Kompressionsmodi von JPEG: > Baseline-Kompressionsmodus von JPEG, der von der überwiegenden Mehrheit der JPEG-Bilder verwendet wird. > Progressive-Kompressionsmodus von JPEG, der seit Acrobat 4/PDF 1.3. unterstützt wird. Im Kompatibilitätsmodus für Acrobat 3 lehnt PDFlib den Import von JPEG-Bildern mit »Progressive«-Kompression ab. JPEG-Bilder können in unterschiedlichen Dateiformaten verpackt sein. PDFlib unterstützt alle gängigen JPEG-Dateiformate und ermittelt Auflösungswerte aus den folgenden Varianten: > JFIF, das von einer Vielzahl von Anwendungen unterstützt wird. > JPEG-Dateien, die von Adobe Photoshop und anderen Adobe-Anwendungen erzeugt werden. PDFlib wendet ein besonderes Verfahren an, um aus Photoshop generierte JPEG-Dateien mit CMYK-Farben korrekt zu verarbeiten. PDFlib interpretiert die Auflösungsinformationen von JPEG-Bildern im Dateiformat SPIFF nicht. GIF-Bilder. GIF-Bilder werden immer im Pass-Through-Modus verarbeitet (PDFlib benutzt keine LZW-Dekompression). PDFlib unterstützt folgende Arten von GIF-Bildern: > Wegen der Einschränkungen in den vom PDF-Dateiformat unterstützten Kompressionsverfahren muss der Eintrag LZW minimum code size in der GIF-Datei den Wert 8 Bit haben. Leider gibt es keine einfache Möglichkeit, diesen Wert für eine vorliegende Datei zu ermitteln. Ein Bild, das mehr als 128 unterschiedliche Farbwerte enthält, ist immer geeignet (zum Beispiel eine vollständige 8-Bit-Farbpalette mit 256 Einträgen). Bilder mit einer geringeren Anzahl verschiedener Farben können auch geeignet sein, aber dies lässt sich nur schwer im vorhinein entscheiden, da Grafikprogramme in diesem Fall 8 Bit oder weniger als minimale LZW-Codelänge verwenden können, und PDFlib das Bild nur bei weniger ablehnt. Mit dem folgenden Trick, der in Adobe Photoshop und ähnlichen Bildbearbeitungsprogrammen funktioniert, lassen sich GIFBilder erstellen, die von PDFlib akzeptiert werden: Laden Sie das GIF-Bild und ändern Sie den Farbmodus von indiziertes Bild auf RGB. Nun ändern Sie den Farbmodus wieder zu »indiziertes Bild«, wobei Sie eine Farbpalette mit mehr als 128 Einträgen wählen, zum Beispiel die Mac- oder Windows-Systempalette oder die Web-Palette. > Es muss ein non-interlaced GIF sein. > Bei einem animierten GIF wird nur das erste Bild importiert. Bei anderen GIF-Varianten ist eine Konvertierung in das PNG-Format empfehlenswert. 1. Siehe http://www.w3.org/Graphics/PNG und http://www.libpng.org/pub/png 72 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Hinweis In einem unserer Tests wurde ein GIF-Bild von PDFlib in eine PDF-Datei konvertiert, die zwar korrekt angezeigt wurde, aber bei der Ausgabe auf einem PostScript-Level-2- oder Level-3-Drucker zu einem PostScript-Fehler führte. Da das Problem bei Ghostscript nicht auftritt, gehen wir von einem Fehler im PostScript-Interpreter aus. Das Problem lässt sich umgehen, indem im Druckdialog von Acrobat bei den PostScript-Einstellungen als Druckmethode Level 1 ausgewählt wird. TIFF-Bilder. PDFlib verarbeitet die meisten TIFF-Bilder im Pass-Through-Modus. PDFlib unterstützt TIFF-Bilder folgender Varianten: > Kompressionsverfahren: nicht komprimiert, CCITT (Gruppe 3, Gruppe 4 und RLE), ZIP (=Flate), LZW und PackBits (=RunLength). Diese Varianten werden im Pass-Through-Modus verarbeitet; andere Varianten werden dekomprimiert. > Farbtiefe: schwarzweiß, Graustufen, RGB und CMYK; ein gegebenenfalls vorhandener Alphakanal wird ignoriert. > TIFF-Dateien, die aus mehreren Bildern bestehen (siehe Abschnitt 3.4.7, »Mehrseitige Bilddateien«, Seite 80) > Die Farbtiefe muss bei 1, 2, 4 oder 8 Bit pro Farbwert liegen (dies ist eine Anforderung von PDF). TIFF-Bilder mit mehreren Streifen (multi-strip) werden zu mehreren Bildern in der PDFDatei konvertiert, die genau wie das Original aussehen, aber mit dem TouchUpObjektwerkzeug getrennt selektiert werden können. Diese Art von TIFF-Bildern lässt sich mit dem Befehlszeilenprogramm tiffcp aus dem TIFFlib-Paket1 in Bilder mit einem Streifen (»single-strip«) umwandeln. Das Tool ImageMagick2 erzeugt prinzipiell singlestrip TIFF-Bilder. Manche TIFF-Eigenschaften (zum Beispiel CIE-Farbraum oder JPEG-Kompression) und bestimmte Merkmalskombinationen (zum Beispiel LZW-Kompression und Alphakanal, LZW-Kompression und Kachelung) werden nicht unterstützt. Hinweis Bestimmte Varianten von TIFF-Bildern, die mit CCITT Gruppe 3 komprimiert sind und mit PDFlib konvertiert werden, bewirken in Acrobat 4 unter Umständen die Meldung »Nicht genügend Daten für ein Bild«. Da das Problem weder in Ghostscript noch in Acrobat 5 auftritt und das Bild trotz der Fehlermeldung korrekt angezeigt wird, gehen wir hier von einem Fehler in Acrobat 4 aus. Sie können das Problem umgehen, indem Sie ein anderes Kompressionsverfahren für das TIFF-Bild verwenden. CCITT-Bilder. Mit Gruppe 3 oder Gruppe 4 komprimierte Faxdaten werden prinzipiell im Pass-Through-Modus verarbeitet. Beachten Sie dabei, dass sich die Bezeichnung CCITT-Bilder auf mit CCITT komprimierte Rohbilddaten bezieht und nicht auf TIFF-Dateien mit CCITT-Kompression. Mit CCITT komprimierte Rohbilddaten werden in Anwendungen für Endbenutzer normalerweise nicht unterstützt und können nur mit Faxsoftware generiert werden. Rohdaten. Nicht komprimierte Bilddaten (Rohbilddaten) mögen in speziellen Fällen sinnvoll sein, zum Beispiel beim Aufbau eines Farbverlaufs im Arbeitspeicher. Die Art des Bildes leitet sich aus der Anzahl der Farbkomponenten ab: eine Komponente impli1. Siehe http://www.libtiff.org 2. Siehe http://www.imagemagick.org 3.4 Verwendung von Rasterbildern 73 ziert ein Graustufenbild, drei Komponenten implizieren ein RGB-Bild und vier Komponenten ein CMYK-Bild. 3.4.2 Häufig benötigte Codefragmente für Rasterbilder Die Einbettung von Rasterbildern mit PDFlib ist einfach zu bewerkstelligen. Die Bilddatei muss zunächst mit einer PDFlib-Funktion geöffnet werden, die eine kurze Analyse der Bildparameter durchführt. Die Funktion PDF_open_image_file( ) gibt ein Handle zurück, das als Bilddeskriptor dient. Es kann zusammen mit Positionierungs- und Skalierungsparametern im Aufruf von PDF_place_image( ) verwendet werden: lImage = oPDF.open_image_file("jpeg", "image.jpg", "", 0) If (lImage = -1) Then MsgBox "Bilddatei konnte nicht geöffnet werden." End Else oPDF.place_image lImage, 0, 0, 1 oPDF.close_image lImage End If Der Aufruf von PDF_close_image( ) ist an dieser Stelle nur bedingt erforderlich, je nachdem, ob das Bild im Dokument ein weiteres Mal verwendet wird (siehe Abschnitt 3.4.3, »Wiederverwendung von Bilddaten«, Seite 76). Skalierung und dpi-Berechnung. PDFlib ändert die Pixelanzahl eines importierten Bildes nie. Beim Skalieren werden die Bildpunkte entweder vergrößert oder verkleinert, es findet jedoch keinerlei Downsampling statt. Der Skalierungsfaktor 1 bewirkt eine Pixelgröße von einer Einheit in benutzerspezifischen Koordinaten. Anders ausgedrückt wird das Bild mit 72 dpi importiert, wenn das benutzerspezifische Koordinatensystem nicht skaliert wurde (da ein Zoll 72 Punkt entspricht). Die dpi-Werte für die Auflösung, die in der ursprünglichen Bilddatei gegebenenfalls enthalten sind, werden von PDFlib ignoriert, können aber mit den Parametern resx und resy abgefragt werden; der Benutzer ist für eine geeignete Skalierung des Koordinatensystems verantwortlich (achten Sie auf Bilder mit nicht-quadratischen Pixeln). Der folgende Algorithmus kann verwendet werden, um ein Bild mit der Auflösung zu importieren, die in der Datei angegeben ist (oder mit 72 dpi, wenn die Datei über keinen dpiWert verfügt), und dessen Größe und Position so festlegen, dass es die ganze Seite einnimmt: ’ dpi-Werte abfragen, sofern sie in der Bilddatei vorhanden sind dpi_x = oPDF.get_value("resx", lImage) dpi_y = oPDF.get_value("resy", lImage) ' Skalierungsfaktor aus If (dpi_x > 0 And dpi_y scale_x = 72# / scale_y = 72# / Else If (dpi_x < 0 And dpi_y scale_x = 1# scale_y = dpi_y Else scale_x = 1# scale_y = 1# 74 dpi-Werten berechnen, siehe Beschreibung von resx/resy > 0) Then ' resx und resy in der Datei vorhanden dpi_x dpi_y < 0) Then ' nur Verhältnis zw. resx und resy vorhanden / dpi_x ' keine Daten über resx und resy vorhanden Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) End If End If ' Neue Seite anlegen, auf die das skalierte Bild exakt passt, und Bild platzieren oPDF.begin_page oPDF.get_value("imagewidth", lImage) * scale_x, _ oPDF.get_value("imageheight", lImage) * scale_y oPDF.[Scale] scale_x, scale_y oPDF.place_image lImage, 0#, 0#, 1# oPDF.close_image lImage oPDF.end_page Um statt des gegebenenfalls in der Bilddatei vorhandenen dpi-Werts einen festen dpiWert zu verwenden (zum Beispiel 300), ersetzen Sie die ersten beiden Zeilen des obigen Codefragments durch: dpi_x = 300 dpi_y = 300 ' oder ein anderer Wert Vorgeben der Druckgröße. Der folgende Algorithmus kann verwendet werden, um ein Bild so auf einer PDF-Seite zu platzieren, dass es eine vorgegebene Breite width und Höhe height erhält (statt wie im vorigen Algorithmus die Auflösung vorzugeben). Die linke untere Ecke soll dabei an Position (x, y) liegen (alle Koordinaten in Punkt): scale_x = lWidth / oPDF.get_value("imagewidth", lImage) scale_y = lHeight / oPDF.get_value("imageheight", lImage) oPDF.save ' Koordinatensystem skalieren, um Bildgröße an vorgegebenes Rechteck anzupassen oPDF.[Scale] scale_x, scale_y ' Position muss unter Berücksichtigung der obigen Skalierung gewählt werden oPDF.place_image lImage, x / scale_x, y / scale_y, 1 oPDF.close_image lImage oPDF.restore Nichtproportionale Bildskalierung. Da Bilder meist proportional skaliert werden (das heißt, dass für Breite und Höhe derselbe Skalierungsfaktor verwendet wird), unterstützt place_image( ) nur einen einzigen Skalierungsparameter, der auf beide Abmessungen angewandt wird. Eine nicht-proportionale Skalierung lässt sich problemlos durch Skalierung des Koordinatensystems erreichen, die mit save/restore-Operationen geklammert ist, um andere Grafikoperationen nicht zu beeinträchtigen. Das folgende Codefragment platziert ein Bild, das auf 50 Prozent horizontal und auf 75 Prozent vertikal skaliert ist: oPDF.save oPDF.[Scale] 0.5, 0.75 oPDF.place_image lImage, 0#, 0#, 1# oPDF.restore ' ursprüngliches Koordinatensystem speichern ' Koordinaten, und damit das Bild skalieren ' ursprüngl. Koordinatensystem wiederherstellen Beachten Sie, dass die an place_image( ) übergebenen x- und y-Werte ebenfalls der Skalierung mit PDF_scale( ) unterliegen; sie müssen deshalb mittels Division durch die Skalierungsfaktoren angepasst werden. 3.4 Verwendung von Rasterbildern 75 Ein Codefragment zur Platzierung von Bildern in einem Koordinatensystem mit Ursprung in der linken oberen Ecke finden Sie in Abschnitt 3.2.1, »Koordinatensysteme«, Seite 40. 3.4.3 Wiederverwendung von Bilddaten Es ist hervorzuheben, dass PDFlib ein wichtiges PDF-Verfahren zur optimalen Handhabung mehrfach vorkommender Rasterbilder unterstützt. Betrachten wir zum Beispiel ein Layout, bei dem sich ein bestimmtes Logo oder ein Hintergrund auf mehreren Seiten befindet. In solchen Fällen ist es möglich, die Bilddaten in der PDF-Datei nur einmal abzulegen und auf jeder Seite nur noch eine Referenz darauf anzulegen. Dazu öffnen Sie die Bilddatei und rufen einfach place_image( ) auf jeder Seite auf, auf der Sie das Logo oder den Hintergrund platzieren möchten. Sie können das geöffnete Bild auf mehreren Seiten platzieren und dabei unterschiedliche Skalierungsfaktoren verwenden (solange es nicht wieder geschlossen wird). Abhängig von der Bildgröße und der Häufigkeit des Auftretens kann dieses Verfahren enormen Speicherplatz sparen. 3.4.4 Bilddaten im Speicher und externe Bildreferenzen Bilddaten, die in PDFlib verwendet werden, stammen in aller Regel aus einer Datei, die sich auf der Festplatte im lokalen Dateisystem befindet. Es werden aber auch andere Bildquellen unterstützt. Denn aus Performancegründen kann es durchaus günstiger sein, vorhandene Bilddaten direkt im Speicher zu übergeben statt auf die Festplatte zuzugreifen. PDFlib unterstützt direkt im Speicher vorgehaltene Bilddaten für einige Dateiformate. PDFlib unterstützt zudem ein experimentelles Feature, das für PDF-Dateien in der Regel Einsatz nicht zu empfehlen ist, in bestimmten Umgebungen aber vorteilhaft sein kann. Während die meisten PDF-Dokumente alle benötigten Informationen selbst enthalten (mit Ausnahme nicht eingebetteter Schriften), ist es auch möglich, statt der eigentlichen Bilddaten nur eine Referenz auf eine externe Datenquelle zu speichern. Damit wird Acrobat die Verantwortung überlassen, die erforderlichen Bilddaten bei Bedarf abzurufen. Dieses Verfahren ähnelt den Bildreferenzen, wie sie aus HTML-Dokumenten bekannt sind. Als externe Bildquellen kommen in erster Linie Dateien im lokalen Dateisystem oder URLs in Frage. Dabei ist jedoch zu beachten, dass Referenzen auf Dateien in Acrobat 3 und 4 funktionieren, während Referenzen auf URLs erst ab Acrobat 4 und nur im Vollprodukt möglich sind. Das bedeutet, dass PDF-Dokumente mit Bild-URLs weder in Acrobat 3 noch in Acrobat Reader 4/5 benutzbar sind! Die Schnittstelle open_image( ) kann sowohl für Bilddaten direkt im Speicher als auch für externe Referenzen verwendet werden. 3.4.5 Bildmasken und Transparenz Transparenz in PDF. Transparenz hat in PostScript und PDF sehr lange gefehlt. Erst in PDF 1.3 (und PostScript 3) integrierte Adobe eine gewisse, wenngleich eingeschränkte Unterstützung für Transparenz in seine Sprachen und Anwendungen. Während Bildmasken (zum Auftragen von Farbe durch eine Bitmapmaske) in PostScript und PDF schon lange unterstützt werden, gibt es seit Acrobat 4 eine Funktion zur Maskierung einzelner Bildpunkte. Damit bieten sich folgende Möglichkeiten: 76 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) > Maskierung nach Position: Ein Bild kann die Information »drucke den Vordergrund, aber nicht den Hintergrund« enthalten. Dieses Verfahren wird oft in Bildern für Kataloge verwendet. > Maskierung nach Farbwert: Pixel einer bestimmten Farbe (oder eines bestimmten Farbbereichs – aber nicht einer beliebig zusammengestellten Menge von Farben) werden nicht gezeichnet, stattdessen scheint der vorher gezeichnete Teil der Seite durch. In der Fernseh- und Videotechnik wird die Farbmaskierung auch als Bluescreen-Verfahren bezeichnet. Der bekannteste Einsatzzweck in diesem Bereich ist die Einblendung der Wetterkarte hinter dem Fernsehmeteorologen. Es ist wichtig anzumerken, dass PDF 1.3 keine echte, sondern lediglich zweiwertige Transparenz unterstützt, in der weder ein Alphakanal noch ein weicher Übergang (»mische dieses Bild mit dem Hintergrund«) vorhanden ist, sondern nur eine EntwederOder-Entscheidung (»drucke das Pixel im Bild oder drucke das Pixel im Hintergrund«). Die zweiwertige Transparenz kann man als Schmalspurvariante des Alphakanals auffassen. Eine weitere wichtige Einschränkung besteht darin, dass die Maske in PDF immer unmittelbar mit dem Bild verknüpft ist; so ist es nicht möglich, ein Bild zuerst mit Maske und danach ohne oder mit einer anderen Maske zu verwenden. Hinweis PDF 1.4 bietet echte Transparenz; diese Funktion wird jedoch von PDFlib bislang nicht unterstützt. Anzeige und Druck von PDF-Dateien mit Transparenz. Genauso wichtig wie die dem PDF-Format zugrunde liegenden Einschränkungen in Bezug auf Transparenz sind die praktischen Auswirkungen in der Viewer-Anwendung. Dabei sind folgende Einschränkungen zu beachten, die sich aber nicht auf Bildmasken beziehen (siehe unten): > Transparenz funktioniert erst seit PDF 1.3/Acrobat 4 – ältere Viewer ignorieren Transparenzinformationen vollständig und übermalen den Hintergrund bei der Anzeige und beim Ausdruck. > Der Ausdruck transparenter Bilder mit PostScript Level 1 oder 2 funktioniert nicht, auch nicht mit Acrobat 4 (denn Transparenz wird erst in PostScript 3 unterstützt und lässt sich nicht so einfach emulieren). Acrobat druckt das zugrunde liegende Bild ohne die Maske. > Ist ein Bild nach Position maskiert, können Acrobat-4-Viewer die Clipping-Informationen nur bis zu einer bestimmten Bildgröße verarbeiten, andernfalls zeigen sie das Bild vollständig (unmaskiert) an. Unsere Tests ergaben, dass Acrobat 4 maskierte Bilder nur unter folgender Bedingung korrekt anzeigt: Breite x Höhe x Anzahl Farbkomponenten/Kanäle < 1024 K Bilder, die dieses Limit überschreiten, werden unmaskiert angezeigt. Das Limit scheint für einen normalen PostScript-3-Drucker eher niedriger zu sein. So führt der Versuch, PDF-Dokumente mit großen maskierten Bildern auszudrucken, zu PostScript-Fehlern. Transparenz-Unterstützung in PDFlib. PDFlib unterstützt die Maskierung nach Position und die Maskierung nach Farbwert (aber nur über Einzelwerte und keine Bereiche). PDFlib unterstützt drei Arten der Transparenzinformation: implizite Transparenz, explizite Transparenz und Bildmasken. 3.4 Verwendung von Rasterbildern 77 Implizite Transparenz. Im impliziten Fall wird die Transparenzinformation aus einer externen Bilddatei berücksichtigt, sofern das Bilddateiformat Transparenz oder einen Alphakanal unterstützt (was nicht auf alle Formate zutrifft). Transparenzinformationen werden in folgenden Dateiformaten erkannt: > GIF-Bilder können einen einzelnen transparenten Farbwert enthalten, der von PDFlib berücksichtigt wird. > PNG-Bilder können mehrere Varianten von Transparenzinformation oder einen vollständigen Alphakanal enthalten. PDFlib versucht, diese Information möglichst umfassend zu erhalten: Einzelne transparente Farbwerte bleiben erhalten; liegen mehrere Farbwerte in einem beigefügten Alphakanal vor, wird nur der erste mit einem Alphawert unter 50 Prozent verwendet; eine vollständiger Alphakanal wird ignoriert. Explizite Transparenz. Im expliziten Fall sind zwei Schritte erforderlich, die jeweils auch Bildoperationen erfordern. Zuerst muss ein Bild zur späteren Verwendung als zweiwertige Transparenzmaske vorbereitet werden. Dies lässt sich über die Standardfunktionen für Bilddateien und den zusätzlichen Parameter mask bewerkstelligen. Um als Maske einsetzbar zu sein, muss das Bild über eine Bittiefe von 1 verfügen, das heißt, dass sich nur einfarbige Bilder dafür eignen. Die folgende Art von Bildern kann zum Anlegen einer Maske verwendet werden: > PNG-Bilder > TIFF-Bilder (nur single-strip) > Bildrohdaten direkt im Speicher Überall dort, wo sich in der Maske der Pixelwert o befindet, wird der entsprechende Bereich des maskierten Bildes gezeichnet, während der Wert 1 den Hintergrund durchscheinen lässt. Im zweiten Schritt wird diese Maske auf ein anderes Bild angewandt, das über eine der Bildfunktionen bezogen wurde: lMask = oPDF.open_image_file("png", MaskFileName, "mask", 0) lImage = oPDF.open_image_file(type, FileName, "masked", lMask) If (lImage <> -1 And lMask <> -1) Then oPDF.place_image lImage, 0#, 0#, 1# Else ... End If Beachten Sie die unterschiedliche Verwendung des optionalen String-Parameters für open_image_file( ): mask zur Maskendefinition und masked zur Anwendung einer Maske auf ein anderes Bild. Der Integer-Parameter bleibt im ersten Schritt ungenutzt, während er im zweiten Schritt den Maskendeskriptor enthält. Bild und Maske können unterschiedliche Pixelmaße aufweisen; die Maske wird automatisch auf die Bildgröße skaliert. Maskierte Bilder werden im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt. 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älle nicht zu vermischen, das heißt, keine Bilder mit transparenten Farbwerten als Maske zu verwenden. 78 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) Bildmasken. Bildmasken sind Bilder mit einer Bittiefe von 1 (Bitmaps), in den 0-Bits als transparent behandelt werden. Da heißt, unabhängig vom bereits auf der Seite vorhandenen Inhalt scheint dieser durch die transparenten Bestandteile des Bildes. 1-BitPixel dagegen werden mit der aktuellen Füllfarbe eingefärbt. Die folgenden Arten von Bildern können als Bildmasken verwendet werden: > PNG-Bilder > TIFF-Bilder (»single-strip« oder »multi-strip«) > Bildrohdaten direkt im Speicher Bildmasken werden einfach mit dem mask-Parameter geöffnet und auf der Seite platziert, nachdem die gewünschte Füllfarbe gesetzt wurde: lMask = oPDF.open_image_file("tiff", MaskFileName, "mask", 0) If (lMask <> -1) Then oPDF.place_image lMask, 0#, 0#, 1# End If 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 3.4.6, »Einfärben von Bildern«, Seite 79). Ignorieren von Transparenz. Manchmal ist es wünschenswert, alle Transparenzinformation in einer Bilddatei zu ignorieren. Die Antialiasing-Funktion von Acrobat zum Beispiel (auch Glätten genannt) wird nicht auf 1-Bit-Bilder angewandt, die nur die Farben schwarz und transparent besitzen. Aus diesem Grund können importierte Bilder mit feinen Details (zum Beispiel gerasterter Text) hässlich aussehen, wenn die Transparenzinformation ins generierte PDF übernommen wird. Um dieses Problem zu lösen, kann die automatische Interpretation von Transparenzinformationen in PDFlib beim Öffnen der Bilddatei mit dem Parameter ignoremask deaktiviert werden: lImage = oPDF.open_image_file("gif", FileName, "ignoremask", 0) 3.4.6 Einfärben von Bildern Ähnlich wie Bildmasken, wo eine Farbe auf die nicht-transparenten Bestandteile eines Bildes angewandt wird, unterstützt PDFlib das Einfärben eines Bildes mit einer Schmuckfarbe. Diese Funktion ist bei Schwarzweiß- oder Graustufenbildern in den folgenden Formaten möglich: > PNG > JPEG > TIFF (single-strip oder multi-strip) > GIF (Da GIF-Bilder immer mit RGB-Farbpalette arbeiten, ist ein Einfärben nur sinnvoll, wenn die Palette ausschließlich Graustufenwerte enthält und der Palettenindex diesen Werten entspricht. PDFlib überprüft dies jedoch nicht.) Um ein Bild mit einer Schmuckfarbe einzufärben, müssen Sie beim Öffnen des Bildes den Parameter colorize und ein Handle für die gewünschte Schmuckfarbe übergeben, welches von makespotcolor( ) zurückgegeben wurde: oPDF.setcolor "both", "cmyk", 1, .79, 0, 0 spot = oPDF.makespotcolor "Reflex Blue CV", 0 lImage = oPDF.open_image_file("tiff", "image.tif, "colorize", spot) If (lImage <> -1) Then 3.4 Verwendung von Rasterbildern 79 oPDF.place_image lImage, 0#, 0#, 1# End If 3.4.7 Mehrseitige Bilddateien PDFlib unterstützt TIFF-Dateien, die aus mehr als einem Bild bestehen (so genannte mehrseitige Dateien). Um mehrseitige TIFFs zu verwenden, wird open_image_file( ) mit weiteren String- und numerischen Parametern aufgerufen: lImage = oPDF.open_image_file("tiff", FileName, "page", 1) Der Parameter page zeigt an, dass eine Datei mit mehreren Bildern verwendet werden soll. Er wird nur bei TIFF-Bildern unterstützt. 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 open_image_file( ) 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 TIFFDatei in ein mehrseitiges PDF-Dokument konvertieren: Frame = 1 Do lImage = oPDF.open_image_file("tiff", FileName, "page", Frame) If (lImage = -1) Then Exit Endif oPDF.begin_page lWidth, lHeight oPDF.place_image lImage, 0, 0, 1 oPDF.close_image lImage oPDF.end_page Frame = Frame + 1 Loop 3.5 PDF-Import mit PDI Hinweis Alle in diesem Abschnitt beschriebenen Funktionen setzen die PDF-Importbibliothek PDI voraus, die nicht Bestandteil der PDFlib-Quellcode-Distribution ist. PDI ist zwar in die PDFlibActiveX/COM-Edition integriert, PDFlib-Lizenznehmer müssen dafür aber einen eigenen Lizenzschlüssel erwerben. Weitere Informationen über den Erwerb von PDI finden Sie auf unseren Webseiten. 3.5.1 PDI-Funktionen und -Anwendungen Wird PDFlib um die optionale PDF-Importbibliothek PDI ergänzt, können mit allen unterstützten Sprachbindungen auch Seiten vorhandener PDF-Dokumente verarbeitet werden. Die PDI-Bibliothek enthält einen PDF-Parser und bereitet PDF-Seiten für einen möglichst einfachen Einsatz mit PDFlib auf. Der Umgang mit importierten PDF-Seiten unterscheidet sich vom Konzept her kaum von importierten Rasterbildern wie TIFF oder PNG: Sie öffnen ein PDF-Dokument, wählen die zu importierende Seite und platzieren sie auf einer Ausgabeseite. Dabei können Sie sie mit PDFlib-Transformationsfunktionen zum Verschieben, Skalieren, Drehen oder Scheren bearbeiten. Importierte Seiten können anhand von PDFlib-Text- und Grafikfunktionen problemlos mit neuem Inhalt kombiniert werden, nachdem sie auf der Ausgabeseite platziert wurden (man kann sich die importierte Seite als Hintergrund für neuen Inhalt vorstellen). Mit PDFlib und PDI lassen sich problemlos folgende Aufgaben erledigen: 80 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) > eine PDF-Hintergrundseite platzieren und mit dynamisch generierten Daten füllen (zum Beispiel Serienbriefe, personalisierte PDF-Dokumente im Web oder Ausfüllen von Formularen) > zwei oder mehr Seiten aus verschiedenen PDF-Dokumenten überlagern (um zum Beispiel Briefpapier mit variablen Inhalten zu kombinieren) > PDF-Kleinanzeigen in vorhandenen Dokumenten platzieren > den sichtbaren Bereich einer PDF-Seite beschneiden, um unerwünschte Elemente (zum Beispiel Schnittmarken) zu verbergen oder Seiten zu skalieren > mehrere Seiten zum Druck auf einem Bogen montieren > Text (zum Beispiel Kopfzeilen, Fußzeilen, Stempel oder Seitenzahlen) oder Bilder (zum Beispiel ein Firmenlogo) zu vorhandenen PDF-Seiten hinzufügen > alle Seiten von einem Eingabedokument in ein Ausgabedokument kopieren und Barcodes auf den Seiten platzieren 3.5.2 Einsatz von PDI-Funktionen mit PDFlib Allgemeine Hinweise. Sie müssen unbedingt beachten, dass PDI nur den eigentlichen Seiteninhalt importiert und keinerlei gegebenenfalls im PDF-Dokument vorhandene Hypertextfunktionen (wie zum Beispiel Sound, Movies, eingebettete Dateien, Hypertextverknüpfungen, Formularfelder, Lesezeichen, Piktogramme oder Notizen). Solche Hypertextfunktionen lassen sich mit den entsprechenden PDFlib-Funktionen generieren. Auch können Sie einzelne Elemente der importierten Seite nicht in PDFlib-Funktionen weiterverwenden. So lassen sich Schriften aus importierten Dokumenten nicht für andere Inhalte benutzen, da alle benötigten Schriften in PDFlib konfiguriert sein müssen. Enthalten mehrere importierte Dokumente eingebettete Fontdaten derselben Schrift, so werden diese 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 offenhalten, 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 es zum Beispiel Farbprofile, so werden diese auch in die generierte Ausgabe übernommen. PDFlib platziert importierte PDF-Seiten auf der Ausgabeseite mittels der TemplateFunktion. Da einige PDF-Programme von Drittanbietern die Template-Funktion nicht korrekt unterstützen, kann es dabei diverse Einschränkungen geben (siehe Abschnitt 3.2.4, »Templates«, Seite 44). Von PDFlib generierte Ausgabe, die importierte Seiten aus anderen PDF-Dokumenten 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 vorhandenen PDF-Dokumenten ist mit sehr einfach strukturiertem Code möglich. Das folgende Fragment öffnet eine vorhandene Dokumentseite und kopiert den Seiteninhalt auf eine neue Seite des PDF-Ausgabedokuments (das vorher geöffnet werden muss): Dim Dim Dim doc, page, pageno; sheetwidth, sheetheight; filename 3.5 PDF-Import mit PDI 81 ... pageno = 1 doc = oPDF.open_pdi(filename, "", 0) If (doc = -1) Then MsgBox "Eingabedatei kann nicht geöffnet werden!" End End If page = oPDF.open_pdi_page(doc, pageno, "") if (page = -1) Then MsgBox "Seite in Eingabedatei kann nicht geöffnet werden!" End End If sheetwidth = oPDF.get_pdi_value("width", doc, page, 0) sheetheight = oPDF.get_pdi_value("height", doc, page, 0) oPDF.begin_page sheetwidth, sheetheight oPDF.place_pdi_page page, 0, 0, 1, 1 oPDF.close_pdi_page page ...mit PDFlib-Funktionen weiteren Seiteninhalt hinzufügen... oPDF.end_page Die PDFlib-Distribution enthält PDI-Beispiele für alle unterstützten Sprachbindungen, die verschiedene Einsatzmöglichkeiten der PDI-Funktionen demonstrieren: > Das Personalization-Beispiel extrahiert eine Seite aus einem vorhandenen PDFDokument und platziert zusätzlichen Text auf der Seite. > Das Quickreference-Beispiel extrahiert mehrere Seiten aus einem vorhandenen PDFDokument, verkleinert sie und platziert sie in der Ausgabe auf einem einzigen Blatt. > Das Imposition-Beispiel (das nur in C verfügbar ist) stellt eine Verallgemeinerung des Quickreference-Beispiels dar. Es verarbeitet eine beliebige Anzahl von PDF-Dokumenten und platziert n x m Seiten auf einem Blatt. Außerdem wird um die verkleinerten Seiten ein Rahmen gezogen. Abmessungen importierter PDF-Seiten. Importierte PDF-Seiten werden im Prinzip wie importierte Rasterbilder behandelt und können mit place_pdi_page( ) auf der Ausgabeseite platziert werden. Die PDI-Bibliothek importiert die Seite standardmäßig genau so, wie sie in Acrobat angezeigt wird, insbesondere mit folgenden Eigenschaften: > Eine eventuelle Beschneidung der Seite bleibt erhalten (technisch ausgedrückt: Ist eine Größenangabe für die CropBox vorhanden, dann zieht die PDI-Bibliothek diese der MediaBox-Angabe vor; siehe Abschnitt 3.2.2, »Begrenzungen für Seiten und Koordinaten«, Seite 42); > Eine eventuell auf die Seite angewandte Drehung bleibt erhalten. Alternativ dazu können Sie PDI mit dem Parameter pdiusebox explizit anweisen, zur Ermittlung 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 4.17). 82 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) 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 4.16 und Tabelle 4.17 aufgeführt. Diese Eigenschaften können bei Entscheidungen über die Platzierung importierter PDF-Seiten auf der Ausgabeseite hilfreich sein. Auch der in Abschnitt 3.4.2, »Häufig benötigte Codefragmente für Rasterbilder«, Seite 74, beschriebene Algorithmus kann zur Skalierung importierter PDF-Seiten herangezogen werden. Umgang mit Dateien im Format Acrobat 5/PDF 1.4. PDI ist vollständig kompatibel zu Dateien im Format PDF 1.4, die mit Acrobat 5 generiert wurden. Sie sollten jedoch Folgendes beachten: Importierte PDF-Dokumente dürfen keine höhere Versionsnummer als die generierte Ausgabe aufweisen. Da der Ausgabemodus in PDFlib 4 standardmäßig zu Acrobat 4/PDF 1.3 kompatibel ist, werden importierte Dateien im Format PDF 1.4 zunächst abgelehnt. Dieses Verhalten kann durch Änderung der Versionsnummer der von PDFlib generierten PDF-Ausgabe wie folgt verhindert werden: oPDF.set_parameter "compatibility", "1.4" Dies bewirkt PDF-Ausgabe, die zu Acrobat 5/PDF 1.4 kompatibel ist, was wiederum Voraussetzung für den Import von Dateien im Format PDF 1.4. ist. 3.5.3 Importierbare PDF-Dokumente PDI verarbeitet in der Regel problemlos alle Arten von PDF-Dokumenten, die sich auch in Acrobat öffnen lassen, völlig unabhängig von der PDF-Versionsnummer oder den im Dokument verwendeten Funktionen. Nur selten tritt der Fall auf, dass PDI ein ganzes PDF-Dokument oder eine einzelne Seite im Dokument zurückweist. Je nach Einstellung des Parameters pdiwarning wird bei nicht akzeptierten PDF-Dateien entweder einfach ein Fehlercode zurückgegeben oder es gibt eine nicht fatale Exception mit einer genauen Fehlerbeschreibung. Folgende Arten von PDF-Dokumenten können mit PDI nicht importiert werden: > PDF-Dokumente, die eine höhere PDF-Versionsnummer aufweisen als die gerade zu generierende PDF-Ausgabe. Der Grund besteht darin, dass PDFlib nach dem Import 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 dem Parameter compatibility entsprechend herauf. > Dateien mit beschädigter Querverweistabelle. Sie erkennen solche Dateien 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. > Verschlüsselte PDF-Dokumente (das heißt Sicherheitseinstellungen mit oder ohne Benutzerpasswort). Lösung: Entfernen Sie alle Sicherheitseinstellungen in Acrobat und speichern Sie das Dokument erneut. Dazu benötigen Sie natürlich das Kennwort für das Dokument. > Da in PDFlib/PDI der LZW-Algorithmus nicht implementiert ist, werden PDF-Seiten, die LZW-Kompression verwenden (genauer gesagt, mit LZW komprimierte Seiten mit mehreren Content-Streams), abgelehnt (unsupported filter). Lösung: Speichern Sie das Dokument in Acrobat ab 4.0, wobei Sie die entsprechende Option aktivieren (in Acrobat 5 Bearbeiten, Grundeinstellungen, Allgemein, Optionen, Speichern unter optimiert für schnelle Web-Anzeige). Beachten Sie, dass Dateien mit LZW-Kompression ab Acrobat Version 4.0 nicht mehr erzeugt werden, sondern nur von Acrobat 3 unter be- 3.5 PDF-Import mit PDI 83 stimmten Umständen und von Acrobat Capture 2. Aus diesem Grund werden Sie mit diesem Problem aller Wahrscheinlichkeit nach nicht konfrontiert werden. Wenn Sie eine sehr große Anzahl solcher Dokumente besitzen, die konvertiert werden müssen, sollten Sie sich die Stapelverarbeitung von Acrobat näher betrachten. 3.5.4 PDF-Import, Templates und Vererbung des Grafik- und Textzustands Grafikparameter können auf einer Seite explizit gesetzt oder in einem Template oder einer importierten PDF-Seite eingestellt sein. Damit erhebt sich die Frage, in welcher Weise grafische Eigenschaften (der so genannte Grafikzustand) weitergegeben (vererbt) werden. Wenn die aktuelle Farbe beispielsweise auf Blau gesetzt ist und das Template oder die importierte Seite ein Objekt zeichnet, sollte das Objekt dann ebenfalls blau sein? Auf den ersten Blick scheint das eine einfache Angelegenheit zu sein. Leider verkompliziert sich die Sache durch Fehler im Druckertreiber von Acrobat, die bewirken können, dass sich Druckausgabe und Bildschirmanzeige des PDF-Dokuments unterscheiden. Aus diesem Grund verhält sich PDFlib wie folgt: > Ist der Parameter inheritgstate auf true gesetzt, können Templates und importierte PDF-Seiten Text- oder Grafikparameter von der importierenden Seite erben. > Ist inheritgstate auf false gesetzt, stellt PDFlib sicher, dass Templates und importierte PDF-Seiten vom Inhalt der umgebenden Seite unabhängig sind und ihr Aussehen nicht ändern. Dazu initialisiert PDFlib alle relevanten Text- und Grafikparameter in geeigneter Weise, bevor das Template platziert wird. Aus Kompatibilitätsgründen hat der Parameter inheritgstate den Standardwert true. Die Auswirkungen sind aber so unberechenbar und verwirrend, dass wir allen PDFlib-Benutzern dringend von der damit verbundenen Vererbung des Grafikstatus abraten. Hinweis In zukünftigen Versionen von PDFlib wird der Parameter inheritgstate nicht mehr unterstützt und prinzipiell das Verhalten für inheritgstate gleich »false« implementiert. 84 Kapitel 3: PDFlib- und PDI-Programmierung (ActiveX/COM- und .NET-Edition) 4 PDFlib- und PDI-API-Referenz In der PDFlib-API-Referenz werden alle unterstützten PDFlib-Funktionen beschrieben. 4.1 Datentypen, Namenskonventionen und Geltungsbereiche Datentypen und PDFlib. Im Prinzip greifen alle ActiveX-fähigen Entwicklungsumgebungen in derselben Art auf PDFlib-Routinen zu. In einigen Fällen unterscheiden sich jedoch die Datentypen für PDFlib-Funktionsparameter. Wie Tabelle 4.1 zeigt, können insbesondere die Datentypen für Strings und Binärdaten leicht abweichen. Tabelle 4.1 Datentypen in den verschiedenen Sprachbindungen Entwicklungsumgebung String-Datentyp Binärdatentyp ActiveX allgemein BSTR (String) Variant vom Typ VT_ARRAY | VT_UI1 1 Delphi String (für 8-Bit-Zeichensätze) oder WideString (für Unicode) OleVariant 1. Mit anderen Worten ein Varianten-Array vorzeichenloser Bytes. Geltungsbereich von Funktionen. Bei den meisten PDFlib-Funktionen sind bestimmte Regeln hinsichtlich der Reihenfolge und Verschachtelung zu beachten, die sich aus ihrem Beitrag zum zu generierenden Dokument ergeben. Die meisten dieser Regeln sind ziemlich offensichtlich. So müssen Sie eine Seite natürlich erst einmal öffnen, bevor Sie sie wieder schließen können. Genauso dürfen Funktionen zum Öffnen und Schließen null object document page page path path page ... pattern font path glyph page path page path gstate page ... path template Abb. 4.1 Verhältnis der Geltungsbereiche zueinander page path template document page pattern font path glyph gstate ... 4.1 Datentypen, Namenskonventionen und Geltungsbereiche 85 eines PDF-Dokuments immer nur paarweise auftreten. Um die korrekte Reihenfolge von Funktionen, die von Client-Programmen verwendet werden, zu definieren und zu verifizieren, arbeitet PDFlib mit Geltungsbereichen, die streng einzuhalten sind. Zu jeder Funktion wird deshalb auch ihr Geltungsbereich angeführt; Tabelle 4.2 definiert die verschiedenen Geltungsbereiche, während Abbildung 4.1 ihre Zusammenhänge veranschaulicht. PDFlib löst eine Exception aus, wenn eine Funktion außerhalb ihres zulässigen Geltungsbereichs aufgerufen wird. Der aktuelle Geltungsbereich kann mit dem Parameter scope abgefragt werden. Tabelle 4.2 Geltungsbereiche für Funktionen Name Definition path beginnt mit moveto( ), circle( ), arc( ), arcn( ) oder rect( ) und endet mit einer der Funktionen aus Abschnitt 4.4.5, »Zeichnen und Beschneiden von Pfaden«, Seite 104 page zwischen begin_page( ) und end_page( ), aber außerhalb von path template zwischen begin_template( ) und end_template( ), aber außerhalb von path pattern zwischen begin_pattern( ) und end_pattern( ), aber außerhalb von path document zwischen open_file( ) und close( ), aber außerhalb von page, template und pattern object solange ein PDFlib-Objekt vorhanden ist, aber außerhalb von document 4.2 Allgemeine Funktionen 4.2.1 Setup Tabelle 4.3 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Tabelle 4.3 Parameter und Werte für Setup-Funktionen Funktion Schlüssel Erklärung set_parameter compatibility Setzt den PDFlib-Kompatibilitätsmodus auf einen der Strings »1.2«, »1.3« oder »1.4« für Acrobat 3, 4 oder 5. Standardmäßig wird »1.3« verwendet (siehe Abschnitt 1.3, »Ausgabe und Kompatibilität von PDFlib«, Seite 12). Dieser Parameter muss vor dem ersten Aufruf von open_*( ) gesetzt werden. Geltungsbereich: object. 86 set_parameter prefix Namenspräfix für die Ressourcedatei in einer UPR-Datei (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57). Das Präfix darf nur einmal gesetzt werden. Es enthält einen Schrägstrich sowie einen Pfadnamen, der wiederum mit einem Schrägstrich beginnen kann. Geltungsbereich: object. set_parameter resourcefile Relativer oder absoluter Name der von PDFlib verwendeten UPR-Ressourcedatei. Diese wird geladen, sobald das nächste Mal versucht wird, auf Ressourcen zuzugreifen. Der Ressourcedateiname darf nur einmal festgelegt werden. Der Aufruf sollte vor der ersten Seite erfolgen. Geltungsbereich: object. set_parameter serial Setzt die Seriennummer von PDFlib und/oder PDI (siehe Abschnitt 2.2.2, »Installation der ActiveX-Edition von PDFlib«, Seite 17). Diese kann nur einmal festgelegt werden, und zwar vor dem ersten Aufruf von begin_page( ). Geltungsbereich: object. set_parameter warning Aktiviert oder deaktiviert die Ausgabe von Warnungen (nicht-fatale Exceptions). Mögliche Werte sind true und false, der Standardwert ist true. Geltungsbereich: beliebig. Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.3 Parameter und Werte für Setup-Funktionen Funktion Schlüssel Erklärung set_value compress Setzt den Kompressionsparameter auf einen Wert zwischen 0 und 9. Dieser Parameter hat keinen Einfluss auf vorkomprimierte Rasterbilddaten, die im PassThrough-Modus bearbeitet werden. Geltungsbereich: beliebig. 0 keine Kompression 1 maximale Geschwindigkeit 6 Standardwert 9 maximale Kompression get_value major minor revision Gibt die Major-Versionsnummer, die Minor-Versionsnummer oder die Revisionsnummer von PDFlib zurück. Geltungsbereich: beliebig, null. get_parameter version Gibt den vollständigen PDFlib-Versionsstring im Format <major>.<minor>.<revision> zurück, an den ggf. noch weitere Kennungen (etwa Beta, rc etc.) angefügt sind. Geltungsbereich: beliebig, null. get_parameter scope Gibt den Namen des aktuellen Geltungsbereichs zurück. Geltungsbereich: beliebig. 4.2.2 Dokument und Seite Tabelle 4.4 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. In Abschnitt 4.8.1, »Aktion und Modus beim Öffnen des Dokuments«, Seite 118, finden Sie weitere relevante Parameter. Tabelle 4.4 Parameter und Werte für Dokument- und Seitenfunktionen Funktion key Erklärung set_value pagewidth pageheight Ändert die Größe der aktuellen Seite. Geltungsbereich: page. get_value pagewidth pageheight Ermittelt die Größe der aktuellen Seite. Geltungsbereich: page. set_value CropBox, BleedBox, ArtBox, TrimBox Ändert eine der Größenangaben der aktuellen Seite. Diese Parameter dürfen nur innerhalb einer Seitenbeschreibung verwendet werden. Auf den Parameternamen muss ein Schrägstrich ’/’ sowie llx, lly, urx oder ury folgen, zum Beispiel: CropBox/ llx (siehe auch Abschnitt 3.2.2, »Begrenzungen für Seiten und Koordinaten«, Seite 42). Geltungsbereich: page. Function open_file(filename As String) As Long Erzeugt eine neue PDF-Datei mit dem übergebenen Dateinamen. filename Name der zu generierenden PDF-Ausgabedatei. Ist filename leer, wird das PDF-Dokument direkt im Arbeitsspeicher und nicht auf der Festplatte abgelegt. In diesem Fall muss das Ergebnis vom Client mit der Funktion PDF_get_buffer( ) abgeholt werden. PDF_open_file( ) ist dann immer erfolgreich und gibt niemals den Fehlercode -1 zurück. Rückgabe -1 im Fehlerfall, sonst 1. 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 abgeschlossen ist. 4.2 Allgemeine Funktionen 87 Gültigkeit object; mit dieser Funktion beginnt der Geltungsbereich document, sofern die Datei erfolgreich geöffnet werden konnte. Diese Funktion muss immer paarweise mit close( ) auftreten. Function get_buffer( ) Holt den Inhalt des PDF-Ausgabepuffers. Das Ergebnis muss vom Client verwendet werden, bevor eine andere PDFlib-Funktion aufgerufen wird. Rückgabe Ein Puffer mit binären PDF-Daten zur Weiterverarbeitung durch den Client. Die meisten ActiveX/COM-Clients speichern den Pufferinhalt in einem Variant-Typ. Der zurückgegebene Puffer kann bis zum Ende des umgebenden Geltungsbereichs object 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 generierten PDF-Daten zurück. Wird sie nach PDF_close( ) aufgerufen, dann gibt sie den Rest des PDF-Dokuments zurück. Wird diese Funktion nur ein einziges Mal und zwar nach PDF_close( ) aufgerufen, enthält der Rückgabepuffer garantiert das vollständige 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-Werte vorbereitet sein. Gültigkeit object, document (mit anderen Worten: nach end_page( ) und bevor begin_page( ), oder nach close( ) und vor delete( ). Diese Funktion darf nur verwendet werden, wenn ein leerer Dateiname an open_file( ) übergeben wurde. Sub close( ) Schließt die generierte PDF-Datei und gibt alle dokumentspezifischen Ressourcen frei. Details Diese Funktion beendet das generierte PDF-Dokument, gibt alle dokumentspezifischen Ressourcen frei und schließt die Ausgabedatei, sofern das Dokument mit PDF_open_ file( ) geöffnet wurde. Diese Funktion muss nach Abschluss der Seitengenerierung auf jeden Fall aufgerufen werden, unabhängig davon, auf welche Art das PDF-Dokument geöffnet wurde. Wurde das Dokument direkt im Speicher erzeugt (und nicht in einer Datei), bleibt der Dokumentpuffer auch nach dem Aufruf dieser Funktion erhalten (damit sein Inhalt mit PDF_get_buffer( ) abgeholt werden kann). Er wird beim nächsten Aufruf von PDF_ open( ) freigegeben oder wenn das PDFlib-Objekt ungültig wird. Gültigkeit document; mit dieser Funktion wird der Geltungsbereich document beendet; diese Funktion muss immer paarweise mit open( ) auftreten. Sub begin_page(width As Single, height As Single) Fügt eine neue Seite zum Dokument hinzu. width, height Die Parameter width und height geben die Größe der neuen Seite in Punkt an. Die Beschränkungen der Seitengröße in Acrobat werden in Abschnitt 3.2.1, »Koordinatensysteme«, Seite 40, beschrieben. Eine Liste üblicher Seitenformate finden 88 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sie in Tabelle 4.26 in Abschnitt 4.9, »Seitenformate«, Seite 126. Die Seitengröße kann nach dem Aufruf von begin_page( ) mit den Parametern pagewidth und pageheight geändert werden. Um Seiten im Querformat zu erstellen, muss width > height sein. PDFlib verwendet width und height zur Erzeugung der MediaBox der Seite. Mit verschiedenen anderen Parametern lassen sich weitere Größenangaben im PDF-Dokument festlegen (siehe Tabelle 4.3). Gültigkeit document; mit dieser Funktion beginnt der Geltungsbereich page; diese Funktion muss immer paarweise mit PDF_end_page( ) auftreten. Parameter pagewidth, pageheight, CropBox, BleedBox, ArtBox, TrimBox Sub end_page( ) Beendet die Seite. Details Diese Funktion muss zur Beendigung einer Seitenbeschreibung benutzt werden. Gültigkeit page; mit dieser Funktion endet der Geltungsbereich page; diese Funktion muss immer paarweise mit begin_page( ) auftreten. 4.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 Setzen und Ermitteln numerischer und String-Parameter stehen vier Funktionen bereit. Bei allen Parametern (Schlüssel wie Werte) wird zwischen Groß- und Kleinschreibung unterschieden. Bei jeder Kategorie von Funktionen werden auch die jeweils relevanten Parameter beschrieben. Function get_value(key As String, modifier As Single) As Single Ermittelt den Wert eines numerischen PDFlib-Parameters. key Name des abzufragenden Parameters. modifier Optionaler Modifizierer, der auf den Parameter anzuwenden ist. Ob ein Modifizierer erforderlich ist und worauf er sich gegebenenfalls bezieht, wird in den verschiedenen Parametertabellen erläutert. Wird kein Modifizierer benötigt, muss er auf 0 gesetzt werden. Rückgabe Numerischer Wert des Parameters. Gültigkeit Hängt vom Schlüssel ab. Siehe auch get_pdi_value( ) Sub set_value(key As String, value As Single) Setzt den Wert eines numerischen PDFlib-Parameters. key value Name des zu setzenden Parameters. Neuer Wert des zu setzenden Parameters. 4.2 Allgemeine Funktionen 89 Gültigkeit Hängt vom Schlüssel ab. Function get_parameter(key As String, modifier As Single) As String Ermittelt den Inhalt eines PDFlib-Parameters vom Typ String. key Name des abzufragenden Parameters. modifier Optionaler Modifizierer, der auf den Parameter anzuwenden ist. Ob ein Modifizierer erforderlich ist und worauf er sich gegebenenfalls bezieht, wird in den verschiedenen 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 umgebenden Geltungsbereichs document verwendet werden. Gültigkeit Hängt vom Schlüssel ab. Siehe auch PDF_get_pdi_parameter( ) Sub set_parameter(key As String, value As String) Setzt einen PDFlib-Parameter vom Typ String. key value Name des zu setzenden Parameters. Neuer Wert des zu setzenden Parameters. Gültigkeit Hängt vom Schlüssel ab. 4.3 Textfunktionen 4.3.1 Fontbehandlung Tabelle 4.5 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Tabelle 4.5 Parameter und Werte für Fontfunktionen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion 90 Schlüssel Erklärung set_parameter FontAFM FontPFM FontOutline Encoding Wie die jeweilige Zeile in der entsprechenden Kategorie der UPR-Ressourcedatei (siehe Abschnitt 3.3.7, »Ressourcekonfiguration und die UPR-Ressourcedatei«, Seite 57). Durch mehrere Aufrufe erhält die interne Liste neue Einträge (siehe auch prefix und resourcefile in Tabelle 4.3). Geltungsbereich: beliebig. get_value Gibt den Identifier des aktuellen Fonts zurück, der mit setfont( ) gesetzt worden sein muss. Geltungsbereich: page, pattern, template. font get_parameter fontname Name des aktuellen Fonts, der mit setfont( ) gesetzt worden sein muss. Geltungsbereich: page, pattern, template. get_parameter fontencoding Name des Zeichensatzes oder der CMap, die für die aktuelle Schrift verwendet wird. Der Font muss mit setfont( ) gesetzt worden sein. Geltungsbereich: page, pattern, template. get_value Gibt die Größe des aktuellen Fonts zurück, der mit setfont( ) gesetzt worden sein muss. Geltungsbereich: page, pattern, template. fontsize Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.5 Parameter und Werte für Fontfunktionen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung get_value capheight ascender descender Gibt Metrikdaten für den durch den Modifizierer bezeichneten Font zurück. Weitere Informationen finden Sie in Abschnitt 3.3.10, »Textmetrik, Textvarianten und Formatierung in ein Rechteck«, Seite 67. 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 gleich false, gibt findfont( ) -1 zurück (statt eine Exception auszulösen), wenn die Font/Zeichensatz-Kombination nicht geladen werden kann. Standardwert ist true. Geltungsbereich: beliebig. Function findfont(fontname As String, encoding As String, options As Long) As Long Sucht nach einer Schrift und bereitet sie zur späteren Verwendung vor. fontname Name der Schrift, wie er in PDFlib konfiguriert ist. encoding Bei 8-Bit-Schriften bezeichnet encoding einen der Zeichensätze builtin, macroman, winansi, ebcdic oder host (siehe Abschnitt 3.3.2, »In PDFlib integrierte 8-BitZeichensätze«, Seite 46) oder den Namen eines externen von PDFlib gelieferten oder benutzerdefinierten Zeichensatzes (siehe Abschnitt 3.3.3, »Benutzerdefinierte 8-Bit-Zeichensätze und Codepages«, Seite 48). Beachten Sie, dass Sie die Metrikdaten für eine Schrift benötigen, um mit beliebigen Zeichensätzen arbeiten zu können (siehe Abschnitt 3.3.6, »PostScript-, TrueType- und OpenType-Schriften«, Seite 53). Alternativ dazu kann encoding den Namen einer der integrierten CMaps enthalten, sofern fontname einen CID-Schrift bezeichnet (siehe Abschnitt 3.3.8, »Japanischer, chinesischer und koreanischer Text«, Seite 60). In diesem Fall sind keine Metrikdaten erforderlich. Bei fontname sowie encoding wird zwischen Groß- und Kleinschreibung unterschieden. options Steuert die Schriftverarbeitung. Wird eine Schrift eingebettet, muss neben den Metrikdaten auch die Fontdatei verfügbar sein (bei TrueType- und OpenTypeSchriften sind die Metrikdaten bereits in der Fontdatei enthalten). Die tatsächliche Schriftdefinition wird dann in die PDF-Ausgabe übernommen. Beim Aufruf dieser Funktion wird lediglich überprüft, ob die Fontdatei existiert. Sie wird erst später benutzt, da die Schrifteinbettung erst am Ende der generierten PDF-Datei erfolgt. Wird eine Schrift nicht eingebettet, dann werden nur allgemeine Fontinformationen in die PDF-Ausgabe aufgenommen. Tabelle 4.6 zeigt alle möglichen Werte für den Parameter options. Tabelle 4.6 Werte für den Parameter options Wert Schrifteinbettung Einlesen von Kerning-Daten, falls vorhanden 0 nein nein 1 ja nein Der Parameter options muss bei CID-Schriften auf 0 gesetzt sein. Rückgabe Fonthandle zur späteren Verwendung in setfont( ). Das Verhalten dieser Funktion ändert sich, wenn der Parameter fontwarning auf false gesetzt wird. findfont( ) gibt dann den Fehlercode -1 zurück, statt eine Exception auszulösen, wenn die angeforderte Font- 4.3 Textfunktionen 91 Zeichensatz-Kombination nicht geladen werden kann. Bei nicht korrekten Parametern wird aber auch weiterhin eine Exception ausgelöst. Der zurückgegebene Wert – das Fonthandle – hat für den Benutzer keinerlei inhaltliche Bedeutung. Er dient lediglich als Argument für setfont( ) und verwandte Funktionen. Beim Anfordern der gleichen Font-Zeichensatzkombination in verschiedenen Dokumenten können unterschiedliche Fonthandles zurückgegeben werden. Details Diese Funktion bereitet eine Schrift zur späteren Verwendung in setfont( ) vor. Die Metrikdaten werden aus dem Arbeitsspeicher oder aus einer externen Metrikdatei geladen. Eine Exception vom Typ PDF_RuntimeError wird ausgelöst, wenn die angeforderte FontZeichensatz-Kombination 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). Anderenfalls kann der von dieser Funktion zurückgegebene Wert als Fontargument in weiteren Funktionen zur Schriftbehandlung verwendet werden. CID-Schriften werden im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt. Gültigkeit document, page, pattern, template Parameter Siehe Tabelle 4.5. Sub setfont(font As Long, fontsize As Single) Setzt die aktuelle Schrift in der festgelegten Größe. font Fonthandle, das von findfont( ) zurückgegeben wurde. fontsize Größe der Schrift, gemessen in Einheiten des aktuellen benutzerdefinierten Koordinatensystems. Details Die Schrift muss auf jeder Seite erneut gesetzt werden, und zwar vor dem Zeichnen von jeglichem Text. Die Schrifteinstellungen gelten immer nur für die aktuelle Seite. Die aktuelle Schrift kann auf einer Seite beliebig oft geändert werden. Gültigkeit page, pattern, template Parameter Siehe Tabelle 4.5. Die Funktion setzt den Parameter leading für den Zeilenabstand auf fontsize. 4.3.2 Textausgabe Hinweis Jeder Text, der an die in diesem Abschnitt beschriebenen Funktionen übergeben wird, muss zu dem Zeichensatz passen, der mit findfont( ) selektiert wurde. Dies gilt für 8-Bit-Text ebenso wie für Unicode oder andere über eine CMap festgelegte Zeichensätze. Tabelle 4.7 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Sub set_text_pos(x As Single, y As Single) Setzt die aktuelle Textposition. x, y 92 Aktuelle Textposition, die gesetzt werden soll. Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.7 Parameter und Werte für Textfunktionen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung set_value get_value leading Setzt oder ermittelt den Zeilenabstand (leading), der als Abstand zwischen den Grundlinien aufeinanderfolgender Textzeilen definiert ist. Der Zeilenabstand wird in continue_text( ) verwendet und auf die Schriftgröße gesetzt, wenn eine neue Schrift mit setfont( ) festgelegt wird. Wird der Zeilenabstand mit der Schriftgröße gleichgesetzt, stoßen die Zeilen fast aneinander. Ober- und Unterlängen aufeinanderfolgender Zeilen überlappen aber in der Regel nicht. Geltungsbereich: page, pattern, template. set_value get_value textrise Setzt oder ermittelt den Parameter für den vertikalen Textversatz (text rise). Dieser legt den Abstand zwischen der gewünschten Textposition und der Standardgrundlinie fest. Positive Werte verschieben den Text nach oben. Der Textversatz bezieht sich immer auf die vertikale Koordinate. Dies kann zum Hoch- und Tiefstellen nützlich sein. Am Anfang jeder Seite wird der Textversatz auf den Standardwert 0 gesetzt. Geltungsbereich: page, pattern, template. set_value get_value textrendering Setzt oder ermittelt den aktuellen Darstellungsmodus für Text (text rendering mode). Dieser Parameter kann einen der Werte in Tabelle 3.9 haben. Am Anfang jeder Seite wird er auf den Standardwert 0 gesetzt (= ganzflächige Füllung). Geltungsbereich: page, pattern, template. set_value get_value horizscaling Setzt oder ermittelt die Skalierung von Text (horizontal text scaling). Diese wird in Prozent angegeben und muss größer als 0 sein. Der Parameter legt anhand eines Prozentwerts fest, ob und wie stark der Text gestaucht oder gestreckt wird. Am Anfang und am Ende jeder Seite wird er auf den Standardwert 100 gesetzt. Die Textskalierung bezieht sich immer auf die horizontale Koordinate. Geltungsbereich: page, pattern, template, document. set_value get_value charspacing Setzt oder ermittelt den Zeichenabstand, das heißt, wie stark sich die aktuelle Position nach der Platzierung eines einzelnen Zeichens in einem String ändert. Der Zeichenabstand wird in Einheiten des aktuellen benutzerdefinierten Koordinatensystems angegeben. Am Anfang und am Ende jeder Seite wird er auf den Standardwert 0 zurückgesetzt. Um einen weiteren Zeichenabstand zu erreichen, verwenden Sie positive Werte im horizontalen Ausgabemodus und negative Werte im vertikalen Ausgabemodus. Geltungsbereich: page, pattern, template, document. set_value get_value wordspacing Setzt oder ermittelt den Wortabstand, das heisst, wie stark sich die aktuelle Position nach der Platzierung eines Wortes in einer Textzeile ändert. Anders ausgedrückt, wird die aktuelle Position nach jedem ASCII-Leerzeichen (&H20) horizontal verschoben. Da Schriften mit Multibyte-Zeichensätzen über kein ASCIILeerzeichen verfügen, werden sie vom hier definierten Wortabstand nicht beeinflusst. Der Abstandswert wird in Einheiten des Textkoordinatensystems angegeben. Am Anfang und am Ende jeder Seite wird er auf den Standardwert 0 zurückgesetzt. Geltungsbereich: page, pattern, template, document. get_value textx texty Ermittelt die x- bzw. y-Koordinate der aktuellen Textposition (nicht für CID-Fonts). Geltungsbereich: page, pattern, template. set_parameter underline get_parameter overline strikeout Setzt oder ermittelt den aktuellen Modus für Unterstreichen, Überstreichen bzw. Durchstreichen, der bis zu einer expliziten Änderung beibehalten wird. Diese Modi können unabhängig voneinander eingestellt werden. Am Anfang jeder Seite werden sie auf false zurückgesetzt (siehe Abschnitt 3.3.10, »Textmetrik, Textvarianten und Formatierung in ein Rechteck«, Seite 67). Geltungsbereich: page, pattern, template. true Text unterstreichen/überstreichen/durchstreichen (nicht für CID-Fonts) false Text nicht unterstreichen/überstreichen/durchstreichen set_parameter nativeunicode Ist dieser Parameter auf true gesetzt, wird Unicode-Textverarbeitung mit UCS-2Zeichensatz für Sprachbindungen mit Unicode-Unterstützung aktiviert; bei false ist sie deaktivert. Standardwert ist false (siehe Abschnitt 3.3.9, »UnicodeUnterstützung«, Seite 65). Geltungsbereich: beliebig. 4.3 Textfunktionen 93 Details Zu Beginn jeder Seite wird die Textposition auf den Standardwert (0, 0) gesetzt. Der aktuelle Punkt für die Grafikausgabe und die aktuelle Textposition werden getrennt verwaltet. Gültigkeit page, pattern, template Parameter Siehe Tabelle 4.7. Sub show(text As String) Gibt Text in der aktuellen Schrift und Größe an der aktuellen Textposition aus. text Auszugebender Text. Details Vor dieser Funktion müssen sowohl die Schrift (mit setfont( )) als auch die aktuelle Textposition (mit set_text_pos( ) oder einer anderen Textausgabefunktion) gesetzt worden sein. Die aktuelle Textposition wird an das Ende des ausgegebenen Texts verschoben. Gültigkeit page, pattern, template Parameter Siehe Tabelle 4.7. Sub show_xy(text As String, x As Single, y As Single) Gibt text mit der aktuellen Schrift an Position (x, y) aus. text Auszugebender Text. x,y Position im benutzerdefinierten Koordinatensystem, in dem der Text ausgegeben wird. Details Die Schrift muss zuvor mit setfont( ) eingestellt worden sein. Die aktuelle Textposition wird ans Ende des ausgegebenen Texts bewegt. Gültigkeit page, pattern, template Parameter Siehe Tabelle 4.7. Sub continue_text(text As String) Gibt Text in der nächsten Zeile aus. text Auszugebender Text. Wird ein Leerstring übergeben, wird die Textposition auf jedem Fall in die nächste Zeile bewegt. Details Die Textpositionierung und der Zeilenabstand werden durch den Parameter leading sowie den letzten Aufruf von PDF_show_xy( ) oder PDF_set_text_pos( ) bestimmt. Diese Funktion kann auch nach PDF_show_boxed( ) ausgeführt werden, wenn diese mit mode = left oder justify aufgerufen wurde. Die aktuelle Position wird ans Ende des auszugebenden Texts bewegt. Gültigkeit page, pattern, template; diese Funktion sollte im vertikalen Textausgabemodus nicht verwendet werden. Parameter Siehe Tabelle 4.7. 94 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Function show_boxed(text As String, x As Single, y As Single, width As Single, height As Single, mode As String, feature As String) As Long Formatiert Text in ein Rechteck unter Berücksichtigung des angegebenen Formatierungsmodus. text ten. Text, der in das Rechteck formatiert werden soll. Er darf keine Nullzeichen enthal- x, y Koordinaten einer Ecke des Rechtecks oder Koordinaten des Ausrichtungspunkts, falls width = 0 und height = 0. width, height Größe des Rechtecks oder 0 bei Formatierung einer einzelnen Zeile. mode mode selektiert den Modus für die horizontale Ausrichtung. Ist width = 0 und height = 0, kann mode einen der Werte left, right oder center annehmen. Der Text wird dann entsprechend der gewählten Ausrichtung ausgehend vom Punkt (x, y) formatiert, wobei y die Position der Grundlinie angibt. In diesem Modus überprüft die Funktion nicht, ob der Text aufgrund der übergebenen Parameterwerte am Seitenrand abgeschnitten wird. Es findet keinerlei Zeilenumbruch statt und es wird immer der Wert o zurückgegeben. Sind width oder height von 0 verschieden, kann mode einen der Werte left, right, center, justify oder fulljustify annehmen. Der übergebene Text wird in ein Rechteck formatiert, dessen linke untere Ecke durch (x, y) gegeben ist (siehe auch Koordinaten mit dem Ursprung in der linken oberen Ecke in Abschnitt 3.2.1, »Koordinatensysteme«, Seite 40) und dessen Abmessungen in width und height übergeben werden. Passt der Text nicht in eine Zeile, wird der Text mit einem einfachen Algorithmus in die nächste verfügbare Zeile umgebrochen, wobei der Zeilenwechsel möglichst bei vorhandenen Leeroder Tabulatorzeichen erfolgt. Die Modi left, right und center bestimmen die Ausrichtung des Texts in der Zeile, während die Ausrichtung des Texts bei justify am linken und rechten Rand erfolgt. Es ist üblich und wird auch hier so gehandhabt, dass die letzte Zeile im Rechteck im justify-Modus linksbündig ausgerichtet wird, während im fulljustifyModus alle Zeilen (einschließlich der letzten, sofern sie mindestens ein Leer- oder Tabulatorzeichen enthält) am linken und rechten Rand ausgerichtet werden. fulljustify ist dann sinnvoll, wenn der Text in einer anderen Spalte fortgesetzt werden soll. feature Ist der Parameter feature auf blind gesetzt, dann erfolgen zwar alle nötigen Berechnungen (mit Ausnahme der internen Koordinaten textx und texty, die nicht aktualisiert werden), der Text wird aber nicht ausgegeben. Diese Möglichkeit kann genutzt werden, um Probeberechnungen durchzuführen und zum Beispiel herauszufinden, bei welcher Schriftgröße ein Text genau in ein vorgegebenes Rechteck passt. Anderenfalls muss feature leer sein. Rückgabe Die Anzahl von Zeichen, die nicht verarbeitet werden konnten, weil der Text nicht vollständig in die Zeile passte. Passte der Text, wird 0 zurückgegeben. Da keinerlei Formatierung durchgeführt wird, wenn width = 0 und height = 0, gibt die Funktion in diesem Fall immer 0 zurück. Details Die aktuelle Schrift muss vor dem Aufruf dieser Funktion gesetzt worden sein. Für den Text werden die aktuell eingestellten Werte für Schrift, Schriftgröße, horizontaler Abstand und Zeilenabstand verwendet. Die aktuelle Textposition wird ans Ende des generierten Texts verschoben. 4.3 Textfunktionen 95 Gültigkeit page, pattern, template; diese Funktion kann nicht bei CID-Schriften oder beim Zeichensatz ebcdic verwendet werden. Parameter Siehe Tabelle 4.7. Siehe auch Einschränkungen dieser Funktionen werden in Abschnitt 3.3.10, »Textmetrik, Textvarianten und Formatierung in ein Rechteck«, Seite 67 beschrieben. Function stringwidth(text As String, font As Long, size As Single) As Single Gibt die Breite von text in einer beliebigen Schrift zurück. text Text, dessen Breite ermittelt wird. font Fonthandle, das von PDF_findfont( ) zurückgegeben wurde. Die zugehörige Schrift darf keine CID-Schrift sein. Bezieht sich font auf eine CID-Schrift, gibt diese Funktion unabhängig von den Parametern text und size immer 0 zurück. size Textlänge, gemessen in Einheiten des benutzerdefinierten Koordinatensystems. Details Diese Funktion gibt die Breite von text in beliebiger Schrift und der Größe size zurück. Bei der Berechnung der Textbreite werden die aktuellen Werte folgender Textparameter herangezogen: horizontale Skalierung, Zeichenabstand und Wortabstand. Der Parameter wordspacing wird ignoriert. Gültigkeit page, pattern, template, path, document Parameter Siehe Tabelle 4.7. 4.4 Grafikfunktionen 4.4.1 Funktionen für den Grafikzustand Alle Parameter, die sich auf den Grafikzustand beziehen, werden am Anfang jeder Seite wieder auf ihre Standardwerte zurückgesetzt. Die Standardwerte werden bei den jeweiligen Funktionsbeschreibungen angegeben. Funktionen, die sich auf den Textzustand beziehen, werden in Abschnitt 4.3, »Textfunktionen«, Seite 90, beschrieben. Hinweis Keine der Funktionen für den Grafikzustand darf im Geltungsbereich path verwendet werden (siehe Abschnitt 3.2, »Seitenbeschreibungen«, Seite 40). Sub setdash(b As Single, w As Single) Setzt das aktuelle Strichmuster. b, w Anzahl der sich abwechselnden schwarzen bzw. weißen Einheiten. b und w müssen 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. Gültigkeit page, pattern, template 96 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub setpolydash(darray) Legt ein komplizierteres über ein Array definiertes Strichmuster fest. darray Array mit Längenangaben für sich abwechselnde schwarze und weiße Striche. Diese Arraywerte müssen positiv und dürfen nicht alle gleich null sein. Sie werden solange zyklisch verwendet, bis der Pfad komplett gezeichnet ist. Details Um eine durchgezogene Linie zu erhalten, arbeiten Sie mit einem leeren Array. Die Arraylänge muss kleiner oder gleich 8 sein; anderenfalls wird das Array abgeschnitten. Am Anfang jeder Seite wird das Strichmuster auf eine durchgezogene Linie gesetzt. Gültigkeit page, pattern, template Sub setflat(flatness As Single) Setzt den Flatness-Parameter. 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. Gültigkeit page, pattern, template Sub setlinejoin(linejoin As Long) Legt die Verbindungsart von Linien (linejoin-Parameter) fest. linejoin Legt die Form der Ecken in zu zeichnenden Pfaden fest (siehe Tabelle 4.8). Details Am Anfang jeder Seite wird der linejoin-Parameter auf den Standardwert 0 gesetzt. Gültigkeit page, pattern, template Tabelle 4.8 Werte für den linejoin-Parameter Wert Beschreibung (aus der PDF-Referenz) 0 Spitze Verbindungen (miter joins): Die beiden Pfadsegemente werden durchgezogen, bis die äußeren Ecken sich berühren. Steht die resultierende Spitze zu weit hervor, was durch den miterlimit-Parameter festgelegt ist, wird stattdessen eine abgeschnittene Verbindung verwendet. 1 Abgerundete Verbindungen (round joins): Ein gefüllter Kreis mit einem der Linienstärke entsprechenden Durchmesser wird um den Punkt gezeichnet, in dem sich die Liniensegmente treffen. Das Ergebnis ist eine abgerundete Ecke. 2 Stumpfe Verbindungen (bevel joins): Die beiden Pfadsegmente werden nur durchgezogen, bis die inneren Ecken sich berühren (siehe Beschreibung des linecap-Parameters). Die verbleibende Aussparung wird mit einem Dreieck gefüllt. Beispiele 4.4 Grafikfunktionen 97 Sub setlinecap(linecap As Long) Legt die Art der Linienenden (linecap-Parameter) fest. linecap Steuert die Art der Linienenden beim Zeichnen eines Pfads (siehe Tabelle 4.9). Details Am Anfang jeder Seite wird der linecap-Parameter auf den Standardwert 0 gesetzt. Gültigkeit page, pattern, template Tabelle 4.9 Werte für den linecap-Parameter Wert Beschreibung (aus der PDF-Referenz) 0 Abgeschnittene Linienenden: Die Linie wird am Endpunkt des Pfades rechtwinklig abgeschnitten. Beispiele 1 Abgerundete Linienenden: Ein Halbkreis mit einem der Linienstärke entsprechenden Durchmesser wird um den Endpunkt gezeichnet und gefüllt. 2 Hervorstehende rechtwinklige Linienenden: Das Linienende wird um die halbe Linienstärke verlängert und rechtwinklig abgeschnitten. Sub setmiterlimit(miter As Single) Legt den Grenzwert für das Abschneiden spitzer Liniensegmente fest (miterlimit). miter Ein Wert größer oder gleich 1, der festlegt, wie die Spitze gezeichnet wird, die sich bei spitzen Verbindungen (miter joins) ergibt. Miter length Strichstärke 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 beiden Liniensegmente in einem schmalen Winkel zusammenlaufen. Diese Spitze wird abgeschnitten (das heißt die spitze Verbindung wird durch eine stumpfe ersetzt), wenn das Verhältnis zwischen Spitzenbreite und Linienstärke den Wert des miterlimit-Parameters übersteigt. Am Anfang jeder Seite wird miterlimit auf den Standardwert 10 gesetzt. Dies entspricht einem Winkel von etwa 10,5 Grad. Gültigkeit page, pattern, template Sub setlinewidth(width As Single) Setzt die aktuelle Linienstärke. width Die Linienstärke in Einheiten des benutzerdefinierten Koordinatensystems Details Am Anfang jeder Seite wird der Parameter width auf den Standardwert 1 gesetzt. Gültigkeit page, pattern, template 98 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub initgraphics Setzt alle Parameter, die sich auf Farbe und Grafikzustand beziehen, auf ihre Standardwerte zurück. Details Die Parameter für Farbe (color), Linienstärke (linewidth), Linienende (linecap), Verbindungsart (linejoin), Grenzwert für spitze Verbindungen (miterlimit) und Strichmuster (dash) sowie die aktuelle Transformationsmatrix (aber nicht die Parameter für den Textzustand) werden auf ihre jeweiligen Standardwerte zurückgesetzt. Der aktuelle Clipping-Pfad ist davon nicht betroffen. Diese Funktion kann in Situationen nützlich sein, wo der Programmablauf die Verwendung von PDF_save( )/PDF_restore( ) oder die Vorbereitung des Grafikzustands für ein nachfolgendes Template oder importiertes PDF nicht zulässt. Gültigkeit page, pattern, template 4.4.2 Speichern und Wiederherstellen des Grafikzustands Sub save( ) Speichert den aktuellen Grafikzustand. 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öchte (zum Beispiel auf ein benutzerdefiniertes Koordinatensystem), ohne erneut explizit alle relevanten Parameter einstellen zu müssen. Beim Speichern und Wiederherstellen des Grafikzustandes werden folgende Parameter berücksichtigt: > Grafikparameter: Clipping-Pfad, Koordinatensystem, aktuelle Position, Flatness, Linienendenstil (linecap), Strichmuster (dash), Art der Verbindungslinien (linejoin), Linienstärke (line width), Grenzwert für das Abschneiden spitzer Liniensegmente (miter limit); > Farbparameter: Linien- und Füllfarben; > Textposition und andere auf Text bezogene Parameter (siehe Liste unten); > einige PDFlib-Parameter (siehe Liste unten). Paare aus save( ) und restore( ) können verschachtelt werden. Obwohl es für diese Art der Verschachtelung keinen durch die PDF-Spezifikation bedingten Grenzwert gibt, dürfen Anwendungen nicht mehr als neun Verschachtelungsebenen nutzen. Anderenfalls können Probleme beim Drucken auftreten, die sich aus Einschränkungen bei der von PDFViewern erzeugten PostScript-Ausgabe ergeben. Außerdem müssen einige Verschachtelungsebenen für den internen Gebrauch durch PDFlib reserviert bleiben. Gültigkeit page, pattern, template; diese Funktion muss immer paarweise mit restore( ) auftreten. Genauer gesagt müssen save( ) und restore( ) paarweise innerhalb der Seite, des Musters odes des Templates auftreten. Parameter Der save/restore-Mechanismus bezieht folgende Parameter ein: charspacing, wordspacing, horizscaling, leading, font, fontsize, textrendering, textrise; nicht berücksichtigt werden die Parameter fillrule, underline, overline und strikeout. 4.4 Grafikfunktionen 99 Sub restore( ) Stellt den zuletzt gespeicherten Grafikzustand wieder her. Details Der entsprechende Grafikzustand muss innerhalb derselben Seite, desselben Musters bzw. desselben Templates gespeichert worden sein. Gültigkeit page, pattern, template; diese Funktion muss immer paarweise mit save( ) auftreten. Genauer gesagt müssen save( ) und restore( ) paarweise innerhalb der Seite, des Musters oder des Templates auftreten. 4.4.3 Funktionen zur Transformation des Koordinatensystems Alle Transformationsfunktionen (translate( ), scale( ), rotate( ), skew( ), concat( ), setmatrix( ) und initgraphics( )) ändern das Koordinatensystem, das beim Zeichnen nachfolgender Objekte verwendet wird. Sie haben keinerlei Einfluss auf bereits auf der Seite vorhandene Objekte. Sub translate(tx As Single, ty As Single) Verschiebt den Ursprung des Koordinatensystems. tx, ty Der neue Ursprung des Koordinatensystems liegt im Punkt (tx, ty), wobei sich dessen Werte auf das alte Koordinatensystem beziehen. Gültigkeit page, pattern, template Sub scale(sx As Single, sy As Single) Skaliert das Koordinatensystem. sx, sy Skalierungsfaktor in x- und y-Richtung. 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 Koordinatensystem entspricht sx Einheiten in x-Richtung im alten Koordinatensystem; entsprechendes gilt für die y-Koordinaten. Visual-Basic-Benutzer müssen Abschnitt 2.2.9, »Einsatz von PDFlib mit Visual Basic«, Seite 26, berücksichtigen und die Schreibweise oPDF.[scale] verwenden. Gültigkeit page, pattern, template Sub rotate(phi As Single) Dreht das benutzerdefinierte Koordinatensystem. phi Rotationswinkel in Grad. Details Die Winkelmessung beginnt auf der positiven x-Achse des aktuellen Koordinatensystems und erfolgt gegen den Uhrzeigersinn. Die neuen Koordinatenachsen ergeben sich aus einer Drehung der alten Koordinatenachsen um phi Grad. Gültigkeit page, pattern, template 100 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub skew(alpha As Single, beta As Single) Schert das Koordinatensystem. alpha, beta Scherungswinkel in x- und y-Richtung in Grad. Details Bei der Scherung wird das Koordinatensystem in x- und y-Richtung um die übergebenen Winkel geneigt. alpha wird dabei von der positiven x-Achse des aktuellen Koordinatensystems 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. Gültigkeit page, pattern, template Sub concat(a As Single, b As Single, c As Single, d As Single, e As Single, f As Single) Konkateniert eine Matrix mit der aktuellen Transformationsmatrix. a, b, c, d, e, f Elemente einer Transformationsmatrix. Die sechs Gleitkommazahlen bilden eine Matrix wie in PostScript oder PDF. Um entartete Transformationen zu vermeiden, darf a*d nicht gleich b*c 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 translate( ), scale( ), rotate( ) und skew( ) verwenden. Am Anfang jeder Seite wird die CTM auf die Einheitsmatrix [1, 0, 0, 1, 0, 0] zurückgesetzt. Gültigkeit page, pattern, template Sub setmatrix(a As Single, b As Single, c As Single, d As Single, e As Single, f As Single) Setzt die aktuelle Transformationsmatrix explizit. a, b, c, d, e, f Siehe concat( ). Details Diese Funktion entspricht im Wesentlichen concat( ) mit dem Unterschied, dass sie die aktuelle Transformationsmatrix verwirft und vollständig durch eine neue Matrix ersetzt. Gültigkeit page, pattern, template 4.4 Grafikfunktionen 101 4.4.4 Pfadkonstruktion Tabelle 4.10 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Tabelle 4.10 Parameter und Werte für Pfadsegmentfunktionen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung get_value currentx currenty Die x- bzw. y-Koordinate (in Einheiten des aktuellen Koordinatensystems) der aktuellen Position. Geltungsbereich: page, pattern, template, path. Hinweis Achten Sie darauf, immer eine der Funktionen aus Abschnitt 4.4.5, »Zeichnen und Beschneiden von Pfaden«, Seite 104, aufzurufen, nachdem Sie die Funktionen in diesem Abschnitt verwendet haben. Sonst hat der konstruierte Pfad keinerlei Auswirkungen, und nachfolgende Operationen führen unter Umständen zu einer PDFlib-Exception. Sub moveto(x As Single, y As Single) Setzt die aktuelle Position. x, y Koordinaten der neuen aktuellen Position. Details Am Anfang jeder Seite wird die aktuelle Position auf den Standardwert undefined gesetzt. Die aktuellen Grafikpositionen sowie die aktuelle Textposition werden getrennt verwaltet. Gültigkeit page, pattern, template, path; mit dieser Funktion beginnt der Geltungsbereich path. Parameter currentx, currenty Sub lineto(x As Single, y As Single) Zeichnet eine Linie zwischen dem aktuellen und einem anderen Punkt. x, y Koordinaten des zweiten Linienendpunkts. Details Diese Funktion ergänzt den aktuellen Pfad um eine Linie zwischen der aktuellen Position 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 Parameter currentx, currenty 102 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub curveto(x1 As Single, y1 As Single, x2 As Single, y2 As Single, x3 As Single, y3 As Single) Zeichnet eine Bézier-Kurve, ausgehend von der aktuellen Position, wobei drei Kontrollpunkte berücksichtigt werden. x1, y1, x2, y2, x3, y3 Koordinaten der drei Kontrollpunkte. Details Der aktuelle Pfad wird um eine Bézier-Kurve zwischen der aktuellen Position und (x3, y3) ergänzt, wobei (x1, y1) und (x2, y2) als Kontrollpunkte dienen. Die aktuelle Position muss zuvor gesetzt worden sein. Der Endpunkt der Kurve wird zur neuen aktuellen Position. Gültigkeit path Parameter currentx, currenty Sub circle(x As Single, y As Single, r As Single) Zeichnet einen Kreis. x, y r Koordinaten des Kreismittelpunkts. Kreisradius. Details Diese Funktion ergänzt den aktuellen Pfad um einen Kreis, der einen vollständigen Teilpfad darstellt. Der Punkt (x + r, y) wird zur neuen aktuellen Position. Die resultierende Form ist, in benutzerdefinierten Koordinaten gemessen, kreisförmig. Wurde das Koordinatensystem in x- und y-Richtung unterschiedlich skaliert, ist die resultierende Kurve eine Ellipse. Visual-Basic-Benutzer müssen Abschnitt 2.2.9, »Einsatz von PDFlib mit Visual Basic«, Seite 26, berücksichtigen und die Schreibweise oPDF.[circle] verwenden. Gültigkeit page, pattern, template, path; mit dieser Funktion beginnt der Geltungsbereich path. Parameter currentx, currenty Sub arc(x As Single, y As Single, r As Single, alpha As Single, beta As Single) Zeichnet ein Kreissegment gegen den Uhrzeigersinn. x, y r Koordinaten des Mittelpunkts des Kreissegments Radius des Kreissegments. r darf nicht negativ sein. alpha, beta Anfangs- und Endwinkel des Kreissegments in Grad. Details Diese Funktion ergänzt den aktuellen Pfad um ein gegen den Uhrzeigersinn gezeichnetes Kreissegment, das bei alpha Grad beginnt und bei beta Grad endet. Sowohl bei arc( ) als auch bei arcn( ) werden die Winkel gegen den Uhrzeigersinn gemessen, und zwar ausgehend von der positiven x-Achse des aktuellen Koordinatensystem. 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 aktuellen Position. 4.4 Grafikfunktionen 103 Das Kreissegment ist, in benutzerdefinierten Koordinaten gemessen, 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; mit dieser Funktion beginnt der Geltungsbereich path. Parameter currentx, currenty Sub arcn(x As Single, y As Single, r As Single, alpha As Single, beta As Single) Wie arc( ), nur dass das Kreissegment im Uhrzeigersinn gezeichnet wird. Details Mit Ausnahme der Zeichenrichtung verhält sich diese Funktion genau wie arc( ). Beachten Sie, dass dies auch impliziert, dass die Winkel, ausgehend von der positiven x-Achse, gegen den Uhrzeigersinn gemessen werden. Sub rect(x As Single, y As Single, width As Single, height As Single) Zeichnet ein Rechteck. x, y Koordinaten der linken unteren Ecke des Rechtecks width, height Breite und Höhe des Rechtecks. 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 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. Gültigkeit page, pattern, template, path; mit dieser Funktion beginnt der Geltungsbereich path. Parameter currentx, currenty Sub closepath( ) Schließt den aktuellen Pfad. Details Diese Funktion schließt den aktuellen Teilpfad, das heißt, sie zeichnet eine Linie zwischen der aktuellen Position und dem Startpunkt des Teilpfads. Gültigkeit path Parameter currentx, currenty 4.4.5 Zeichnen und Beschneiden von Pfaden Tabelle 4.11 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Hinweis Die meisten in diesem Abschnitt beschriebenen Funktionen leeren den Pfad und lassen die aktuelle Position undefiniert. Auf diese Funktionen folgende Zeichenoperationen müssen die aktuelle Position explizit setzen (zum Beispiel mit moveto( )). 104 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.11 Parameter und Werte für die Funktionen zum Zeichnen und Beschneiden von Pfaden (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel set_parameter fillrule Erklärung 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. Sub stroke( ) Zeichnet den Pfad und leert ihn. Details Diese Funktion zeichnet den aktuellen Pfad mit der aktuellen Linienstärke und Linienfarbe. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Sub closepath_stroke( ) Schließt den Pfad und zeichnet 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. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Sub fill( ) Füllt das Pfadinnere mit der aktuellen Füllfarbe. Details Diese Funktion füllt das Innere des aktuellen Pfads mit der aktuellen Füllfarbe. Das Innere des Pfads wird durch einen von zwei Algorithmen bestimmt (siehe Parameter fillrule). Offene Pfade werden vor dem Füllen geschlossen. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Parameter fillrule Sub fill_stroke( ) Zeichnet und füllt den Pfad mit der aktuellen Zeichenfarbe und der aktuellen Füllfarbe. Details Diese Funktion zeichnet und füllt den Pfad mit der aktuellen Zeichenfarbe und der aktuellen Füllfarbe. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Parameter fillrule 4.4 Grafikfunktionen 105 Sub closepath_fill_stroke( ) Schließt, zeichnet und füllt den Pfad. 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 kompletten aktuellen Pfad. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Parameter fillrule Sub clip( ) Verwendet den aktuellen Pfad als Clipping-Pfad und schließt ihn. 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, nämlich die Seitengröße gesetzt. Der Clipping-Pfad wird vom save( )/restore( )-Mechanismus berücksichtigt. Er kann nur mittels save( )/restore( ) vergößert werden. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. Sub endpath( ) Beendet den aktuellen Pfad, ohne ihn zu zeichnen oder zu füllen. Details Diese Funktion hat keine sichtbaren Auswirkungen auf die Seite. Sie generiert einen unsichtbaren Pfad auf der Seite. Gültigkeit path; mit dieser Funktion endet der Geltungsbereich path. 4.5 Farbfunktionen Sub setcolor(type As String, colorspace as String, c1 As Single, c2 As Single, c3 As Single, c4 As Single) Setzt den aktuellen Farbraum und die aktuelle Farbe. type Einer der Werte stroke, fill oder both, die festlegen, ob die Farbe zum Zeichnen, Füllen oder für beides festgelegt wird. colorspace pattern. Festlegung des Farbraums durch einen der Werte gray, rgb, cmyk, spot oder c1, c2, c3, c4 Farbkomponenten für den ausgewählten Farbraum: > 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; 106 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) > Ist colorspace gleich spot, enthält c1 das Handle für eine Schmuckfarbe, das von 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 begin_ pattern( ) erzeugt wurde. Details Alle Farbwerte für die Farbräume gray, rgb und cmyk sowie für den Farbauftrag des Farbraums spot müssen Zahlen zwischen 0 (inklusive) und 1 (inklusive) sein. Nicht verwendete Parameter sollten auf 0 gesetzt werden. Graustufenwerte, RGB-Werte und der Farbauftrag für Schmuckfarben werden gemäß additiver Farbmischung interpretiert, das heißt, 0 bedeutet »keine Farbe« und 1 bedeutet »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) ergeben weiß. CMYK-Werte dagegen werden gemäß subtraktiver Farbmischung interpretiert, 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 Bereich 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üllmusterfarbe gibt es keine Standardwerte. Gültigkeit page, pattern (nur wenn der PaintType des Füllmusters gleich 1 ist), template, document; eine Füllmusterfarbe kann nicht innerhalb ihrer eigenen Definition verwendet werden. Die Farbe im Geltungsbereich document festzulegen, kann zur Definition von Schmuckfarben mit makespotcolor( ) sinnvoll sein. Function makespotcolor(spotname As String) As Long Erzeugt aus der aktuellen Füllfarbe eine Schmuckfarbe mit Namen. spotname Beliebiger Name für die zu definierende Schmuckfarbe. Dieser kann beliebige Zeichen enthalten, ist aber auf eine Länge von maximal 126 Bytes beschränkt. Rückgabe Ein Farbhandle, das in nachfolgenden Aufrufen von setcolor( ) im ganzen Dokument verwendet werden kann. Schmuckfarbenhandles können seitenübergreifend verwendet werden, aber nicht in anderen Dokumenten. Die Anzahl der Schmuckfarben in einem Dokument ist nicht begrenzt. Details Die Farbwerte (CMYK oder andere) der aktuellen Füllfarbe werden nur zur Bildschirmanzeige oder für den Low-End-Druck verwendet. Für den High-End-Druck (oder Farbseparationen) wird statt der CMYK-Werte der übergebene Schmuckfarbenname verwendet. Beachten Sie, dass Sie zusätzliche Software benötigen, um Farbseparationen aus PDF heraus zu erzeugen. Wurde spotname bereits in einem früheren Aufruf von makespotcolor( ) verwendet, ist der Rückgabewert wieder derselbe und gibt somit nicht die aktuelle Farbe wieder. Der spezielle Schmuckfarbenname All kann verwendet werden, um eine Farbe in allen Farbseparationen zu verwenden. Dies kann zum Beispiel bei Schnittmarken sinnvoll sein. Der Schmuckfarbenname None produziert eine Ausgabe, die auf keinem Auszug sichtbar ist. 4.5 Farbfunktionen 107 Gültigkeit page, pattern, template, document; die aktuelle Füllfarbe darf keine Schmuckfarbe und kein Füllmuster sein; Function begin_pattern(width As Single, height As Single, xstep As Single, ystep As Single, painttype As Long) As Long Beginnt mit der Definition eines Füllmusters. width, height Die Abmessungen der Boundingbox des Füllmusters in Punkt. 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 Farbspezifikation enthalten, die bei seinem Einsatz herangezogen wird; ist painttype gleich 2, darf das Füllmuster keinerlei Farbspezifikation enthalten. Stattdessen wird die aktuelle Zeichenoder Füllfarbe angewandt, wenn das Füllmuster zum Zeichnen oder Füllen benutzt wird. Rückgabe Ein Handle auf das Füllmuster, das in nachfolgenden Aufrufen von setcolor( ) innerhalb des umschließenden Geltungsbereichs document verwendet werden kann. Details Hypertextfunktionen und Funktionen zum Öffnen von Rasterbildern dürfen innerhalb einer Füllmusterdefinition nicht verwendet werden. Erlaubt sind dagegen alle Text-, Grafik- und Farbfunktionen (mit Ausnahme des Füllmusters, das gerade definiert wird). Gültigkeit document; mit dieser Funktion beginnt der Geltungsbereich pattern; diese Funktion muss immer paarweise mit end_pattern( ) auftreten. Sub end_pattern() Beendet eine Füllmusterdefinition. Gültigkeit pattern; mit dieser Funktion endet der Geltungsbereich pattern; diese Funktion muss immer paarweise mit begin_pattern( ) auftreten. Sub setgray_fill(g As Single) Sub setgray_stroke(g As Single) Sub setgray(g As Single) Veraltet; verwenden Sie stattdessen setcolor(type, "gray", g, 0, 0, 0) mit type gleich fill, stroke oder both. Sub setrgbcolor_fill(red As Single, green As Single, blue As Single) Sub setrgbcolor_stroke(red As Single, green As Single, blue As Single) Sub setrgbcolor(red As Single, green As Single, blue As Single) Veraltet; verwenden Sie stattdessen setcolor(type, "rgb", red, green, blue, 0) mit type gleich fill, stroke oder both. 108 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) 4.6 Rasterbildfunktionen Die im Folgenden beschriebenen Funktionen zum Öffnen von Rasterbildern können innerhalb oder außerhalb von Seitenbeschreibungen aufgerufen werden. Wird ein Bild außerhalb des durch begin_page( ) / end_page( ) gegebenen Kontexts geöffnet, so hat das eine etwas geringere Ausgabegröße zur Folge. Tabelle 4.12 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter und Werte. Tabelle 4.12 Parameter und Werte für die Rasterbildfunktionen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel get_value imagewidth Ermittelt die Breite (width) bzw. Höhe (height) eines Bildes in Pixeln. Der imageheight Modifizierer entspricht dem Handle des gewünschten Bilds. Geltungsbereich: page, pattern, template, document, path. Erklärung get_value resx resy Ermittelt die horizontale bzw. vertikale Auflösung eines Bilds. Der Modifizierer entspricht dem Handle des gewünschten Bilds. Geltungsbereich: page, pattern, template, document, path. Ist der Rückgabewert positiv, 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 imagewarning Dieser Parameter kann verwendet werden, um genauere Angaben darüber zu erhalten, warum ein Bild mit open_image_file( ) oder open_CCITT( ) nicht geöffnet werden konnte. Geltungsbereich: beliebig. true Beim Scheitern einer Bildfunktion wird eine nicht-fatale Exception ausgelöst und -1 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 zurück. Dieser Wert ist standardmäßig eingestellt. Function open_image_file(type As String, filename As String, stringparam As String, intparam As Long) As Long Öffnet eine Bilddatei. type Legt den Typ des Bildformats fest: png, gif, jpeg oder tiff (siehe Abschnitt 3.4.1, »Unterstützte Rasterbildformate«, Seite 71). Bei allen Parametern wird zwischen Großund Kleinschreibung unterschieden. filename Name der zu öffnenden Bilddatei. stringparam, intparam Die Parameter stringparam und intparam werden für weitere Bildattribute verwendet, die in Tabelle 4.13 aufgeführt sind. Werden diese Parameter nicht verwendet, dann muss stringparam ein Leerstring und intparam gleich 0 sein. Rückgabe Handle für das Bild, das in nachfolgenden Aufrufen von Bildfunktionen verwendet werden kann. Der Rückgabewert muss auf den Wert -1überprüft werden, der einen Fehler anzeigt. Um genauere Angaben über die Art eines bildspezifischen Problems zu erhalten (zum Beispiel falscher Dateiname, nicht unterstütztes Format, fehlerhafte Bilddaten 4.6 Rasterbildfunktionen 109 etc.), setzen Sie den Parameter imagewarning auf true (siehe Tabelle 4.12). Das zurückgegebene Bildhandle 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 type festgelegt wurde. PDFlib öffnet die Bilddatei mit dem ü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_place_image( )), die zugehörige Bilddatei ist aber bereits wieder geschlossen. Gültigkeit document, page; diese Funktion muss immer paarweise mit close_image( ) auftreten. Parameter imagewidth, imageheight, resx, resy, imagewarning Tabelle 4.13 Die Parameter stringparam und intparam von open_image_file( ) stringparam Erklärung und mögliche Werte für intparam mask Erzeugt eine Maske aus einem Bild mit 1-Bit-Pixeltiefe. Weitere Informationen hierzu sowie eine Liste der unterstützten Bildformate finden Sie in Abschnitt 3.4.5, »Bildmasken und Transparenz«, Seite 76. Es gibt zwei Anwendungsfälle für Masken (der Parameter intparam wird in diesem Fall ignoriert und muss gleich 0 sein): Maskieren eines anderen Bilds: Das zurückgegebene Bildhandle wird später beim Öffnen eines anderen Bilds verwendet und als Parameter »masked« übergeben. Platzieren eines eingefärbten transparenten Bilds: Pixelwerte von 0 im Bild werden als transparent interpretiert und die Werte von 1 werden mit der aktuellen Füllfarbe eingefärbt. masked Verwendet den in intparam übergebenen Bilddeskriptor als Maske für dieses Bild. Der Parameter intparam enthält ein Bildhandle, das von einem vorangehenden Aufruf von open_image( ) mit dem Parameter »mask« zurückgegeben und noch nicht geschlossen wurde. ignoremask Alle in der Bilddatei vorhandene Transparenzinformationen werden ignoriert. invert Bei 1-Bit-TIFF-Bildern wird schwarz und weiß invertiert. Dies dient in erster Linie als Behelfslösung bei TIFF-Bildern, die von verschiedenen Anwendungen unterschiedlich interpretiert werden. page Das Bild mit der in intparam übergebenen Nummer wird aus einer mehrseitigen Datei extrahiert. Das erste Bild hat die Nummer 1. Dieser Parameter wird nur bei mehrseitigen TIFF-Dateien unterstützt. colorize Das Bild wird mit der in intparam übergebenen Schmuckfarbe, die mit makespotcolor( ) ermittelt werden muss, eingefärbt. Das Bild muss ein Graustufenbild mit einer Farbtiefe von 1, 2, 4 oder 8 Bit in einem der Formate GIF, PNG, JPEG oder TIFF sein. Function open_CCITT(filename As String, width As Long, height As Long, BitReverse As Long, K As Long, BlackIs1 As Long) As Long Öffnet ein CCITT-Rasterbild. filename Name der zu öffnenden CCITT-Datei. width, height BitReverse tiert. Die Abmessungen des Bilds in Pixeln. Wenn gleich 1, wird in den komprimierten Daten jedes Byte bitweise inver- K CCITT-Kompressionsparameter zur Auswahl des Kodierungsverfahrens. > -1 bezeichnet G4-Kodierung. > 0 bezeichnet eindimensionale G3-Kodierung (G3-1D). 110 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) > 1 bezeichnet eine Mischung aus ein- und zweidimensionaler Kodierung (G3, 2-D), die von PDF unterstützt wird. BlackIs1 Hat dieser Parameter den Wert 1, werden 1-Bits als schwarz und 0-Bits als weiß interpretiert. Bei den meisten CCITT-Bildern wird keine Schwarz-Weiß-Invertierung verwendet, das heißt BlackIs1 = 0. Rückgabe Bildhandle, das nachfolgend in Bildfunktionen verwendet werden kann, sofern es nicht den Wert -1 hat. Da PDFlib keine CCITT-Bilder analysieren kann, müssen alle relevanten Bildparameter vom Client an open_CCITT( ) übergeben werden. Details Diese Funktion öffnet eine Bilddatei mit CCITT-G3- oder CCITT-G4-komprimierten Rasterbilddaten (jedoch nicht eine TIFF-Datei, die CCITT-komprimierte Bilddaten enthält!). Gültigkeit document, page; diese Funktion muss immer paarweise mit close_image( ) auftreten. Parameter imagewidth, imageheight, resx, resy, imagewarning Function open_image(type As String, source As String, data, length As Long, width As Long, height As Long, components As Long, bpc As Long, params As String) As Long Arbeitet mit Rasterbilddaten aus verschiedensten Datenquellen. type Legt die Art der Bilddaten oder Kompression fest: jpeg, ccitt oder raw (siehe Abschnitt 3.4.1, »Unterstützte Rasterbildformate«, Seite 71). source, data, length Der Parameter source bestimmt, woher die Bilddaten kommen. Er kann die Werte fileref, url und memory annehmen (siehe Abschnitt 3.4.4, »Bilddaten im Speicher und externe Bildreferenzen«, Seite 76). Der Zusammenhang zwischen den Parametern source, data und length wird in Tabelle 4.14 erklärt. width, height Bildgröße in Pixeln. components Die Anzahl der Farbkomponenten muss 1, 3, oder 4 sein, je nachdem, ob Graustufen, RGB- oder CMYK-Bilddaten verwendet werden. bpc Die Anzahl der Bits pro Komponente ist 1, 2, 4 oder 8. bpc muss auf 8 gesetzt werden, wenn type gleich jpeg ist, und auf 1, wenn type gleich ccitt ist. params Ist components = 1 und bpc = 1, darf params auch mask enthalten, um das Bild als Bildmaske zu verwenden. Außerdem können zusätzliche CCITT-Parameter übergeben werden (siehe unten). Rückgabe Bildhandle, das in nachfolgenden Bildfunktionen verwendet werden kann, sofern es nicht gleich -1 ist. Details Diese vielseitige Schnittstelle kann für Bilddaten in verschiedenen Formaten aus unterschiedlichen Datenquellen verwendet werden. Im Gegensatz zu open_image_file( ), das eine Bilddatei analysiert, müssen die Parameter length, width, height, components, und bpc hier vom Benutzer übergeben werden. open_image( ) analysiert die Bilddaten nicht, und der Benutzer ist selbst dafür verantwortlich, dass die übergebenen Parameter die tatsächlichen Bildeigenschaften widerspiegeln. Anderenfalls ist die generierte PDF-Ausgabe beschädigt, was von Acrobat dann unter Umständen mit der Meldung Nicht genügend Daten für ein Bild beantwortet wird. 4.6 Rasterbildfunktionen 111 Tabelle 4.14 Werte für die Parameter source, data und length von open_image( ) source data length fileref1 String2 mit einem plattformunabhängigen Dateinamen (siehe [1]) unbenutzt, sollte 0 sein url1 String2 mit einem Bild-URL gemäß RFC 17383. Der URL wird noch nicht von unbenutzt, sollte 0 PDFlib, sondern erst beim Öffnen des PDF von Acrobat interpretiert (siehe sein Abschnitt 3.4.4, »Bilddaten im Speicher und externe Bildreferenzen«, Seite 76). Dieses Feature ist rein experimenteller Natur und sollte deshalb im produktiven Einsatz nicht verwendet werden. memory Länge der Bytes mit den Binärdaten des Bildes; die Bilddaten sind gemäß des Parameters type komprimiert. Es müssen genau »length« Bytes übergeben (komprimierten) Bilddaten in Bytes werden. 1. Wird im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt. 2. data ist kein String sondern ein Byte-Array so dass die Übergabe von Dateinamen oder URLs etwas umständlich ist. 3. Der URL darf keine zusätzlichen Parameter, Query-Strings, Zugriffsschemata, Netzwerk-Logins oder Fragmentbezeichner enthalten. Ist type gleich raw, muss length gleich [width x components x bpc / 8] x height Bytes sein, wobei der Term in eckigen Klammern zur nächsten ganzen Zahl aufgerundet wird. Es muss eine genau length entsprechende Datenmenge übergeben werden. Die Bildpunkte werden in der in PostScript/PDF üblichen Reihenfolge erwartet, das heißt, von oben nach unten und von links nach rechts (sofern keine Koordinatentransformation stattgefunden hat). Die Wertigkeit der Pixelwerte entspricht der Beschreibung in Abschnitt 3.2.3, »Pfade und Farben«, Seite 43. Auch wenn bpc ungleich 8 ist, beginnt eine Pixelzeile an einer Bytegrenze. Die Farbwerte innerhalb eines Bytes müssen von links nach rechts eingetragen werden. Die Farbwerte eines Pixels sind immer gruppiert, das heißt, alle Farbwerte für das erste Pixel werden zuerst übergeben, darauf folgen alle Farbwerte für das zweite Pixel usw. Ist type auf ccitt gesetzt, werden CCITT-komprimierte Daten erwartet. In diesem Fall wird der Inhalt von params untersucht. Bei CCITT-Bildern können im params-String zwei Parameter übergeben werden, so wie es bei open_CCITT( ) beschrieben wurde: /K -1 /BlackIs1 true Für /K werden die Werte -1, 0 und 1 unterstützt, der Standardwert ist 0. Für /BlackIs1 werden true und false unterstützt, der Standardwert ist false. Die Standardwerte werden verwendet, wenn ein leerer params-String übergeben wird. BitReverse kann in diesem String nicht übergeben werden. Stattdessen gibt es eine besondere Konvention: ist length negativ, werden die Bilddaten bitweise invertiert. Wird der Parameter params nicht verwendet, muss er leer sein. Der Client ist für den Speicherplatz verantwortlich, auf den das data-Argument zeigt. Dieser Speicher kann vom Client unmittelbar nach diesem Aufruf freigegeben werden. Sie sollten keine mit Photoshop erzeugten CMYK-JPEG-Bilder mit dieser Funktion verwenden, da diese im PDF mit invertierten Farben erscheinen. Gültigkeit document, page; diese Funktion muss immer paarweise mit close_image( ) auftreten. Parameter imagewidth, imageheight, resx, resy, imagewarning 112 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub close_image(image As Long) Schließt ein Bild. Gültiges Bildhandle, das mit einer der Funktionen open_image*( ) erzeugt wur- image de. Details Diese Funktion wirkt sich nur auf die im 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 open_image*( ) geschlossen wurde. Ein mit dieser Funktion geschlossenes Bildhandle kann nicht weiter verwendet werden, da damit die interne Verknüpfung des Bilds zu PDFlib gelöst wurde. Diese Funktion darf nicht auf Bildhandles angewandt werden, die mit open_pdi_page( ) geöffnet wurden (in diesem Fall müssen Sie mit close_pdi_page( ) arbeiten). Gültigkeit document, page; diese Funktion darf nur paarweise mit einem entsprechenden Aufruf von open_image_file( ), open_CCITT( ) oder open_image( ) auftreten. Sub place_image(image As Long, x As Single, y As Single, scale As Single) Platziert ein Bild oder Template mit der linken unteren Ecke an (x, y) und skaliert es. Gültiges Bildhandle, das mit open_image*( ) oder begin_template( ) erzeugt wur- image de. x, y Koordinaten im benutzerdefinierten Koordinatensystem, an denen sich die linke untere Ecke des platzierten Bilds befinden soll. scale Skalierungsfaktor, der auf das Bild in x- und y-Richtung angewandt wird. Details Weitere Informationen über Skalierung und dpi-Berechnung einschließlich ungleichmäßiger Skalierung (unterschiedliche Skalierungsfaktoren in x- und y- Richtung) finden Sie in Abschnitt 3.4.2, »Häufig benötigte Codefragmente für Rasterbilder«, Seite 74. Gültigkeit page, pattern, template; diese Funktion kann beliebig oft auf beliebigen Seiten aufgerufen werden, solange das Bildhandle nicht mit close_image( ) geschlossen wird. Parameter inheritgstate; Es wird dringend empfohlen, diesen Parameter auf false zu setzen; Einzelheiten hierzu finden Sie in Abschnitt 3.2.4, »Templates«, Seite 44. Tabelle 4.15 Parameter zur Platzierung von Templates und PDF-Seiten (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung set_parameter inheritgstate Steuert die Übernahme (inheritance) der Grafikparameter von importierender Seite bzw. des Template oder der importierten PDF-Seite. Geltungsbereich: get_parameter beliebig. true Grafikzustandsparameter können von der importierenden Seite ins Template übernommen werden. Dies ist die Standardeinstellung. false Grafikzustandsparameter werden nie übernommen; die importierende Seite und das Template sind voneinander unabhängig. 4.6 Rasterbildfunktionen 113 Function begin_template(width As Long, height As Long) As Long Beginnt eine Template-Definition. width, height Die Größe der Boundingbox des Templates in Punkt. Rückgabe Templatehandle, das in nachfolgenden Bildfunktionen, inbesondere place_image( ), verwendet werden kann. Es wird kein Fehler zurückgegeben. Details Hypertextfunktionen 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; mit dieser Funktion beginnt der Geltungsbereich template; diese Funktion muss immer paarweise mit end_template( ) auftreten. Sub end_template( ) Beendet eine Template-Definition. Gültigkeit template; mit dieser Funktion endet der Geltungsbereich template; diese Funktion muss immer paarweise mit begin_template( ) auftreten. 4.7 Funktionen zum PDF-Import (PDI) 4.7.1 Dokument und Seite Function open_pdi(filename As String, stringparam As String, intparam As Long) As Long Öffnet ein in einer Datei vorliegendes PDF-Dokument und bereitet es zur späteren Verwendung vor. filename Name der PDF-Datei. stringparam, intparam Leerstring bzw. 0 sein. Für zukünftige Versionen reserviert; muss momentan ein Rückgabe Dokumentdeskriptor, der zur Verarbeitung einzelner Seiten des Dokuments oder zur Abfrage von Dokumenteigenschaften verwendet werden kann. Ein Rückgabewert von -1 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 Um genauere Informationen über die Art des mit dem importierten PDF zusammenhängenden Problems zu erhalten (PDF-Dateiname falsch, Format nicht unterstützt, PDF-Daten nicht korrekt etc.), setzen Sie den Parameter pdiwarning auf true. Gültigkeit document, page Parameter Siehe Tabelle 4.16 und Tabelle 4.17. 114 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub close_pdi(doc As Long) Schließt alle geöffneten PDI-Seitenhandle sowie das PDF-Importdokument. doc Gültiges PDF-Dokumenthandle, das mit open_pdi*( ) erzeugt wurde. Details Diese Funktion schließt ein PDF-Importdokument und gibt alle Ressourcen frei, die sich auf das Dokument beziehen. Alle unter Umständen offenen Dokumentseiten werden geschlossen. Das Dokumenthandle darf nach Aufruf dieser Funktion nicht mehr benutzt werden. 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. Gültigkeit document, page Parameter Siehe Tabelle 4.16 und Tabelle 4.17. Function open_pdi_page(doc As Long, pagenumber As Long, pagelabel As String) As Long Bereitet eine Seite zur späteren Verwendung mit place_pdi_page( ) vor. doc Gültiges Dokumenthandle, das mit open_pdi*( ) erzeugt wurde. pagenumber pagelabel Nummer der zu öffnenden Seite. Die erste Seite hat die Seitennummer 1. Reserviert; muss momentan ein Leerstring sein. Rückgabe Seitendeskriptor, der zur Platzierung von Seiten mit place_image( ) verwendet werden kann. Ein Rückgabewert von -1 zeigt an, dass die Seite nicht geöffnet werden konnte. Der Rückgabewert kann bis zum Ende des umgebenden Geltungsbereichs document verwendet werden. Details Um genauere 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. 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. Das mehrmalige Öffnen einer Seite ist nicht empfehlenswert, da sämtliche Seitendaten dann auch mehrmals ins Ausgabedokument übernommen werden. Gültigkeit document, page Parameter Siehe Tabelle 4.16 und Tabelle 4.17. Siehe auch PDF_place_pdi_page( ) Sub close_pdi_page(page As Long) Schließt das Seitenhandle und gibt alle Ressourcen frei, die sich auf die Seite beziehen. page Gültiges PDF-Seitenhandle (keine Seitennummer!), das mit open_pdi_page( ) erzeugt wurde. 4.7 Funktionen zum PDF-Import (PDI) 115 Details Diese Funktion schließt die Seite, die mit dem Seitenhandle page verknüpft ist, und gibt alle zugehörigen Ressourcen frei. page darf nach diesem Aufruf nicht mehr verwendet werden. Gültigkeit document, page Parameter Siehe Tabelle 4.16 und Tabelle 4.17. Sub place_pdi_page(page As Long, x As Single, y As Single, sx As Single, sy As Single) Platziert eine PDF-Seite mit der linken unteren Ecke an der Position (x, y) und skaliert sie. page Gültiges PDF-Seitenhandle (keine Seitennummer!), das mit open_pdi_page( ) erzeugt wurde. Das Seitenhandle darf nicht bereits wieder geschlossen sein. x, y Die Koordinaten im benutzerdefinierten Koordinatensystem, an denen die linke untere Ecke der Seite platziert werden soll. sx, sy Der horizontale und der vertikale Skalierungsfaktor, die auf die Seite angewandt werden sollen. Details Diese Funktion entspricht im Wesentlichen place_image( ), arbeitet aber mit importierten PDF-Seiten. Ein weiterer Unterschied besteht darin, dass an place_image( ) nur ein einziger Skalierungsfaktor übergeben werden kann, während bei dieser Funktion eine in x- und y-Richtung unabhängige Skalierung möglich ist. Gültigkeit page, pattern, template Parameter Siehe Tabelle 4.15, Tabelle 4.16 und Tabelle 4.17. 4.7.2 Parameterbehandlung Function get_pdi_value(key As String, doc As Long, page As Long, index As Long) As Single Ermittelt einen numerischen PDI-Dokumentparameter. key Name (Schlüssel) des zu ermittelnden Parameters, siehe Tabelle 4.16 und Tabelle 4.17. doc Gültiges PDF-Dokumenthandle, das von open_pdi( ) erzeugt wurde. page Gültiges PDF-Seitenhandle (keine Seitennummer!), das von open_pdi_page( ) erzeugt wurde. Bei nicht seitenspezifischen Schlüsseln muss page gleich -1 sein. index Derzeit nicht benutzt, muss 0 sein. Rückgabe Numerischer Wert, der aus dem Dokument ermittelt wird. Gültigkeit beliebig 116 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.16 Seitenspezifische Werte beim PDF-Import Funktion Schlüssel Erklärung get_pdi_value width height Ermittelt die Breite (width) oder Höhe (height) einer importierten Seite in Standardeinheiten. Beschneidung und Drehung werden berücksichtigt. get_pdi_value /Rotate Seitendrehung in Grad (0, 90, 180 oder 270) get_pdi_value /CropBox, /BleedBox, /ArtBox, /TrimBox Fragt einen der Box-Parameter der Seite ab. Dem Parameternamen muss ein Schrägstrich ’/’ und einer der Strings llx, lly, urx oder ury folgen, zum Beispiel: /CropBox/llx. (Einzelheiten hierzu finden Sie in Abschnitt 3.2.2, »Begrenzungen für Seiten und Koordinaten«, Seite 42.) Beachten Sie, dass der Schlüssel /Rotate in diesen Werten nicht berücksichtigt ist. Im Gegensatz dazu enthalten die Werte für width und height bereits jegliche Drehung, die auf die Seite angewandt worden wurde. Function get_pdi_parameter( key As String, doc As Long, page As Long, index As Long) As String Ermittelt einen PDI-Dokumentparameter vom Typ String. key Legt den Namen (Schlüssel) des zu ermittelnden Parameters fest, siehe Tabelle 4.16 und Tabelle 4.17. doc Gültiges PDF-Dokumenthandle, das von open_pdi( ) erzeugt wurde. page Gültiges PDF-Seitenhandle (keine Seitennummer!), das von open_pdi_page( ) erzeugt wurde. Bei nicht seitenspezifischen Schlüsseln muss page gleich -1 sein. index Derzeit nicht benutzt, muss 0 sein. Rückgabe String-Parameter, der aus dem Dokument ermittelt wurde. Unicode-Infostrings (/Info/ <key>) werden mit einleitendem BOM und abschließender Doppelnull zurückgegeben. Derzeit erzeugt PDFlib kein Unicode-String-Objekt aus Dokumentinfo-Keys, die Unicode-Zeichen enthalten. 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 4.17 zeigt sinnvolle Parameterkombinationen. Gültigkeit beliebig Tabelle 4.17 Dokumentspezifische Parameter und Werte zum PDF-Import. Der Parameter page muss -1 sein. Funktion Schlüssel Erklärung get_parameter pdi Gibt den String true zurück, wenn die PDI-Bibliothek installiert ist (und nicht im Demo-Modus läuft), anderenfalls false. Geltungsbereich: beliebig, null. get_pdi_value /Root/Pages/Count Anzahl der Seiten im importierten Dokument get_pdi_parameter filename Name der PDF-Datei get_pdi_parameter /Info/<Schlüssel> Ermittelt den String-Wert eines Schlüssels im Info-Dictionary des Dokuments, zum Beispiel /Info/Title. Der String wird nicht konvertiert. Kann der Schlüssel im Dokument nicht gefunden werden, wird ein Leerstring zurückgegeben. Ist pdiwarning auf true gesetzt, wird dagegen eine Exception ausgelöst. 4.7 Funktionen zum PDF-Import (PDI) 117 Tabelle 4.17 Dokumentspezifische Parameter und Werte zum PDF-Import. Der Parameter page muss -1 sein. Funktion Schlüssel Erklärung get_pdi_value version PDF-Versionsnummer, die mit 10 multipliziert wird, zum Beispiel 13 für PDF 1.3 set_parameter pdiwarning Anhand dieses Parameters erhalten Sie genauere Informationen darüber, warum ein PDF-Dokument oder eine Seite nicht geöffnet werden konnten: true Eine nicht-fatale Exception wird ausgelöst, wenn die PDI-Funktion scheitert. Der mit der Exception gelieferte Text kann bei der Behebung von import-spezifischen Problemen behilflich sein. false Beim Scheitern einer PDI-Funktion wird keine Exception ausgelöst. Stattdessen gibt die Funktion im Fehlerfall -1 zurück. Dies ist die Standardeinstellung. set_parameter pdistrict Mit diesem Parameter lässt sich das Verhalten von PDI bei beschädigten Dateien steuern: true Bei nicht-konformen PDF-Dokumenten wird eine nichtfatale Exception ausgelöst, sofern der Parameter warning nicht auf false gesetzt ist. false Bestimmte Arten von beschädigten PDF-Dokumenten werden akzeptiert. Dies ist die Standardeinstellung. set_parameter pdiusebox Dieser Parameter bestimmt, welcher der folgenden Box-Angaben zur Ermittlung der Größe einer importierten Seite verwendet wird (Standardeinstellung ist 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 Der Parameter pdiusebox muss vor dem Aufruf von open_pdi_ page( ) gesetzt werden. 4.8 Hypertextfunktionen 4.8.1 Aktion und Modus beim Öffnen des Dokuments Tabelle 4.18 enthält eine Übersicht aller in diesem Abschnitt relevanten Parameter und Werte. Diese Parameter können vor dem Aufruf von close( ) jederzeit gesetzt werden. 4.8.2 Lesezeichen Tabelle 4.19 enthält eine Übersicht aller in diesem Abschnitt relevanten Parameter. Hinweis Beim Hinzufügen von Lesezeichen wird der Öffnen-Modus (openmode) auf den Wert bookmarks gesetzt (siehe Abschnitt 4.8.1, »Aktion und Modus beim Öffnen des Dokuments«, Seite 118), sofern nicht explizit ein anderer Modus gesetzt wurde. Function add_bookmark(text As String, parent As Long, open As Long) As Long Fügt ein neues Lesezeichen ein, das unter parent oder auf oberster Ebene platziert wird. text Enthält den Text des Lesezeichens. Dieser kann in PDFDocEncoding oder Unicode kodiert sein. Die maximale Länge von text beträgt 255 Zeichen in PDFDocEncoding bzw. 118 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.18 Parameter für Aktion und Modus beim Öffnen des Dokuments (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung set_parameter openaction Legt die Aktion beim Öffnen des Dokuments fest, das heißt den Zoomfaktor für die erste Dokumentseite. Mögliche Werte sind retain, fitpage, fitwidth, fitheight, fitbbox (siehe Tabelle 4.25). Standardeinstellung ist retain. Geltungsbereich: page, pattern, template, document. set_parameter openmode Legt das Aussehen beim Öffnen des Dokuments fest. Standardeinstellung ist bookmarks, sofern das Dokument Lesezeichen enthält, andernfalls none. Geltungsbereich: page, pattern, template, document. none Weder Lesezeichen noch Piktogramme werden eingeblendet. bookmarks Öffnet das Dokument mit eingeblendeten Lesezeichen. thumbnails Öffnet das Dokument mit eingeblendeten Piktogrammen. fullscreen Öffnet das Dokument im Vollbildmodus (funktioniert im Browser nicht). Tabelle 4.19 Parameter für Lesezeichen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel set_parameter bookmarkdest Erklärung Legt fest, in welcher Vergrößerung die Zielseite des nachfolgend generierten Lesezeichens angezeigt wird. Mögliche Werte sind retain, fitpage, fitwidth, fitheight, fitbbox (siehe Tabelle 4.25). Dieser Parameter kann beliebig oft geändert werden. Standardeinstellung ist retain. 126 Zeichen in Unicode. Aus praktischen Gründen sollte text jedoch nicht mehr als 32 Zeichen umfassen. parent Wenn parent ein gültiges Lesezeichenhandle enthält, das von einem vorangehenden Aufruf von add_bookmark( ) zurückgegeben wurde, dann wird ein neues dem übergebenen Handle untergeordnetes Lesezeichen angelegt. Auf diese Art lassen sich beliebig verschachtelte Lesezeichenhierarchien erzeugen. Ist parent = 0, dann wird das neue Lesezeichen auf oberster Ebene angelegt. open Ist open gleich 0, dann sind untergeordnete Lesezeichen ausgeblendet. Ist open = 1, ist die gesamte Lesezeichenhierarchie sichtbar. Die Zielseite des Lesezeichens wird in der aktuell eingestellten Vergrößerung angezeigt, die sich über den Parameter bookmarkdest einstellen lässt (siehe Tabelle 4.19). Rückgabe Handle für das gerade erzeugte Lesezeichen. Dieses Handle kann in nachfolgenden Aufrufen als Parameter parent verwendet werden. Details Diese Funktion fügt ein PDF-Lesezeichen ein, das den übergebenen text enthält und auf die aktuelle Seite zeigt. Der Zoomfaktor kann mit dem Parameter bookmarkdest gesteuert werden. Gültigkeit page Parameter openmode, bookmarkdest 4.8 Hypertextfunktionen 119 4.8.3 Dokumentinfofelder Sub set_info(key As String, value As String) Trägt value in das Dokumentinfofeld key ein. key Der Parameter key muss in PDFDocEncoding kodiert sein. key kann einen der Namen der fünf Standardinfofelder enthalten oder den Namen eines benutzerdefinierten Feldes, der beliebig gewählt sein kann (siehe Tabelle 4.20). Die Anzahl der benutzerdefinierten Felder ist nicht beschränkt. Wenn Sie mit benutzerdefinierten Dokumentinfofeldern arbeiten, empfehlen wir einen Blick auf den Dublin Core Metadata Elementset.1 Tabelle 4.20 Werte für den Dokumentinfofeldschlüssel Schlüssel Erklärung Subject Thema des Dokuments Title Titel des Dokuments Creator Programm, mit dem das Dokument erstellt wurde Author Verfasser des Dokuments Keywords Stichwörter für das Dokument Trapped Gibt an, ob die Datei Überfüllungsinformationen enthält. Erlaubt sind die Werte True, False und Unknown. Beliebiger Name außer CreationDate, Producer und ModDate Benutzerdefiniertes Feld. PDFlib unterstützt beliebig viele Felder, deren Namen aus allen druckbaren Zeichen außer den folgenden bestehen können: Leerzeichen ’ ’, %, (, ), <, >, [, ], {, }, / und #. value String, der dem Parameter key zugewiesen wird. Er kann in PDFDocEncoding oder Unicode kodiert sein. Durch Acrobat ist die Länge von value auf maximal 255 Bytes beschränkt. Gültigkeit document, page 4.8.4 Seitenübergänge In PDF-Dateien kann für besondere Effekte ein Seitenübergang festgelegt werden, der in Präsentationen genutzt werden kann. In Acrobat lassen sich solche Effekte nicht generell für das gesamte Dokument oder einzelne Seiten festlegen, sondern Sie können nur im Vollbildmodus genutzt werden. Mit PDFlib dagegen kann die Art und Dauer eines Seitenübergangs für jede Seite einzeln gesetzt werden. Tabelle 4.21 enthält eine Übersicht über die in diesem Abschnitt relevanten Parameter und Werte. 1. Siehe http://purl.org/DC 120 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.21 Parameter und Werte für Seitenübergänge (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel Erklärung set_parameter transition Bestimmt den Seitenübergang für die aktuelle und nachfolgende Seiten, der solange gilt, bis ein anderer Übergangseffekt eingestellt wird. Es werden alle unten angeführten Übergangstypen unterstützt. Ist type leer, dann wird der Seitenübergang zurückgesetzt. Standardeinstellung ist replace. Geltungsbereich: beliebig. split Die Seite wird wie ein Vorhang aufgezogen und gibt die nächste Seite frei. blinds Split-Effekt mit mehreren Linien, die den Eindruck einer Jalousie erwecken box Ein Rechteck vergrößert sich und legt die neue Seite frei. wipe Eine einzelne Linie wischt über die alte Seite und legt dabei die neue frei. dissolve Die alte Seite löst sich mosaikartig auf und legt dabei die neue frei. glitter Wie bei dissolve, nur sind die Mosaiksteinchen nicht gleichmäßig verteilt, sondern bewegen sich von einer Bildschirmseite zur gegenüberliegenden. replace Die neue Seite ersetzt die alte ohne Übergangseffekt. (Dies ist die Standardeinstellung.) set_value Legt fest, wie lange (in Sekunden) die aktuelle Seite angezeigt wird. Standardeinstellung ist eine Sekunde. Geltungsbereich: beliebig duration 4.8.5 Dateianlagen Sub attach_file(llx As Single, lly As Single, urx As Single, ury As Single, filename As String, description As String, author As String, mimetype As String, icon As String) Fügt einen Kommentar in Form einer Dateianlage hinzu. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Kommentarrechtecks im Standardkoordinatensystem. filename Name der Datei, die in das PDF-Dokument eingebettet werden soll. description String mit einer Erklärung zur Dateianlage. Er kann in PDFDocEncoding oder Unicode kodiert sein. author String mit dem Namen oder der Funktion des Verfassers. Er kann in PDFDocEncoding oder Unicode kodiert sein. mimetype MIME-Typ der Datei. Anhand dieses Typs entscheidet Acrobat, welches Programm bei Aktivierung der Dateianlage gestartet wird. icon Definiert, auf welche Art die ungeöffnete Dateianlage in Acrobat angezeigt wird (siehe Tabelle 4.22). Tabelle 4.22 Symbolnamen für Dateianlagen Symbolname Symbolform Symbolname graph pushpin paperclip tag Symbolform 4.8 Hypertextfunktionen 121 Details Diese Funktion fügt einen Kommentar in Form einer Dateianlage an dem festgelegten Rechteck ein. PDF-Dateianlagen werden erst ab Acrobat 4 unterstützt und sind damit in PDFlib im Kompatibilitätsmodus für Acrobat 3 nicht verfügbar. Außerdem können Dateianlagen im Acrobat Reader nicht verarbeitet werden, dort wird einfach ein Fragezeichen angezeigt. Dateianlagen können nur mit der Acrobat-Vollversion verwendet werden. Die Farbe des Symbols, mit der die Dateianlage angezeigt wird, lässt sich mit set_ border_color() einstellen. Gültigkeit page 4.8.6 Notizen Hinweis Die Koordinatenübergabe für Kommentare unterscheidet sich von den Parametern der Funktion rect( ). Alle Kommentarfunktionen erwarten Parameter für die beiden Ecken, während bei rect( ) die Koordinaten für eine Ecke sowie Breite und Höhe übergeben werden. Sub add_note(llx As Single, lly As Single, urx As Single, ury As Single, contents As String, title As String, icon As String, open As Long) Fügt eine Notiz ein. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Notizrechtecks in Standardkoordinaten (und nicht in möglicherweise transformierten Benutzerkoordinaten!). Acrobat positioniert die linke obere Ecke des Symbols an der linken oberen Ecke des festgelegten Rechtecks. contents Textinhalt der Notiz. Er kann in PDFDocEncoding oder Unicode kodiert sein. Die maximale Länge von contents beträgt 65535 Bytes. title Überschrift der Notiz. Sie kann in PDFDocEncoding oder Unicode kodiert sein. Die maximale Länge von title beträgt 255 Zeichen für PDFDocEncoding und 126 Zeichen für Unicode. Aus praktischen Gründen sollte title nicht länger als 32 Zeichen sein. icon Definiert, auf welche Art die ungeöffnete Notiz in Acrobat angezeigt wird (siehe Tabelle 4.23). open Die Notiz erscheint geöffnet, wenn open = 1, und geschlossen, wenn open = 0. Details Diese Funktion fügt eine Notiz mit dem festgelegten Rechteck ein. Da erst Acrobat 4 unterschiedliche Symbole für Notizen bietet, werden sie im Kompatibilitätsmodus für Acrobat 3 nicht unterstützt (der Parameter icon muss dann leer sein). Acrobat-3-Viewer (und offensichtlich auch Unix-Versionen von Acrobat 4) zeigen unabhängig vom übergebenen Parameter icon immer das Textnotiz-Symbol (note) an. Die Farbe des Symbols, mit der die Notiz angezeigt wird, lässt sich mit set_border_ color() einstellen. Gültigkeit page 4.8.7 Verknüpfungen (Links) Tabelle 4.24 enthält eine Übersicht aller für diesen Abschnitt relevanten Parameter. Hinweis PDF unterstützt nur Verknüpfungen mit rechteckiger Form. 122 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Tabelle 4.23 Symbolnamen für Notizen Symbolname Symbolform Symbolname comment newparagraph insert key note help Symbolform paragraph Tabelle 4.24 Parameter für Verknüpfungen (siehe Abschnitt 4.2.3, »Parameterbehandlung«, Seite 89) Funktion Schlüssel set_parameter base Erklärung Definiert den Basis-URL des Dokuments. Dies ist sinnvoll, wenn ein Dokument, das relative Webverknüpfungen auf andere Dokumente enthält, an einen anderen Ort verschoben wird. Verweist der Basis-URL auf den »alten« Ort, ist sichergestellt, dass relative Verknüpfungen auch weiterhin funktionieren. Geltungsbereich: page, pattern, template, document. Sub add_pdflink(llx As Single, lly As Single, urx As Single, ury As Single, filename As String, page As Long, dest As String) Fügt eine Verknüpfung auf eine bestimmte Seite einer PDF-Datei ein. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Verknüpfungsrechtecks in Standardkoordinaten (und nicht in eventuell transformierten Benutzerkoordinaten!). filename page Name der PDF-Zieldatei. Physikalische Seitennummer der Zielseite. dest Vergrößerung der Zielseite, wobei einer der in Tabelle 4.25 angeführten Werte verwendet werden kann. Gültigkeit page Sub add_locallink(llx As Single, lly As Single, urx As Single, ury As Single, page As Long, dest As String) Fügt eine Verknüpfung auf eine Zielseite im aktuellen PDF-Dokument hinzu. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Verknüpfungsrechtecks in Standardkoordinaten (und nicht in eventuell transformierten Benutzerkoordinaten!). page Physikalische Seitennummer der Zielseite. Dies kann eine bereits generierte Seite oder eine Seite im selben Dokument sein, die erst später (nach der aktuellen Seite) ge- 4.8 Hypertextfunktionen 123 neriert wird. Die Anwendung muss sicherstellen, dass die Zielseite auch tatsächlich generiert wird; anderenfalls gibt PDFlib eine Warnung aus. dest Legt die Vergrößerung der Zielseite fest, wobei einer der in Tabelle 4.25 angeführten Werte verwendet werden kann. Gültigkeit page Tabelle 4.25 Werte für den Parameter dest in add_pdflink( ) und add_locallink( ). Dieselben Werte werden auch beim Parameter openaction verwendet (siehe Abschnitt 4.8.1, »Aktion und Modus beim Öffnen des Dokuments«, Seite 118) sowie beim Parameter bookmarkdest (siehe Abschnitt 4.8.2, »Lesezeichen«, Seite 118). dest Erklärung retain Übernimmt den bei Aktivierung der Verknüpfung aktuellen Zoomfaktor. fitpage Die ganze Seite wird im Fenster angezeigt. fitwidth Die Seitenbreite wird an die Fensterbreite angepasst. fitheight Die Seitenhöhe wird an die Fensterhöhe angepasst. fitbbox Passt die Boundingbox der Seite (das kleinste Rechteck, das alle Objekte umfasst) in das Fenster ein. Sub add_launchlink(llx As Single, lly As Single, urx As Single, ury As Single, filename As String) Fügt eine Verknüpfung auf eine Datei beliebigen Typs ein. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Verknüpfungsrechtecks in Standardkoordinaten (und nicht in eventuell transformierten Benutzerkoordinaten!). filename tet wird. Name der Datei, die beim Anklicken der Verknüpfung geöffnet oder gestar- Gültigkeit page Sub add_weblink(llx As Single, lly As Single, urx As Single, ury As Single, url As String) Fügt eine Verknüpfung auf einen URL im Web ein. llx, lly, urx, ury x- und y-Koordinaten der linken unteren und der rechten oberen Ecke des Verknüpfungsrechtecks in Standardkoordinaten (und nicht in eventuell transformierten Benutzerkoordinaten!). url Ein Uniform Resource Identifier (Locator), der in 7-Bit ASCII kodiert ist und das Verknüpfungsziel festlegt. Er kann auf eine beliebige Ressource (im Web oder lokal) verweisen. Gültigkeit page Parameter Die Parameter textx/texty, currentx/currenty und imagewidth/imageheight können verwendet werden, um Positionsdaten zur Größenberechnung von Verknüpfungsrechtecken zu ermitteln. 124 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) Sub set_border_style(style As String, width As Single) Legt fest, wie der Rechteckrand dargestellt wird. Diese Einstellung bezieht sich auf alle Arten von Verknüpfungen. style Legt den Darstellungsstil des Rechteckrands fest. Er muss auf solid (durchgehend) oder dashed (unterbrochen) gesetzt werden. width Bestimmt die Breite des Rechteckrands in Punkten. Bei width = 0 ist der Rechteckrand unsichtbar. Details Die mit dieser Funktion vorgenommenen Einstellungen werden solange auf alle Arten von Verknüpfungen angewandt, bis ein neuer Stil festgelegt wird. Zu Beginn eines Dokuments wird die Darstellung des Rechteckrands auf die Standardeinstellung solid und 1 gesetzt. Gültigkeit document, page Sub set_border_color(red As Single, green As Single, blue As Single) Legt fest, in welcher Farbe der Rechteckrand dargestellt wird. Diese Einstellung bezieht sich auf Verknüpfungen, Notizen und Dateinanlagen (annotations). red, green, blue RGB-Farbwerte für den Rechteckrand. Details Die mit dieser Funktion vorgenommene Einstellung wird so lange auf alle Arten von Verknüpfungen angewandt, bis eine neue Farbe festgelegt wird. Zu Beginn eines Dokuments wird die Farbe für den Rechteckrand auf schwarz (0, 0, 0) gesetzt. Gültigkeit document, page Sub set_border_dash(b As Single, w As Single) Legt fest, auf welche Art die Linie des Rechteckrandes unterbrochen dargestellt wird. Diese Einstellung bezieht sich auf alle Arten von Verknüpfungen. b, w Legt die Art der unterbrochenen Randlinie fest (siehe setdash( )). Details Zu Beginn eines Dokuments wird die Art der unterbrochenen Randlinie auf die Standardeinstellung (3, 3) gesetzt. Diese Einstellung wird nur verwendet, wenn der Stil des Rechteckrandes explizit auf dashed gesetzt wird. Gültigkeit document, page 4.8.8 Piktogramme (Thumbnails) Sub add_thumbnail(image As Long) Fügt ein vorhandenes Rasterbild als Piktogramm (Thumbnail) für die aktuelle Seite ein. image Gültiges Bildhandle, das von einer der Funktionen open_image*( ) zurückgegeben wurde, aber kein Handle auf eine PDF-Seite oder ein Template. 4.8 Hypertextfunktionen 125 Details Diese Funktion fügt das übergebene Bild als Piktogrammbild für die aktuelle Seite ein. Damit 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 Piktogramm nur aus einem einzigen PDF-Bildobjekt bestehen darf. Multi-strip TIFF-Bilder werden jedoch in mehrere PDF-Bildobjekte konvertiert (siehe Abschnitt 3.4.1, »Unterstützte Rasterbildformate«, Seite 71). Diese Funktion erzeugt keine Piktogramme für die Seiten, sondern bietet lediglich die Möglichkeit, bereits vorhandene Bilder hinzuzufügen, die gegebenenfalls als Piktogramme verwendet werden. Die tatsächlichen Miniaturseiten müssen vom Client oder einer anderen Anwendung erstellt werden. Der Client muss dabei sicherstellen, dass die Farben, das Seitenverhältnis sowie der tatsächliche Inhalt eines Piktogramms zum entsprechenden Seiteninhalt passen. Da Acrobat 5 Piktogramme dynamisch generiert (wenngleich nicht im Browser) und die generierte PDF-Datei durch Piktogramme 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 entsprechende Piktogramme. Parameter openmode 4.9 Seitenformate Zum schnellen Nachschlagen enthält Tabelle 4.26 übliche Seitenformate1. Tabelle 4.26 Übliche Seitenmaße in Punkt Format Breite Höhe Format Breite Höhe Format Breite Höhe A0 2380 3368 A4 595 842 letter 612 792 1008 A1 1684 2380 A5 421 595 legal 612 A2 1190 1684 A6 297 421 ledger 1224 792 A3 842 1190 B5 501 709 11 x 17 792 1224 1. Weitere Informationen über ISO-Formate, japanische Formate und US-Standardformate finden Sie unter folgenden URLs: http://www.twics.com/~eds/paper/papersize.html, http://www.cl.cam.ac.uk/~mgk25/iso-paper.html 126 Kapitel 4: PDFlib- und PDI-API-Referenz (ActiveX/COM- und .NET-Edition) 5 Die PDFlib-Lizenz PDFlib ist unter zwei Lizenzmodellen verfügbar, die sich grundsätzlich voneinander unterscheiden und damit die Interessen verschiedener Entwicklergruppen berücksichtigen. Lesen Sie die kurzen Zusammenfassungen bitte aufmerksam durch, damit Sie entscheiden können, welche Variante sich für Ihre Zwecke am besten eignet. 5.1 Die »Aladdin Free Public License« (Dieser Abschnitt ist in der vorliegenden Ausgabe nicht enthalten, da er hier nicht von Bedeutung ist.) 5.2 Die kommerzielle PDFlib-Lizenz Es gibt verschiedene Lizenzierungsmöglichkeiten für den Einsatz von PDFlib auf einem oder mehreren Servern und für die Weitergabe von PDFlib in eigenen Produkten. Außerdem bieten wir Wartungs- und Supportverträge. Einzelheiten zur Lizenzierung sowie das PDFlib-Bestellformular finden Sie in der PDFlib-Distribution. Bitte wenden Sie sich an uns, wenn Sie Fragen haben oder eine kommerzielle PDFlib-Lizenz beziehen möchten: PDFlib GmbH Tal 40, 80331 München http://www.pdflib.com Tel. +49 • 89 • 29 16 46 87 Fax +49 • 89 • 29 16 46 86 Vertriebsinformationen: [email protected] Support für PDFlib-Lizenznehmer: [email protected] (Lizenznummer angeben) Für anderweitige Auskünfte können Sie unsere Mailing-Liste durchsehen: http://groups.yahoo.com/group/pdflib. 5.1 Die »Aladdin Free Public License« 127 6 Literaturhinweise [1] Adobe Systems Incorporated: PDF Reference, Third Edition: Version 1.4; Verlag Addison-Wesley 2001, ISBN 0-201-75839-3; auch als PDF-Dokument erhältlich unter http://partners.adobe.com/asn/developer/technotes.html [2] Adobe Systems Incorporated: PostScript Language Reference Manual, Third Edition. Verlag Addison-Wesley 1999, ISBN 0-201-37922-8; auch als PDF-Dokument erhältlich unter: http://partners.adobe.com/asn/developer/technotes.html [3] Das folgende Buch vom Hauptentwickler von PDFlib behandelt zahlreiche Themen zu PostScript, PDF und Schriften. Sie erhalten es versandkostenfrei direkt bei PDFlib GmbH und in jeder Buchhandlung: Thomas Merz, Olaf Drümmer: Die PostScript- & PDF-Bibel. Zweite Auflage. ISBN 3-935320-01-9, PDFlib Edition 2002 PDFlib GmbH, 80331 München, Tal 40, Fax +49 • 89 • 29 16 46 86 http://www.pdflib.com, [email protected] 128 Kapitel 6: Literaturhinweise (ActiveX/COM- und .NET-Edition) A Dynamische Bibliotheken (DLLs) (Dieser Abschnitt ist in der vorliegenden Ausgabe des PDFlib-Handbuchs nicht enthalten.) A Dynamische Bibliotheken (DLLs) 129 B PDFlib-Kurzreferenz Allgemeine Funktionen Funktionsprototyp Seite Function open_file(filename As String) As Long 87 Function get_buffer( ) 88 Sub close( ) 88 Sub begin_page(width As Single, height As Single) 88 Sub end_page( ) 89 Function get_value(key As String, modifier As Single) As Single 89 Sub set_value(key As String, value As Single) 89 Function get_parameter(key As String, modifier As Single) As String 90 Sub set_parameter(key As String, value As String) 90 Textfunktionen Funktionsprototyp Function findfont(fontname As String, encoding As String, options As Long) As Long Seite 91 Sub setfont(font As Long, fontsize As Single) 92 Sub show(text As String) 94 Sub show_xy(text As String, x As Single, y As Single) 94 Sub continue_text(text As String) 94 Function show_boxed(text As String, x As Single, y As Single, width As Single, height As Single, mode As String, feature As String) As Long 95 Function stringwidth(text As String, font As Long, size As Single) As Single 96 Sub set_text_pos(x As Single, y As Single) 92 Grafikfunktionen Funktionsprototyp 130 Seite Sub setdash(b As Single, w As Single) 96 Sub setpolydash(darray) 97 Sub setflat(flatness As Single) 97 Sub setlinejoin(linejoin As Long) 97 Sub setlinecap(linecap As Long) 98 Sub setmiterlimit(miter As Single) 98 Sub setlinewidth(width As Single) 98 Sub save( ) 99 Sub restore( ) 100 Sub translate(tx As Single, ty As Single) 100 Sub scale(sx As Single, sy As Single) 100 Sub rotate(phi As Single) 100 Sub skew(alpha As Single, beta As Single) 101 Sub concat(a As Single, b As Single, c As Single, d As Single, e As Single, f As Single) 101 Kapitel B: PDFlib-Kurzreferenz (ActiveX/COM- und .NET-Edition) Funktionsprototyp Seite Sub moveto(x As Single, y As Single) 102 Sub lineto(x As Single, y As Single) 102 Sub curveto(x1 As Single, y1 As Single, x2 As Single, y2 As Single, x3 As Single, y3 As Single) 103 Sub circle(x As Single, y As Single, r As Single) 103 Sub arc(x As Single, y As Single, r As Single, alpha As Single, beta As Single) 103 Sub arcn(x As Single, y As Single, r As Single, alpha As Single, beta As Single) 104 Sub rect(x As Single, y As Single, width As Single, height As Single) 104 Sub closepath( ) 104 Sub stroke( ) 105 Sub closepath_stroke( ) 105 Sub fill( ) 105 Sub fill_stroke( ) 105 Sub closepath_fill_stroke( ) 106 Sub clip( ) 106 Sub endpath( ) 106 Farbfunktionen Funktionsprototyp Seite Sub setcolor(type As String, colorspace as String, c1 As Single, c2 As Single, c3 As Single, c4 As Single) 106 Function makespotcolor(spotname As String) As Long 107 Function begin_pattern(width As Single, height As Single, xstep As Single, ystep As Single, painttype As Long) As Long 108 Sub end_pattern() 108 Rasterbildfunktionen Funktionsprototyp Seite Function open_image_file(type As String, filename As String, stringparam As String, intparam As Long) As Long 109 Function open_CCITT(filename As String, width As Long, height As Long, BitReverse As Long, K As Long, BlackIs1 As Long) As Long 110 Function open_image(type As String, source As String, data, length As Long, width As Long, height As Long, components As Long, bpc As Long, params As String) As Long 111 Sub close_image(image As Long) 113 Sub place_image(image As Long, x As Single, y As Single, scale As Single) 113 Function begin_template(width As Long, height As Long) As Long 114 Sub end_template( ) 114 B PDFlib-Kurzreferenz 131 Funktionen für den PDF-Import (PDI) Funktionsprototyp Seite Function open_pdi(filename As String, stringparam As String, intparam As Long) As Long 114 Sub close_pdi(doc As Long) 115 Function open_pdi_page(doc As Long, pagenumber As Long, pagelabel As String) As Long 115 Sub close_pdi_page(page As Long) 115 Sub place_pdi_page(page As Long, x As Single, y As Single, sx As Single, sy As Single) 116 Function get_pdi_value(key As String, doc As Long, page As Long, index As Long) As Single 116 Function get_pdi_parameter( key As String, doc As Long, page As Long, index As Long) As String 117 Hypertextfunktionen Funktionsprototyp Seite Function add_bookmark(text As String, parent As Long, open As Long) As Long 118 Sub set_info(key As String, value As String) 120 Sub attach_file(llx As Single, lly As Single, urx As Single, ury As Single, filename As String, description As String, author As String, mimetype As String, icon As String) 121 Sub add_note(llx As Single, lly As Single, urx As Single, ury As Single, contents As String, title As String, icon As String, open As Long) 122 Sub add_pdflink(llx As Single, lly As Single, urx As Single, ury As Single, filename As String, page As Long, dest As String) 123 Sub add_locallink(llx As Single, lly As Single, urx As Single, ury As Single, page As Long, dest As String) 123 Sub add_launchlink(llx As Single, lly As Single, urx As Single, ury As Single, filename As String) 124 Sub add_weblink(llx As Single, lly As Single, urx As Single, ury As Single, url As String) 124 Sub set_border_style(style As String, width As Single) 125 Sub set_border_color(red As Single, green As Single, blue As Single) 125 Sub set_border_dash(b As Single, w As Single) 125 Sub add_thumbnail(image As Long) 125 Parameter und Werte Kategorie Funktion Schlüssel Konfiguration set_parameter prefix, resourcefile, compatibility, serial, warning set_value compress get_value major, minor, revision get_parameter version, scope Dokument Schrift Text set_value pagewidth, pageheight CropBox, BleedBox, ArtBox, TrimBox: danach muss ein Schrägstrich ’/’ sowie llx, lly, urx oder ury folgen, zum Beispiel CropBox/llx get_value pagewidth, pageheight set_parameter FontAFM, FontPFM, FontOutline, Encoding, fontwarning set_value leading, textrise, horizscaling, textrendering, charspacing, wordspacing get_value leading, textrise, horizscaling, textrendering, charspacing, wordspacing, textx, texty, font, fontsize, capheight, ascender, descender set_parameter underline, overline, strikeout, nativeunicode get_parameter underline, overline, strikeout, fontname, fontencoding 132 Kapitel B: PDFlib-Kurzreferenz (ActiveX/COM- und .NET-Edition) Kategorie Grafik Rasterbild Funktion Schlüssel set_parameter fillrule get_value currentx, currenty get_value imagewidth, imageheight, resx, resy set_parameter imagewarning PDI get_parameter pdi, inheritgstate set_parameter pdiwarning, pdistrict, inheritgstate, pdiusebox Hypertext 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_ parameter filename, /Info/<key> set_parameter openaction, openmode, bookmarkdest, transition, base set_value duration B PDFlib-Kurzreferenz 133 C Änderungen an diesem Handbuch Informationen über die PDFlib-Versionen finden Sie in der Quellcodedistribution. Revisionsübersicht dieses Handbuchs Datum Änderungen 6. August 2002 > Deutsche Übersetzung des Handbuchs für PDFlib 4.0.3, Ergänzungen für .NET > Kleinere Änderungen für PDFlib 4.0.3 und Erweiterungen für die .NET-Bindung > Kleinere Änderungen für PDFlib 4.0.2 und Erweiterungen für die IBM-eServer- 14. Juni 2002 26. Januar 2002 Edition 17. Mai 2001 1. April 2001 5. Februar 2001 22. Dezember 2000 > Kleinere Änderungen für PDFlib 4.0.1 > Dokumentiert PDI- und andere Funktionen von PDFlib 4.0.0 > Dokumentiert Template- und CMYK-Funktionen in PDFlib 3.5.0 > ColdFusion-Dokumentation und Erweiterungen für PDFlib 3.03; separate ActiveX-Edition des Handbuchs 8. August 2000 1. Juli 2000 20. Februar 2000 2. August 1999 29. Juni 1999 1. Februar 1999 10. August 1998 8. Juli 1998 25. Februar 1998 22. September 1997 134 > Delphi-Dokumentation und kleinere Erweiterungen für PDFlib 3.02 > Erweiterungen und Klarstellungen für PDFlib 3.01 > Änderungen für PDFlib 3.0 > Kleinere Änderungen und Erweiterungen für PDFlib 2.01 > Eigene Abschnitte für die jeweiligen Sprachbindungen > Erweiterungen für PDFlib 2.0 > Kleinere Änderungen für PDFlib 1.0 (keine öffentliche Freigabe) > Erweiterungen für PDFlib 0.7 (nur für einen Kunden) > Erste Beschreibung der PDFlib-Skriptunterstützung in PDFlib 0.6 > Kleine Erweiterungen am Handbuch für PDFlib 0.5 > Erste öffentliche Version von PDFlib 0.4 und dieses Handbuchs Kapitel C: Änderungen an diesem Handbuch (ActiveX/COM- und .NET-Edition) Index 0-9 16-Bit-Zeichensatz 65 8-Bit-Zeichensätze 46, 65 A Acrobat 3/4/5, Kompatibilität 13 Active Server Pages 22 besondere Hinweise 22 und PDFlib.NET 37 ActiveX-Sprachbindung allgemein 16 Fehlerbehandlung 20 im eigenen Produkt 20 Registrierung der DLL 20 Unicode-Unterstützung 21 Versionskontrolle 21 add_bookmark() 118 add_launchlink() 124 add_locallink() 123 add_note() 122 add_pdflink() 123 add_thumbnail() 125 add_weblink() 124 Adobe Font Metrics (AFM) 54 Adobe Glyph List (AGL) 49, 65 AFM (Adobe Font Metrics) 54 AGL (Adobe Glyph List) 49, 65 aktueller Punkt 44 Aladdin Free Public License 127 All (Schmuckfarbname) 107 Alphakanal 77 Anlagen 65, 121 API (Application Programming Interface) PDFlib-API-Referenz 85 äquidistante Schrift 68 arc() 103 arcn() 104 ArtBox 42, 87, 117, 118, 132, 133 AS/400 46 ascender-Parameter 68, 91 asiatisches Fontpaket 60 attach_file() 121 Ausgabegenauigkeit 43 Author-Feld 120 Automation 17 B Baseline-Kompression 72 base-Parameter 123 begin_page() 88 begin_pattern() 108 begin_template() 114 benutzerdefinierter Zeichensatz 48 Beschneiden 43 Betriebssystemschriften 55 Bézier-Kurve 103 Bildfunktionen 109 Bildmasken 76, 79 BitReverse 110 BlackIs1 111 BleedBox 42, 87, 117, 118, 132, 133 blind Modus 70, 95 bookmarkdest-Parameter 119 bookmarks 119 Borland Delphi: siehe Delphi builtin-Zeichensatz 46, 47 C C++-Sprachbindung 32 capheight-Parameter 68, 91 CCITT 73, 110 Character ID (CID) 60 characters per inch (CPI) 68 charspacing-Parameter 93 chinesisch 60, 62 CID-Schriften 60 circle() 103 Probleme bei VB 26 CJK (chinesisch, japanisch, koreanisch) 60 clip() 106 Clipping 43 close() 88 close_image() 113 close_pdi() 115 close_pdi_page() 115 closepath() 104 closepath_fill_stroke() 106 closepath_stroke() 105 CMaps 60, 62 Codepage 8-Bit 48 IBM 1047 47 Microsoft Windows 1250-1258 50 Microsoft Windows 1252 47 Unicode-basiert 65 ColdFusion besondere Hinweise 29 Fehlerbehandlung 30 Unicode-Unterstützung 30 Index 135 colorize 110 COM (Component Object Model): siehe ActiveXSprachbindung compatibility-Parameter 86 compress-Parameter 87 concat() 101 continue_text() 94 CPI (characters per inch) 68 Creator-Feld 120 CropBox 42, 87, 117, 118, 132, 133 C-Sprachbindung 32 currentx- und currenty-Parameter 67, 102 curveto() 103 D Dateianlagen 65, 121 Delphi 30 besondere Hinweise 30 Fehlerbehandlung 31 Unicode-Unterstützung 31 Demostempel 7 descender-Parameter 68, 91 Deskriptor 53 DLL (dynamic link library) 19, 129 Dokumentfunktionen 87 Dokumentinfofelder 65, 120 Dokumentöffnen-Aktion 118 Downsampling 74 dpi-Berechnungen 74 Drehen von Objekten 40 Dublin Core 120 duration-Parameter 121 dynamische Bibliotheken 129 E EBCDIC 16, 47 ebcdic-Zeichensatz 46, 47 Einbetten von Fonts 53 Einfärben von Bildern 110 Einheiten 40 Embedded-Systeme 14 Encoding: siehe Zeichensatz Encoding-Parameter 90 end_page() 89 end_pattern() 108 end_template() 114 endpath() 106 Errors-Klasse 20 Eurozeichen 47, 51 Exception: siehe Fehlerbehandlung explizite Transparenz 78 externe Referenz auf Bilddaten 76 F Farbe 44 Farbfunktionen 106 136 Index Fehlerbehandlung 15, 39 in .NET 33 in ActiveX 20 in ColdFusion 30 in Delphi 31 in JScript 24 in VBScript 25 in Visual Basic 27 fetter CJK-Text 63 filename-Parameter 117 fill() 105 fill_stroke() 105 Filling 43 fillrule-Parameter 105 findfont() 91 FontAFM-Parameter 90 fontencoding-Parameter 90 Fontmetrik 67 fontname-Parameter 90 FontOutline-Parameter 90 font-Parameter 90 FontPFM-Parameter 90 Fonts AFM-Dateien 54 allgemein 46 äquidistante 68 asiatisches Fontpaket 60 CID-Schriften 60 Deskriptor 53 einbetten 53 Glyphennamen 51 OpenType 53, 55 PDF-Standardschriften 46 PFA-Dateien 54 PFB-Dateien 54 PFM-Dateien 54 PostScript 54 rechtliche Aspekte der Einbettung 56 Ressourcekonfiguration 57 TrueType 55 Type 1 54 Type 3 54 UnicodeUnterstützung 65 fontsize-Parameter 90 FontSpecific-Encoding 47 fontwarning-Parameter 91 form XObjects 44 Füllen 43 Funktionalität von PDFlib 12 G Geltungsbereich von Funktionen 85 get_buffer() 38, 88 get_parameter() 90 get_pdi_parameter() 116, 117 get_value() 89 GIF 72, 109 global.asa 22 Grafikfunktionen 96 Grafikzustand, Funktionen 96 grid.pdf 40 GUID 21 H Hello world Beispiel allgemein 14 für ASP/JScript 23 für ASP/VBScript 23 für C# 34 für ColdFusion 29 für Delphi 30 für VB.NET 35 für VBScript 28 für Visual Basic 27 Hochstellen von Text 68 horizontaler Text 60, 63 horizscaling-Parameter 93 host-Zeichensatz 46, 47 Hypertext Funktionen 118 Zeichensatz 52 I ignoremask 79, 110 imagewarning-Parameter 71, 109 imagewidth- und imageheight-Parameter 109 implizite Transparenz 78 Importfunktionen für PDF 114 in-core PDF-Erzeugung 38 Info-Schlüssel in importierten PDF-Dokumenten 117 inheritgstate-Parameter 113 initgraphics() 99 Installation, Silent für ActiveX 18 InstallShield 20 Internet Service Provider 19 invert 110 ISO 10646 65 ISO 8859-1 47, 52 ISO 8859-2 bis -15 50 J japanisch 60, 62 Java-Sprachbindung 32 JFIF 72 JPEG 12, 72, 109, 112 JScript 23 Fehlerbehandlung 24 Unicode-Unterstützung 25 K Kachelung 44 Kategorien von Ressourcen 58 Keywords-Feld 120 Kommentare 65, 122 Kompatibilität Acrobat 3-5 12 Acrobat Reader 12 Koordinatenbereich 43 Koordinatensystem 40 metrisch 40 Top-Down 41 koreanisch 60, 62 K-Parameter für CCITT-Bilder 110 L Latin-1-Zeichensatz 47, 52 Laufweite 68 leading-Parameter 68, 93 Lesezeichen 65, 118 ausblenden 119 lineto() 102 Links 122 Literaturhinweise 128 Lizenzierung Modelle 127 PDFlib und PDI 7 LWFN (LaserWriter Font) 54 LZW-Kompression 72, 83 M Mac OS Classic UPR-Konfiguration 58 macroman-Zeichensatz 46, 47 major-Parameter 87 makepsres Hilfsprogramm 57 makespotcolor() 107 mask 78, 110 masked 78, 110 Maskierung von Bildern 76 MediaBox 42 mehrseitige Bilddateien 80 Metadaten 120 Metrik 67 metrische Koordinaten 40 Microsoft Transaction Server 17 Millimeter 40 minor-Parameter 87 monospaced: siehe äquidistant moveto() 102 MSI 18 MTS 17 N nativeunicode-Parameter 66, 67, 93 .NET und ASP 37 .NET-Sprachbindung 32 Fehlerbehandlung 33 Unicode-Unterstützung 33 Index 137 Versionskontrolle 33 nicht-proportionale Bildskalierung 75 None (Schmuckfarbname) 107 Notizen 65, 122 O Oberlänge 68 open_CCITT() 110 open_file() 87 open_image() 111 open_image_file() 109 open_pdi() 114 open_pdi_page() 115 openaction-Parameter 119 openmode-Parameter 119 OpenType-Schriften 53, 55 overline-Parameter 69, 93 P page 80, 110 pagewidth- und pageheight-Parameter 87 Parameter ascender 91 base 123 bookmarkdest 119 capheight 91 charspacing 93 compatibility 86 compress 87 currentx und currenty 67, 102 descender 91 duration 121 Encoding 90 filename 117 fillrule 105 font 90 FontAFM 90 fontencoding 90 fontname 90 FontOutline 90 FontPFM 90 fontsize 90 fontwarning 91 horizscaling 93 imagewarning 71, 109 imagewidth und imageheight 109 inheritgstate 113 leading 93 major 87 minor 87 nativeunicode 66, 67, 93 openaction 119 openmode 119 overline 69, 93 pageheight und pagewidth 87 pdi 117 pdistrict 118 138 Index pdiusebox 82, 118 pdiwarning 118 prefix 86 resourcefile 86 resx und resy 109 revision 87 scope 87 serial 86 strikeout 69, 93 textrendering 63, 69, 93 textrise 93 textx und texty 67, 71, 93 transition 121 underline 69, 93 version 87, 118 warning 39, 86 width und height 117 wordspacing 93 Parameterbehandlungsfunktionen 89 Pattern-Farbraum 44 PDFDocEncoding 52 PDF-Importbibliothek PDI 80 PDF-Importfunktionen 114 PDFlib Funktionalität 12 Programmstruktur 38 Thread-Sicherheit 11, 16 PDI 80 pdi-Parameter 117 pdistrict-Parameter 118 pdiusebox-Parameter 82, 118 pdiwarning-Parameter 118 Perl-Sprachbindung 37 PFA (Printer Font ASCII) 54 Pfad 43 zeichnen und beschneiden 104 PFB (Printer Font Binary) 54 PFM (Printer Font Metrics) 54 Photoshop 112 PHP-Sprachbindung 37 Piktogramme 119, 125 place_image() 113 place_pdi_page() 116 Plattformen 14 PNG 71, 78, 109 Portable Document Format Reference Manual 128 PostScript Language Reference Manual 128 PostScript-Schriften 54 prefix-Parameter 86 print_glyphs.ps 51 Printer Font ASCII (PFA) 54 Printer Font Binary (PFB) 54 Printer Font Metrics (PFM) 54 ProgID 21 Programmstruktur 38 Python-Sprachbindung 37 Q Querformat 89 R Rasterbilder allgemein 71 Bildmasken 79 Daten im Speicher 76 Daten wiederverwenden 76 Downsampling 74 externe Referenz 76 Formate 71 Funktionen 109 nicht-proportional skalieren 75 Rohdaten 73 skalieren 74 Transparenz 76 Raw-Bilddaten 111 rect() 104 Reflexion 100 Registrierung der PDFlib-ActiveX-DLL 20 regsvr32 19 resourcefile-Parameter 86 Ressourcekategorie 58 restore() 100 resx- und resy-Parameter 109 revision-Parameter 87 RGB-Farbe 44 Rohbilddaten 73 rotate() 100 Rotate-Eintrag in importierten PDF-Seiten 117 RPG-Sprachbindung 37 S S/390 46 save() 99 scale() 100 Probleme bei VB 26 Schmuckfarbe (Separation-Farbraum) 44 Schriften: siehe Fonts scope-Parameter 87 Seitenbeschreibungen 40 Seitenformate 126 Begrenzungen in Acrobat 42 Seitenfunktionen 87 Seitenübergänge 120 Separation-Farbraum 44 serial-Parameter 7, 86 set_border_color() 125 set_border_dash() 125 set_border_style() 125 set_info() 120 set_parameter() 60 set_text_pos() 92 set_value() 89 setcolor() 106 setdash() 96 setflat() 97 setfont() 92 setgray() 108 setgray_fill() 108 setgray_stroke() 108 setlinecap() 98 setlinejoin() 97 setlinewidth() 98 setmatrix() 101 setmiterlimit() 98 setpolydash() 97 setrgbcolor() 108 setrgbcolor_fill() 108 setrgbcolor_stroke() 108 Setup-Funktionen 86 shared objects 129 show() 94 show_boxed() 70, 95 show_xy() 94 Silent-Install 18 Skalieren von Rasterbildern 74 skew() 101 Speicher Bilddaten im 76 Erzeugung von PDF-Dokumenten im 38 Spiegelung 100 SPIFF 72 Sprachbindungen 14 Standardkoordinatensystem 40 Standardschriften 46 Standardseitemaße 126 Standardzoom 119 strikeout-Parameter 69, 93 stringwidth() 69, 96 stroke() 105 Stroking 43 Struktur von PDFlib-Programmen 38 Subject-Feld 120 subscript 68, 93 superscript 68, 93 Symbole für Dateianlagen 121 für Notizen 123 Symbolschrift 47 T T1lib 54 Tcl-Sprachbindung 37 Teilpfad 43 Templates 44 Text Darstellungsmodi 69 Formatierung in Rechteck 67 Funktionen 90 hochstellen 68 Laufweite 68 Oberlänge 68 Index 139 Position 67 tiefstellen 68 Umrisslinien zeichnen 69 unsichtbarer 69 Unterlänge 68 Versalhöhe 68 vertikal und horizontal 60, 63 Zeilenabstand 68 text position 92 Textbehandlung 46 Textmetrik 67 textrendering-Parameter 63, 69, 93 textrise-Parameter 93 Textvarianten 67 textx- und texty-Parameter 63, 67, 71, 93 Threading-Modell 17 Thread-Sicherheit 11, 16 Thumbnails: siehe Piktogramme Tiefstellen von Text 68 TIFF 73, 109 mehrseitig 80 Title-Feld 120 Top-Down-Koordinaten 41 transition-Parameter 121 translate() 100 Transparenz 76 explizite 78 implizite 78 Probleme mit 79 Trapped-Feld 120 TrimBox 42, 87, 117, 118, 132, 133 TrueType-Schriften 55 TTF (TrueType Font) 55 Type-1-Schriften 54 Type-3-Schriften 54 U UCS-2 67 Umrisslinien von Text zeichnen 69 UNC 22 underline-Parameter 69, 93 Unicode 16, 65 in .NET 33 in ActiveX 21 in ColdFusion 30 in Delphi 31 in JScript 25 in VBscript 25 in Visual Basic 27 Probleme bei Sprachbindungen 66 unsichtbarer Text 69 Unterlänge 68 UPR (Unix PostScript Resource) 57 Dateiformat 57 Dateisuche 59 URL 76, 124 140 Index user space 40 V VBA 18 vbObjectError 21 VBScript 23, 28 Fehlerbehandlung 25 Unicode-Unterstützung 25 Verfügbarkeit von PDFlib 14 Verknüpfungen 122 Versalhöhe 68 version-Parameter 87, 118 Versionskontrolle allgemein 15 in .NET 33 in ActiveX 21 vertikaler Text 60, 63 virtuelles Verzeichnis 22 Visual Basic 26 besondere Hinweise 26 Fehlerbehandlung 27 Unicode-Unterstützung 27 Visual Basic .NET 35 Visual Basic for Applications 18 Visual Basic Scripting Edition: siehe VBScript W warning-Parameter 39, 86 Warnung 42 Webverknüpfung 124 Weitergabe der ActiveX-Komponente 20 Wert: siehe Parameter width- und height-Parameter 117 winansi-Zeichensatz 46, 47 Windows Installer 18 Windows Script Host (WSH) 28 wordspacing-Parameter 93 X XObjects 44 Z ZapfDingbats-Schrift 47 Zeichennamen 51 Zeichensätze 46 benutzerdefiniert 48 CJK 64 für Hypertext 52 Unicode 65 Zeichnen 43 Zeilenabstand 68 Zoll 40 Zoomfaktor 119