it-swarm.com.de

Wie kann ich eingebettete Schriften aus einer PDF als gültige Schriftdateien extrahieren?

Mir ist bewusst, dass pdftk.exe Dienstprogramm, mit dem angegeben werden kann, welche Schriftarten von einer PDF-Datei verwendet werden und ob sie eingebettet sind oder nicht.

Nun das Problem: Ich hatte PDF Dateien mit eingebetteten Schriften - wie kann ich diese Schriften so extrahieren, dass sie als normale Schriftdateien wiederverwendbar sind? Gibt es (vorzugsweise kostenlose) Tools Was kann das? Auch: Kann dies programmgesteuert mit beispielsweise iText erfolgen?

150
simplybest55

Sie haben mehrere Möglichkeiten. Alle diese Methoden funktionieren sowohl unter Linux als auch unter Windows oder Mac OS X. Beachten Sie jedoch, dass die meisten PDF-Dateien keine vollständige Schriftart enthalten, wenn eine Schriftart eingebettet ist. Meist enthalten sie nur die Teilmenge der im Dokument verwendeten Glyphen.


pdftops verwenden

Eine der am häufigsten verwendeten Methoden, um dies auf * nix-Systemen zu tun, besteht aus den folgenden Schritten:

  1. Konvertieren Sie PDF in PostScript, z. B. mithilfe von XPDF pdftops (unter Windows: pdftops.exe Hilfsprogramm.
  2. Jetzt werden Schriftarten in das PostScript-Format .pfa Eingebettet. Sie können sie mit einem Texteditor extrahieren.
  3. Möglicherweise müssen Sie den .pfa (ASCII) mit .pfb Und t1utils In eine pfa2pfb (Binäre) Datei konvertieren.
  4. In PDFs sind niemals .pfm - oder .afm - Dateien (Fontmetrikdateien) eingebettet (da der PDF - Betrachter über interne Kenntnisse darüber verfügt). Ohne diese sind Schriftdateien optisch kaum ansprechend nutzbar.

fontforge verwenden

Eine andere Methode ist die Verwendung des Free Font Editors FontForge :

  1. Verwenden Sie das Dialogfeld "Schriftart öffnen" , das beim Öffnen von Dateien verwendet wird.
  2. Wählen Sie dann "Aus PDF extrahieren" im Filterbereich des Dialogfelds.
  3. Wählen Sie die Datei PDF mit der zu extrahierenden Schriftart aus.
  4. Ein Dialogfeld "Schriftart auswählen" wird geöffnet. Wählen Sie hier aus, welche Schriftart geöffnet werden soll.

Überprüfen Sie das FontForge-Handbuch. Möglicherweise müssen Sie einige bestimmte Schritte ausführen, die nicht unbedingt einfach sind, um die extrahierten Schriftartdaten als Datei zu speichern, die wiederverwendbar ist.


mupdf verwenden

Als nächstes MuPDF . Diese Anwendung enthält ein Hilfsprogramm namens pdfextract (unter Windows: pdfextract.exe), Mit dem Sie Schriftarten und Bilder aus PDF-Dateien extrahieren können. (Falls Sie nicht über MuPDF Bescheid wissen, das noch relativ unbekannt und neu ist: "MuPDF ist ein kostenloses, leichtgewichtiges PDF - Anzeige- und Toolkit, das in portablem C geschrieben wurde." , geschrieben von Artifex Software-Entwicklern, der gleichen Firma, die uns Ghostscript gegeben hat.)
( Update: Neuere Versionen von MuPDF haben die frühere Funktionalität von 'pdfextract' in den Befehl 'mutool extract' verschoben. . Laden Sie es hier herunter: mupdf.com/downloads)

Hinweis: pdfextract.exe Ist ein Befehlszeilenprogramm. Gehen Sie folgendermaßen vor, um es zu verwenden:

c:\>  pdfextract.exe  c:\path\to\filename.pdf         # (on Windows)
$>    pdfextract  /path/tofilename.pdf                # (on Linux, Unix, Mac OS X)

Dieser Befehl speichert alle extrahierbaren Dateien aus der PDF-Datei, auf die im aktuellen Verzeichnis verwiesen wird. Im Allgemeinen sehen Sie eine Vielzahl von Dateien: Bilder sowie Schriftarten. Dazu gehören PNG, TTF, CFF, CID usw. Die Bildnamen entsprechen img-0412.png , wenn die Objektnummer PDF des Bildes 412 lautet. Die Schriftnamen entspricht FGETYK + LinLibertineI-0966.ttf , wenn die Objektnummer PDF der Schriftart 966 lautet.

CFF-Dateien ( Compact Font Format ) sind ein anerkanntes Format, das über eine Vielzahl von Konvertern in andere Formate konvertiert werden kann, um auf verschiedenen Betriebssystemen verwendet zu werden.

Nochmals: Beachten Sie, dass die meisten dieser Schriftdateien möglicherweise nur eine Teilmenge von Zeichen enthalten und möglicherweise nicht die gesamte Schriftart darstellen.

Update: (Jul 2013) In den letzten Versionen von mupdf wurden die Binärdateien nicht nur einmal, sondern mehrmals intern neu gemischt und umbenannt. Das Hauptprogramm war früher eine 'Schweizer Messer'-ähnliche Binärdatei mit dem Namen mubusy (Name inspiriert von busybox?), Die in jüngerer Zeit in mutool umbenannt wurde. Diese unterstützen die Unterbefehle info, clean, extract, poster und show. Leider ist die offizielle Dokumentation für diese Tools (noch) nicht aktuell. Wenn Sie auf einem Mac mit 'MacPorts' arbeiten: Das Dienstprogramm wurde umbenannt, um Namenskonflikte mit anderen Dienstprogrammen mit identischen Namen zu vermeiden. Möglicherweise müssen Sie mupdfextract verwenden.

Führen Sie einfach mubusy extract ... Aus, um die (ungefähr) äquivalenten Ergebnisse mit mutool zu erzielen, wie es das vorherige Tool pdfextract getan hat. *

Zum Extrahieren von Schriftarten und Bildern müssen Sie möglicherweise eine der folgenden Befehlszeilen ausführen:

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

Die Downloads finden Sie hier: mupdf.com/downloads


gs verwenden (Ghostscript)

Dann kann Ghostscript auch Schriftarten direkt aus PDFs extrahieren. Es benötigt jedoch die Hilfe eines speziellen Hilfsprogramms mit dem Namen extractFonts.ps , das in der PostScript-Sprache geschrieben ist erhältlich im Ghostscript-Quellcode-Repository .

Verwenden Sie es jetzt, um sowohl diese Datei extractFonts.ps Als auch Ihre PDF - Datei auszuführen. Ghostscript verwendet dann die Anweisungen aus dem PostScript-Programm, um die Schriftarten aus der PDF-Datei zu extrahieren. Unter Windows sieht es so aus (Ghostscript versteht den 'Schrägstrich', /, als Pfadtrennzeichen auch unter Windows!):

gswin32c.exe                  ^
  -q -dNODISPLAY              ^
   c:/path/to/extractFonts.ps ^
  -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"

oder unter Linux, Unix oder Mac OS X:

gs                          \
  -q -dNODISPLAY            \
   /path/to/extractFonts.ps \
  -c "(/path/to/your/PDFFile.pdf) extractFonts quit"

Ich habe die Ghostscript-Methode vor ein paar Jahren getestet. Zu der Zeit hat es * .ttf (TrueType) gut extrahiert. Ich weiß nicht, ob andere Schriftarten überhaupt extrahiert werden, und wenn ja, auf wiederverwendbare Weise. Ich weiß nicht, ob das Dienstprogramm das Extrahieren von als geschützt markierten Schriftarten blockiert.


Verwenden von pdf-parser.py

Zum Schluss noch Didier Stevens ' pdf-parser.py : Dieser ist wahrscheinlich nicht so einfach zu bedienen, weil Sie ihn brauchen etwas Know-how über interne PDF Strukturen. pdf-parser.py Ist ein Python - Skript, das auch viele andere Dinge ausführen kann. Es kann auch beliebige Streams von Objekten dekomprimieren und extrahieren und daher auch eingebettete Schriftdateien extrahieren.

Aber Sie müssen wissen, wonach Sie suchen müssen. Lassen Sie es uns mit einem Beispiel sehen. Ich habe eine Datei mit dem Namen big.pdf . Als ersten Schritt verwende ich den Parameter -s, um im PDF nach Vorkommen des Schlüsselworts FontFile zu suchen ) (pdf-parser.py Erfordert keine Suche nach Groß- und Kleinschreibung):

pdf-parser.py -s fontfile big.pdf

In meinem Fall erhalte ich für meine big1.pdf das folgende Ergebnis:

obj 9 0
 Type: /FontDescriptor
 Referencing: 15 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 32
    /FontBBox [ -665 -325 2000 1006 ]
    /FontFile2 15 0 R
    /FontName /ArialMT
    /ItalicAngle 0
    /StemV 87
    /Type /FontDescriptor
    /XHeight 519
  >>   

obj 11 0 
 Type: /FontDescriptor
 Referencing: 16 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 262176
    /FontBBox [ -628 -376 2000 1018 ]
    /FontFile2 16 0 R
    /FontName /Arial-BoldMT
    /ItalicAngle 0
    /StemV 165
    /Type /FontDescriptor
    /XHeight 519
  >>   

Es sagt mir, dass es in der PDF zwei Instanzen von FontFile2 Gibt, und diese befinden sich in den PDF - Objekten Nr. 15 und nein. 16 sind. Objekt-Nr. 15 enthält den /FontFile2 Für Schriftart /ArialMT , Objekt-Nr. 16 enthält den /FontFile2 Für Schriftart /Arial-BoldMT .

Um dies deutlicher zu zeigen:

pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
  /FontFile2 15 0 R
  /FontFile2 16 0 R

Ein kurzer Blick in die PDF - Spezifikation zeigt, dass sich das Schlüsselwort /FontFile2 Auf einen 'Stream bezieht, der ein TrueType-Schriftprogramm enthält' (/FontFile Würde beziehen sich auf einen 'Stream, der ein Typ 1 Schriftprogramm enthält' und /FontFile3 würden sich auf einen 'Stream beziehen, der ein Schriftprogramm enthält, dessen Format durch das spezifiziert wird Subtypeintrag im Stream-Wörterbuch ' {daher entweder ein Type1C oder ein CIDFontType0C Subtyp}.)

Um PDF Objekt-Nr. 15 (enthält die Schriftart /ArialMT ), kann der Parameter -o 15 verwendet werden:

pdf-parser.py -o 15 big1.pdf

 obj 15 0
  Type: 
  Referencing: 
  Contains stream
   <<
     /Length1 778552
     /Length 1581435
     /Filter /ASCIIHexDecode
   >>

Diese pdf-parser.py - Ausgabe gibt an, dass dieses Objekt einen Stream enthält (der nicht direkt angezeigt wird), der eine Länge von 1.581.435 Bytes hat und mit ASCIIHexEncode codiert (== "komprimiert") ist und decodiert werden muss (== "entkomprimiert" oder "gefiltert") mit Hilfe des Standardfilters /ASCIIHexDecode.

Um einen Stream von einem Objekt zu sichern, kann pdf-parser.py Mit dem Parameter -d dumpname aufgerufen werden. Machen wir das:

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

Unser extrahierter Daten-Dump befindet sich in der Datei dumped-data.ext . Mal sehen, wie groß es ist:

ls -l dumped-data.ext
  -rw-r--r--  1 kurtpfeifle  staff  1581435 Apr 11 00:29 dumped-data.ext

Oh schau, es ist 1.581.435 Bytes. Wir haben diese Zahl in der Ausgabe des vorherigen Befehls gesehen. Durch Öffnen dieser Datei mit einem Texteditor wird bestätigt, dass es sich bei dem Inhalt um ASCII hexadezimal codierte Daten handelt.

Öffnen der Datei mit einem Tool zum Lesen von Schriftarten wie otfinfo (dies ist Teil des Pakets lcdf-typetools) wird zunächst zu einer gewissen Enttäuschung führen:

otfinfo -i dumped-data.ext
  otfinfo: dumped-data.ext: not an OpenType font (bad magic number)

OK, das liegt daran, dass wir (noch) nicht zulassen, dass pdf-parser.py Seine ganze Magie ausnutzt: einen gefilterten, dekodierten Stream zu speichern. Dazu müssen wir den Parameter -f hinzufügen:

pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf

Wie groß ist diese neue Datei?

ls -l dumped-data-decoded.ext
  -rw-r--r--  1 kurtpfeifle  staff  778552 Apr 11 00:39 dumped-data-decoded.ext

Oh, sieh mal: Diese genaue Nummer war auch schon in der PDF Objekt-Nr. 15 Wörterbuch als Wert für Schlüssel /Length1 ...

Was hält file davon?

file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data

Was sagt uns otfinfo darüber?

otfinfo -i dumped-data-decoded.ext
  Family:              Arial
  Subfamily:           Regular
  Full name:           Arial
  PostScript name:     ArialMT
  Version:             Version 5.10
  Unique ID:           Monotype:Arial Regular:Version 5.10 (Microsoft)
  Designer:            Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982
  Manufacturer:        The Monotype Corporation
  Trademark:           Arial is a trademark of The Monotype Corporation.
  Copyright:           © 2011 The Monotype Corporation. All Rights Reserved.
  License Description: You may use this font to display and print content as permitted by
                       the license terms for the product in which this font is included.
                       You may only (i) embed this font in content as permitted by the 
                       embedding restrictions included in this font; and (ii) temporarily 
                       download this font to a printer or other output device to help
                       print content.
  Vendor ID:           TMC

Also Bingo !, wir haben einen Gewinner: pdf-parser.py Hat tatsächlich eine gültige Schriftartdatei für uns extrahiert. Angesichts der Größe dieser Datei (778,552 Bytes) sieht es so aus, als wäre diese Schriftart sogar vollständig in die PDF-Datei eingebettet ...

Wir könnten es in arial-regular.ttf umbenennen und es als solches installieren und gerne nutzen.


Vorsichtsmaßnahmen:

  • In jedem Fall müssen Sie die für die Schrift geltende Lizenz einhalten. Einige Schriftlizenzen erlauben keine freie Verwendung und/oder Verbreitung. Das Kopieren von Schriftarten entspricht dem Kopieren von Software oder anderem urheberrechtlich geschütztem Material .

  • Die meisten PDF-Dateien, die ohnehin im Umlauf sind, binden nicht die gesamte Schrift ein, sondern nur Teilmengen. Das Extrahieren einer Teilmenge einer Schrift ist, wenn überhaupt, nur in sehr begrenztem Umfang sinnvoll .

Bitte lesen Sie auch die folgenden Informationen zu Vor- und Nachteilen in Bezug auf das Extrahieren von Schriftarten:

375
Kurt Pfeifle

Verwenden Sie den Onlinedienst http://www.extractpdf.com . Es muss nichts installiert werden.

22
igo

Schließlich fand das FontForge Windows-Installationspaket und öffnete das PDF über das installierte Programm. Hat gut geklappt, so glücklich.

5
Dapizz

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html IMO einfachste Möglichkeit zum Extrahieren von Schriftarten (Windows).

4
l00k

PDF2SVG Version 6.0 von PDFTron macht einen vernünftigen Job. Es erzeugt OpenType (.otf) Schriften standardmäßig. Verwenden --preserve_fontnames, um "das aus der Quelldatei erhaltene Benennungsschema für Schriftarten/Schriftfamilien" beizubehalten.

PDF2SVG ist ein kommerzielles Produkt. Sie können jedoch eine kostenlose ausführbare Demo-Datei herunterladen (die Wasserzeichen in der SVG-Ausgabe enthält, die Verwendung jedoch nicht anderweitig einschränkt). Es gibt möglicherweise andere PDFTron-Produkte, die ebenfalls Schriftarten extrahieren, aber ich habe PDF2SVG erst kürzlich selbst entdeckt.

2
Sean Leather

Eines der besten Online-Tools zum Extrahieren von PDF-Schriftarten ist http://www.pdfconvertonline.com/extract-pdf-fonts-online.html

1

Dies ist eine Fortsetzung der font-forge Abschnitt von @ Kurt Pfeifles Antwort , spezifisch für Red Hat (und möglicherweise andere Linux-Distributionen).

  1. Nachdem Sie die PDF und die gewünschte Schriftart ausgewählt haben, wählen Sie die Option "Datei -> Schriftarten erstellen ...".
  2. Wenn die Datei Fehler enthält, können Sie diese ignorieren oder die Datei speichern und bearbeiten. Die meisten Fehler können automatisch behoben werden, wenn Sie mehrmals auf "Korrigieren" klicken.
  3. Klicken Sie auf "Element -> Font Info ..." und "Fontname", "Family Name" und "Name for Humans" werden alle auf Werte gesetzt, die Sie mögen. Wenn nicht, ändern Sie sie und speichern Sie die Datei irgendwo. Diese Namen bestimmen, wie Ihre Schriftart auf dem System angezeigt wird.
  4. Wählen Sie Ihren Dateinamen und klicken Sie auf "Speichern ..."

Sobald Sie Ihre TTF-Datei haben, können Sie sie auf Ihrem System installieren

  1. Kopieren in den Ordner /usr/share/fonts (als root)
  2. Laufen fc-cache -f /usr/share/fonts/ (als root)
0
Mad Physicist