Unicode in PDF
Mein Programm erzeugt eine relativ einfache PDF-Dokumente auf Anfrage, aber ich habe Probleme mit unicode-Zeichen, wie kanji oder ungerade mathematische Symbole. Zu schreiben, die einen normalen string in PDF, platzieren Sie Sie in Klammern:
(something)
Gibt es auch die Möglichkeit, zu entkommen, ein Zeichen mit oktal-codes:
(\527)
aber das geht nur bis zu 512 Zeichen. Wie kann man codieren, oder die Flucht höheres Zeichen? Ich habe gesehen, Verweise auf byte-streams und hex-codierte strings, aber keine der Referenzen, die ich gelesen habe, scheinen bereit zu sein, sagen Sie mir, wie Sie es tatsächlich tun.
Edit: Alternativ, zeigen Sie mir eine gute Java PDF-Bibliothek, die nicht den job für mich. Die, die ich bin derzeit mit ist eine version des gnujpdf (das habe ich einige bugs behoben, die seit der original-Autor zu haben scheint, gone AWOL), können Sie das Programm gegen eine AWT-Grafik-Schnittstelle, und idealerweise Ersatz sollte das gleiche tun.
Alternativen zu sein scheinen, entweder HTML -> PDF-Datei, oder eine programmatische Modell basiert auf Absätze und Felder, die fühlt sich sehr ähnlich wie HTML. iText ist ein Beispiel für die letztere. Dies würde bedeuten, umschreiben, meinen bestehenden code, und ich bin nicht davon überzeugt, Sie würde mir die gleiche Flexibilität bei der Verlegung aus.
Edit 2: ich wusste nicht vor, aber die iText-Bibliothek verfügt über ein Graphics2D-API und scheint den Umgang mit unicode-perfekt, also das ist, was ich verwenden werde. Obwohl es nicht eine Antwort auf die Frage gebeten, es löst das problem für mich.
Edit 3: iText funktioniert gut für mich. Ich denke, die Lektion ist, wenn Sie mit etwas konfrontiert werden, scheint sinnlos schwer, suchen Sie sich jemanden, der mehr darüber weiß als Sie.
InformationsquelleAutor der Frage Marcus Downing | 2008-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfache Antwort ist, dass es keine einfache Antwort. Wenn Sie einen Blick auf die PDF-Spezifikation, sehen Sie ein ganzes Kapitel — und eine lang — widmet sich den Mechanismen der text-Anzeige. Implementiert habe ich alle PDF-Unterstützung für mein Unternehmen, und der Umgang mit text war mit Abstand der komplexeste Teil der übung. Die Lösung, die Sie vor — verwenden Sie eine 3rd-party-Bibliothek, um die Arbeit für Sie — ist wirklich die beste Wahl, es sei denn, Sie haben sehr spezifische, spezielle-Zweck-Voraussetzungen für Ihre PDF-Dateien.
InformationsquelleAutor der Antwort Derek Clegg
In der PDF-Referenz in Kapitel 3, das ist, was Sie sagen, über Unicode:
InformationsquelleAutor der Antwort plinth
Algoman Antwort ist falsch in vielen Dingen. Sie kann PDF-Dokumente mit unicode in es', und es ist kein Hexenwerk, aber es braucht etwas Arbeit.
Ja er hat Recht, die Nutzung von mehr als 255 Zeichen in einer schriftart, die Sie haben, erstellen Sie ein composite-Schrift (CIDFont) pdf-Objekt.
Dann nimmt man einfach erwähnen, die eigentliche TrueType-schriftart, die Sie verwenden möchten, als DescendatFont Eintrag von CIDFont.
Der trick ist, dass nach, dass Sie haben zu verwenden Symbolindizes einer schriftart, die statt des Zeichencodes. Um diese Indizes anzeigen, die Sie analysieren
cmap
Abschnitt einer Schrift - Holen Sie sich den Inhalt der Schrift mitGetFontData
Funktion und nehmen Sie die Hände auf TTF-Spezifikation.Und das ist es! Habe ich gerade getan, und jetzt habe ich eine unicode-pdf!
Beispielcode für parsing -
cmap
Abschnitt ist hier: https://support.microsoft.com/en-us/kb/241020Und ja, nicht vergessen /ToUnicode-Eintrag wie @user2373071 darauf hingewiesen, oder der Benutzer nicht in der Lage, suchen Sie Ihre PDF-Datei oder kopieren Sie text aus.
InformationsquelleAutor der Antwort dredkin
Siehe Anhang D (Seite 995) mit der PDF-Spezifikation. Es gibt eine begrenzte Anzahl von Schriftarten und Zeichensätze vordefinierte in einer PDF-consumer-Anwendung. Die Darstellung anderer Zeichen, die Sie benötigen, um eine schriftart einbinden, die Sie enthält. Außerdem ist es vorzuziehen, einbetten, nur eine Teilmenge der schriftart, darunter nur erforderlich, Zeichen ein, um die Dateigröße zu verringern. Ich arbeite auch auf die Anzeige von Unicode-Zeichen in PDF und es ist ein großer Aufwand.
Check-out PDFBox oder iText.
http://www.adobe.com/devnet/pdf/pdf_reference.html
InformationsquelleAutor der Antwort jm4
Als dredkin darauf hingewiesen, benutzen Sie den glyph-Indizes statt der Unicode-Zeichen-Wert in den Inhalt der Seite stream. Dies ist ausreichend, um anzeigen von Unicode-text im PDF-Format, aber der Unicode-text würde nicht durchsucht werden. Um den text durchsuchbar oder kopieren/einfügen zu arbeiten, werden Sie auch brauchen, um ein /ToUnicode-stream. Dieser stream sollte übersetzen jedes Zeichen in dem Dokument, um den eigentlichen Unicode-Zeichen.
InformationsquelleAutor der Antwort user2373071
Ich gearbeitet habe mehrere Tage an diesem Thema und zu dem, was ich gelernt habe ist, dass unicode ist (so gut wie) unmöglich, in der pdf-Datei. Mit 2-byte-Zeichen, die Art und Weise der Plinthe beschrieben funktioniert nur mit CID-Fonts.
scheinbar, CID-Fonts sind im pdf-internen Konstrukt-und Sie sind nicht wirklich Schriftarten in diesem Sinne, Sie scheinen mehr zu werden wie Grafik-Subroutinen, die aufgerufen werden können durch die Auseinandersetzung (mit 16-bit-Adressen).
Also die Verwendung von unicode im pdf - direkt
IMHO, diese Punkte machen es absolut unmöglich für die Verwendung der unicode direkt.
Was ich Tue, sondern jetzt ist mit dem Zeichen indirekt in der folgenden Weise:
Für jede schriftart, Generiere ich eine codepage (und eine lookup-Tabelle für die schnelle lookups) - in c++ ist dies so etwas wie
dann, Wann ich will, um einige unicode-Zeichenfolge auf eine Seite, die ich Durchlaufen den Charakteren, sehen Sie in der lookup-Tabelle und - wenn Sie neu sind, ich füge Sie zu der code-Seite wie diese:
dann Erzeuge ich einen neuen string, wo Sie die Zeichen aus dem ursprünglichen string ersetzt werden durch Ihre Positionen in der Zeichentabelle wie diese:
beispielsweise "H€llo World!", könnte sich die <01020303040506040703080905>
und jetzt können Sie legen Sie einfach die Zeichenfolge in das pdf-Dokument und haben es gedruckt, mit dem Tj-operator wie gewohnt...
aber Sie haben jetzt ein problem: die pdf nicht wissen, dass Sie bedeuten, dass "H" durch ein 01. Um dieses problem zu lösen Sie auch die Zeichentabelle in der pdf-Datei. Dies geschieht, indem ein /Codierung auf das Font-Objekt und die Einstellung seiner Unterschiede
Für die "H€llo World!" - Beispiel, das Font-Objekt funktionieren würde:
Generiere ich es mit diesem code:
Beachten Sie, dass ich eine Globale schriftart-registrieren - ich benutze den gleichen font-Namen, /F1, /F2,... das ganze pdf-Dokument. Die gleiche schriftart-register Objekt wird in der /Ressourcen Eintrag von allen Seiten. Wenn Sie dies tun, anders (z.B. Sie verwenden eine schriftart-register pro Seite) - Sie möglicherweise anpassen müssen, um den code für Ihre situation zu erhalten...
Also wie finden Sie die Namen der Glyphen (/Euro für "€", /exclam für "!" etc.)? In dem obigen code, dies geschieht einfach durch Aufruf von "GlyphName(*j)". Ich habe generiert diese Methode mit einem BASH-Skript aus der Liste, die in
http://www.jdawiseman.com/papers/trivia/character-entities.html
und es sieht so aus
Einen großes problem habe ich offen gelassen ist, dass diese funktioniert nur so lange, wie man Sie bei den meisten 254 verschiedene Charaktere aus der gleichen Schrift. Verwenden Sie mehr als 254 verschiedene Zeichen, die Sie erstellen müssen mehrere codepages für die gleiche schriftart.
Innerhalb der pdf, die unterschiedliche codepages sind vertreten durch verschiedene Schriften, so zum Umschalten zwischen codepages, Sie hätten die Schriften wechseln, die theoretisch Blasen Sie Ihre pdf-up noch ein wenig, aber ich kann damit Leben...
InformationsquelleAutor der Antwort Algoman
Ich bin kein PDF-Experte, und (wie Ferruccio sagte) die PDF-Spezifikationen bei Adobe sollte dir alles sagen, aber ein Gedanke kam mir in den Sinn:
Sind Sie sicher, dass Sie eine schriftart, die alle Zeichen unterstützt, die Sie benötigen?
In unserer Anwendung, die wir erstellen, PDF aus HTML-Seiten (mit einem Drittanbieter-Bibliothek), und wir hatten dieses problem mit kyrillischen Zeichen...
InformationsquelleAutor der Antwort Filini