Wie kann ich eingebettete Schriftarten aus einer PDF-Datei als gültige Schriftdateien extrahieren?


162

Mir ist das pdftk.exeDienstprogramm bekannt, mit dem angegeben werden kann, welche Schriftarten von einer PDF-Datei verwendet werden und ob sie eingebettet sind oder nicht.

Nun das Problem: Wenn ich PDF-Dateien mit eingebetteten Schriftarten hatte - wie kann ich diese Schriftarten so extrahieren, dass sie als normale Schriftdateien wiederverwendbar sind? Gibt es (vorzugsweise kostenlose) Tools, die das können? Außerdem: Kann dies programmgesteuert beispielsweise mit iText erfolgen?

Antworten:


406

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 Schrift enthalten, wenn eine Schrift eingebettet ist. Meistens enthalten sie nur die Teilmenge der im Dokument verwendeten Glyphen.


Verwenden von pdftops

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

  1. Konvertieren Sie die PDF-Datei in PostScript, z. B. mithilfe von XPDFs pdftops(unter Windows: pdftops.exeHilfsprogramm).
  2. Jetzt werden Schriftarten in das .pfaPostScript-Format eingebettet. Sie können sie mit einem Texteditor extrahieren .
  3. Möglicherweise müssen Sie das .pfa(ASCII) .pfbmit dem t1utilsund in eine (binäre) Datei konvertieren pfa2pfb.
  4. In PDF - Dateien nie sind .pfmoder .afmDateien (Font - Metric - Dateien) eingebettet (weil PDF Viewer internes Wissen über diese). Ohne diese sind Schriftdateien kaum visuell ansprechend verwendbar.

Verwenden von fontforge

Eine andere Methode ist die Verwendung des kostenlosen Schriftart-Editors FontForge :

  1. Verwenden Sie das Dialogfeld "Schriftart öffnen ", das beim Öffnen von Dateien verwendet wird.
  2. Wählen Sie dann im Filterbereich des Dialogfelds "Aus PDF extrahieren".
  3. Wählen Sie die PDF-Datei 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 spezifische Schritte ausführen, die nicht unbedingt einfach sind, um die extrahierten Schriftdaten als wiederverwendbare Datei zu speichern.


Verwenden von mupdf

Als nächstes MuPDF . Diese Anwendung wird mit einem Dienstprogramm namens pdfextract(unter Windows pdfextract.exe:) geliefert, mit dem Schriftarten und Bilder aus PDFs extrahiert werden können. (Falls Sie nichts über MuPDF wissen, das noch relativ unbekannt und neu ist: "MuPDF ist ein kostenloser, leichter PDF-Viewer und ein Toolkit, das in Portable 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 sie hier herunter: mupdf.com/downloads )

Hinweis: pdfextract.exeist ein Befehlszeilenprogramm. Gehen Sie wie folgt 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 verwiesen wird, in das aktuelle Verzeichnis. Im Allgemeinen sehen Sie eine Vielzahl von Dateien: Bilder sowie Schriftarten. Dazu gehören PNG, TTF, CFF, CID usw. Die Bildnamen lauten wie img-0412.png, wenn die PDF-Objektnummer des Bildes 412 war. Die Schriftnamen lauten wie FGETYK + LinLibertineI-0966.ttf , wenn die Schriftarten Die PDF-Objektnummer war 966.

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

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

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

Um die (ungefähr) äquivalenten Ergebnisse mit mutooldem vorherigen Tool zu erzielen pdfextract, führen Sie einfach aus mubusy extract .... *

Um Schriftarten und Bilder zu extrahieren, 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)

Downloads finden Sie hier: mupdf.com/downloads


Verwenden von gs(Ghostscript)

Anschließend kann Ghostscript Schriftarten auch direkt aus PDFs extrahieren. Es benötigt jedoch die Hilfe eines speziellen Dienstprogramms namens extractFonts.psPost, das in der PostScript-Sprache geschrieben ist und im Ghostscript-Quellcode-Repository verfügbar ist .

Verwenden Sie es jetzt, Sie müssen sowohl diese Datei extractFonts.psals auch Ihre PDF-Datei ausfü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 (ja, 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 einigen Jahren getestet. Zu der Zeit hat es * .ttf (TrueType) ganz 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 Schriftarten blockiert, die als geschützt markiert sind.


Verwenden von pdf-parser.py

Zum Schluss die pdf-parser.py von Didier Stevens : Diese ist wahrscheinlich nicht so einfach zu bedienen, da Sie über einige Kenntnisse in Bezug auf interne PDF-Strukturen verfügen müssen. pdf-parser.pyist ein Python-Skript, das auch viele andere Dinge kann. Es kann auch beliebige Streams aus Objekten dekomprimieren und extrahieren und daher auch eingebettete Schriftdateien extrahieren.

Aber Sie müssen wissen, wonach Sie suchen müssen. Lassen Sie es uns anhand eines Beispiels sehen. Ich habe eine Datei namens big.pdf . Als ersten Schritt verwende ich den -sParameter, um die PDF-Datei nach dem Auftreten des Schlüsselworts FontFile zu durchsuchen ( pdf-parser.pyerfordert keine Suche nach Groß- und Kleinschreibung):

pdf-parser.py -s fontfile big.pdf

In meinem Fall erhalte ich für mein big1.pdf folgendes 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 zwei Instanzen FontFile2innerhalb der PDF gibt, und diese sind in PDF-Objekten Nr. 15 und nein. 16. Objekt Nr. 15 enthält die /FontFile2für font / ArialMT , Objekt-Nr. 16 enthält die /FontFile2für font / 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 /FontFile2auf einen "Stream mit einem TrueType-Schriftprogramm"/FontFile bezieht ( bezieht sich auf einen "Stream mit einem Typ 1-Schriftprogramm" und /FontFile3auf einen "Stream mit einem Schriftprogramm, dessen Format" ist angegeben durch den Subtyp-Eintrag im Stream-Wörterbuch ' {daher entweder ein Type1C- oder ein CIDFontType0C- Subtyp}.)

Um speziell auf PDF-Objekt Nr. 15 (die die Schriftart / ArialMT enthält ) kann man den -o 15Parameter verwenden:

pdf-parser.py -o 15 big1.pdf

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

Diese pdf-parser.pyAusgabe sagt uns, dass dieses Objekt einen Stream enthält (den es nicht direkt anzeigt), der eine Länge von 1,581,435 Bytes hat und mit ASCIIHexEncode codiert (== "komprimiert") ist und dekodiert werden muss (== "de-) komprimiert "oder" gefiltert ") mit Hilfe des Standardfilters /ASCIIHexDecode.

Um einen Stream von einem Objekt zu sichern, pdf-parser.pykann mit dem -d dumpnameParameter aufgerufen werden. Machen wir das:

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

Unser extrahierter Datendump 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. Das Öffnen dieser Datei mit einem Texteditor bestätigt, dass es sich bei dem Inhalt um ASCII-Hex-codierte Daten handelt.

Das Öffnen der Datei mit einem Tool zum Lesen von Schriftarten wie otfinfo(dies ist ein Teil des lcdf-typetoolsPakets ) führt zunächst zu einigen Enttäuschungen:

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

OK, das liegt daran, dass wir (noch) nicht pdf-parser.pydie volle Magie nutzen ließen: einen gefilterten, dekodierten Stream zu entleeren. Dazu müssen wir den -fParameter 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, schau: Diese genaue Nummer war auch schon im PDF-Objekt Nr. 15 Wörterbuch als Wert für Schlüssel /Length1...

Was glaubt filees ist?

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

Was otfinfosagt uns 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.pyhaben tatsächlich eine gültige Schriftdatei für uns extrahiert. Angesichts der Größe dieser Datei (778,552 Bytes) sieht es so aus, als ob diese Schriftart sogar vollständig in das PDF eingebettet wurde ...

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


Vorsichtsmaßnahmen:

  • In jedem Fall müssen Sie die Lizenz befolgen, die für die Schriftart gilt. Einige Schriftlizenzen erlauben keine freie Nutzung und / oder Verbreitung. Das Raubkopieren von Schriftarten ist das Raubkopieren von Software oder anderem urheberrechtlich geschütztem Material.

  • Die meisten PDF-Dateien, die sich in freier Wildbahn befinden, enthalten ohnehin nicht die vollständige Schriftart, sondern nur Teilmengen. Das Extrahieren einer Teilmenge einer Schriftart ist, wenn überhaupt, nur in einem sehr begrenzten Umfang nützlich.

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


3
@ kizzx2: Fühlen Sie sich frei, eine meiner anderen [PDF] oder [Ghostscript] Antworten zu bewerten oder zu bewerten :-)
Kurt Pfeifle

Wenn Sie auf einem Mac arbeiten und mupdf über Ports (oder möglicherweise auch über Binärdateien) installieren, wird auch die Extraktion als mupdfextract bezeichnet. Sie können es vom Terminal aus ausführen, solange es sich im Pfad befindet.
Orwellophile

@Orwellophile: Danke für den Hinweis. Ich nutzte die Gelegenheit, um einige meiner Hinweise zu aktualisieren mupdf. Siehe auch dies ...
Kurt Pfeifle

Ich werde sie überprüfen. Und nur damit dies kein sinnloser Kommentar ist: Ihr Prozess hat FANTASTISCH funktioniert ... (abgestimmt) ... er hat 3 Variationen der Schrift extrahiert und benannt, und dann habe ich fontforge (auch frei von Macports) zum Zusammenführen verwendet. Leider fehlt meiner Schrift immer noch der Großbuchstabe "X" ... Was sind die Chancen: p
Orwellophile

1
@ Chris: Ja, dies sind zwei verschiedene Teilmengen (die sich sogar zu einem großen Teil überlappen können). Es gibt keine Option, sie automatisch zusammenzuführen.
Kurt Pfeifle

27

Nutzen Sie den Onlinedienst http://www.extractpdf.com . Sie müssen nichts installieren.


In meinem Fall konnte es nur Typ 1-Schriftarten extrahieren und nicht TrueType
koppor

Ich habe Schriftarten über diese Site extrahiert und unter kopiert ~/.fonts, und das Kopieren und Einfügen hat funktioniert!
Eduardo Santana



4

Obwohl diese Frage 10 Jahre alt ist, ist sie immer noch gültig und mit dem technologischen Wandel auch eine gültige Antwort.

Bei der Suche nach den aktuellen Antworten bemerkte keiner von ihnen WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ), mit dem die einzelnen Zeichen (Glyphen) neu erstellt und auf einer Webseite genau angezeigt werden können.

Konvertieren Sie mithilfe der kostenlosen Online-Webseite von IDR Solutions, PDF in HTML5 ( Link ), ein PDF in eine Zip-Datei. In der resultierenden Zip-Datei befindet sich ein Schriftartenverzeichnis mit woff-Dateitypen. Aktuelle Internetbrowser unterstützen Woff-Dateien, wenn Sie dies nicht wissen. ( Referenz ) Diese können auf der Online-Site FontDrop eingesehen werden! ( Link ).

WOFF-Dateien können bei WOFFer - WOFF Font Converter in / von OTF oder TTF konvertiert werden

Außerdem enthält die Zip-Datei von PDF nach HTML5 eine HTML-Datei für jede Seite der PDF, die in einem Internetbrowser geöffnet werden kann und eine der besten und genauesten PDF-Übersetzungen ist, die ich gefunden oder gesehen habe.

Während ich gerade lerne, wie man WOFF-Dateien verwendet, lohnt es sich, diese weiterzugeben. Genießen.

PS, ich werde wahrscheinlich mit weiteren Informationen aktualisieren, wenn ich mehr über die Verwendung von woff-Dateitypen erfahre. Da es sich jedoch um Creative Commons handelt, können Sie diese Antwort jederzeit bearbeiten, wenn Sie etwas Wertvolles weitergeben möchten.


Vielen Dank! Diese Lösung funktioniert für mich (wie beim Erstellen eines gültigen TTF), während die anderen, die ich ausprobiert habe, dies nicht tun. Liegt es daran, dass WOFF unvollständige Schriftarten besser handhabt?
Daan

@Daan Is it because WOFF handles incomplete fonts better?Ich habe keine Ahnung. Ihre Vermutung wäre so gut wie eine Mine. Wie ich bereits bemerkt habe, lerne ich gerade selbst etwas über WOFF.
Guy Coder

@Daan Vielleicht solltest du Is it because WOFF handles incomplete fonts better?als neue SO-Frage posten und andere mit mehr Wissen werden sehen und hoffentlich eine aussagekräftige Antwort geben.
Guy Coder

Ich könnte das tun. Vielen Dank.
Daan


2

PDF2SVG Version 6.0 von PDFTron leistet vernünftige Arbeit. .otfStandardmäßig werden OpenType ( ) -Schriftarten erstellt. Verwenden Sie --preserve_fontnamesdiese Option , um "das aus der Quelldatei erhaltene Namensschema für Schriftarten / Schriftfamilien" beizubehalten.

PDF2SVG ist ein kommerzielles Produkt, aber Sie können 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 auch Schriftarten extrahieren, aber ich habe PDF2SVG erst kürzlich selbst entdeckt.


Funktioniert leider --preserve_fontnamesnicht, wenn Sie überlappende, teilweise Schriftarten haben - es scheint nicht das Präfix zu enthalten, z. B. das MSCIYGin MSCIYG+Ge'ez-1, so dass frühere Teilzeichen überschrieben werden.
Chris

0

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

  1. Nachdem Sie die PDF-Datei geöffnet und die gewünschte Schriftart ausgewählt haben, möchten Sie die Option "Datei -> Schriftarten generieren ..." auswählen.
  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 genügend oft auf "Beheben" klicken.
  3. Klicken Sie auf "Element -> Schriftinfo ..." und "Schriftname", "Familienname" und "Name für Menschen" werden auf die gewünschten Werte gesetzt. 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 einen Ordner /usr/share/fonts(als root)
  2. Laufen fc-cache -f /usr/share/fonts/(als root)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.