Comment puis-je extraire des fonts incorporées à partir d’un fichier PDF en tant que fichiers de police valides?

Je suis au courant de l’utilitaire pdftk.exe qui peut indiquer quelles fonts sont utilisées par un fichier PDF et si elles sont incorporées ou non.

Maintenant, le problème: étant donné que j’avais des fichiers PDF avec des fonts incorporées – comment puis-je extraire ces fonts de manière à ce qu’elles soient réutilisables en tant que fichiers de fonts classiques? Existe-t-il des outils (de préférence gratuits) qui peuvent faire cela? Aussi: cela peut-il être fait par programmation avec, disons, iText?

Vous avez plusieurs options. Toutes ces méthodes fonctionnent sous Linux, ainsi que sous Windows ou Mac OS X. Toutefois, sachez que la plupart des fichiers PDF n’incluent pas une fontface complète et complète lorsqu’une police est intégrée. La plupart du temps, ils n’incluent que le sousensemble des glyphes utilisés dans le document.


Utiliser des pdftops

L’une des méthodes les plus fréquemment utilisées pour ce faire sur les systèmes * nix comprend les étapes suivantes:

  1. Convertissez le PDF en PostScript, par exemple en utilisant les pdftops de pdftops (sous Windows: programme d’assistance pdftops.exe ).
  2. Désormais, les fonts seront incorporées au .pfa (PostScript) et vous pourrez les extraire à l’aide d’un éditeur de texte .
  3. Vous devrez peut-être convertir le .pfa (ASCII) en un .pfb (binary) à l’aide des fichiers t1utils et pfa2pfb .
  4. Dans les fichiers PDF, il n’y a jamais de fichiers .pfm ou .afm (fichiers de mesure de police) incorporés (car le visualiseur PDF a des connaissances internes à ce sujet). Sans eux, les fichiers de fonts sont difficilement utilisables de manière visuelle.

Utiliser fontforge

Une autre méthode consiste à utiliser l’éditeur de fonts Free FontForge :

  1. Utilisez la boîte de dialog “Open Font” utilisée lors de l’ouverture des fichiers.
  2. Sélectionnez ensuite “Extraire du PDF” dans la section Filtre du dialog.
  3. Sélectionnez le fichier PDF avec la police à extraire.
  4. Une boîte de dialog “Choisissez une police” s’ouvre – sélectionnez ici la police à ouvrir.

Vérifiez le manuel de FontForge. Vous devrez peut-être suivre quelques étapes spécifiques qui ne sont pas nécessairement simples pour enregistrer les données de police extraites sous la forme d’un fichier réutilisable.


En utilisant mupdf

Ensuite, MuPDF . Cette application est livrée avec un utilitaire appelé pdfextract (sous Windows: pdfextract.exe ) qui peut extraire des fonts et des images à partir de fichiers PDF. (Si vous ne connaissez pas MuPDF, qui est encore relativement inconnu et nouveau: “MuPDF est une visionneuse et une boîte à outils PDF gratuites et légères écrites en portable C.” , écrites par les développeurs Artifex Software, la même société qui nous a fourni Ghostscript. )
( Mise à jour: les versions plus récentes de MuPDF ont déplacé l’ancienne fonctionnalité de ‘pdfextract’ vers la commande ‘mutool extract’ . Téléchargez-la ici: mupdf.com/downloads )

Remarque: pdfextract.exe est un programme en ligne de commande. Pour l’utiliser, procédez comme suit:

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

Cette commande videra tous les fichiers extractibles du fichier pdf référencé dans le répertoire en cours. En général, vous verrez une variété de fichiers: des images ainsi que des fonts. Celles-ci incluent PNG, TTF, CFF, CID, etc. Les noms d’image seront comme img-0412.png si le numéro d’object PDF de l’image était 412. Les noms de police seront comme FGETYK + LinLibertineI-0966.ttf , si la police Le numéro d’object PDF était 966.

Les fichiers CFF ( Compact Font Format ) sont un format reconnu qui peut être converti dans d’autres formats via divers convertisseurs pour une utilisation sur différents systèmes d’exploitation.

Encore une fois: sachez que la plupart de ces fichiers de fonts ne peuvent comporter qu’un sousensemble de caractères et qu’ils ne représentent pas nécessairement la police complète.

Mise à jour: (Juillet 2013) Les versions récentes de mupdf ont vu une mupdf et un changement de nom internes de leurs fichiers binarys, pas seulement une fois, mais plusieurs fois. L’utilitaire principal était un binary similaire à «couteau suisse» appelé mubusy (nom inspiré par busybox?), mutool été renommé plus récemment mutool . Ceux-ci prennent en charge les sous-commandes info , clean , extract , poster et show . Malheureusement, la documentation officielle de ces outils n’est pas encore à jour. Si vous utilisez un Mac avec «MacPorts»: l’utilitaire a été renommé afin d’éviter les conflits de noms avec d’autres utilitaires utilisant des noms identiques, et vous devrez peut-être utiliser mupdfextract .

Pour obtenir les résultats (à peu près) équivalents avec mutool comme l’ancien outil pdfextract , il suffit d’exécuter mubusy extract ... *

Donc, pour extraire des fonts et des images, vous devrez peut-être exécuter l’un des commandes suivantes:

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

Les téléchargements sont ici: mupdf.com/downloads


Utiliser gs (Ghostscript)

Ghostscript peut également extraire des fonts directement à partir de fichiers PDF. Cependant, il a besoin de l’aide d’un utilitaire spécial nommé extractFonts.ps , écrit en langage PostScript, disponible à partir du référentiel de code source de Ghostscript .

Maintenant, utilisez-le, vous devez exécuter les deux, ce fichier extractFonts.ps et votre fichier PDF. Ghostscript utilisera ensuite les instructions du programme PostScript pour extraire les fonts du PDF. Cela ressemble à ceci sur Windows (oui, Ghostscript comprend la barre oblique, /, comme séparateur de chemin sur Windows!):

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

ou sous Linux, Unix ou Mac OS X:

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

J’ai testé la méthode Ghostscript il y a quelques années. À ce moment-là, il a bien extrait * .ttf (TrueType). Je ne sais pas si d’autres types de fonts seront également extraits, et si oui, de manière réutilisable. Je ne sais pas si l’utilitaire bloque l’extraction des fonts marquées comme protégées.


Utiliser pdf-parser.py

Enfin, le pdf-parser.py de Didier Stevens: celui-ci n’est probablement pas aussi facile à utiliser, car vous devez avoir un certain savoir-faire sur les structures PDF internes. pdf-parser.py est un script Python qui peut faire beaucoup d’autres choses. Il peut également décompresser et extraire des stream arbitraires à partir d’objects, et donc extraire des fichiers de fonts incorporés.

Mais vous devez savoir quoi chercher. Voyons cela avec un exemple. J’ai un fichier nommé big.pdf . Dans un premier temps, j’utilise le paramètre -s pour rechercher dans le PDF toute occurrence du mot-clé FontFile ( pdf-parser.py ne nécessite pas de recherche sensible à la casse):

 pdf-parser.py -s fontfile big.pdf 

Dans mon cas, pour mon big1.pdf , j’obtiens ce résultat:

 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 >> 

Il me dit qu’il y a deux instances de FontFile2 dans le PDF, et celles-ci sont dans les objects PDF no. 15 et non. 16, respectivement. Objet no. 15 contient le /FontFile2 pour la police / ArialMT , object no. 16 contient le /FontFile2 pour la police / Arial-BoldMT .

Pour le montrer plus clairement:

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

Un rapide coup d’œil dans la spécification PDF révèle que le mot /FontFile2 clé /FontFile2 rapporte à un stream contenant un programme de police TrueType ( /FontFile se rapporterait à un stream contenant un programme de fonts Type 1 et /FontFile3 à un stream contenant un programme de fonts dont le format est spécifié par l’entrée Subtype dans le dictionnaire de stream ‘ {étant donc un sous-type Type1C ou CIDFontType0C }.)

Pour regarder précisément l’object PDF no. 15 (qui contient la police / ArialMT ), on peut utiliser le paramètre -o 15 :

 pdf-parser.py -o 15 big1.pdf obj 15 0 Type: Referencing: Contains stream << /Length1 778552 /Length 1581435 /Filter /ASCIIHexDecode >> 

Cette sortie pdf-parser.py nous indique que cet object contient un stream (qu’il n’affiche pas directement) qui a une longueur de 1.581.435 octets et est encodé (== “compressé”) avec ASCIIHexEncode et doit être décodé ( == “décompressé” ou “filtré”) à l’aide du filtre standard /ASCIIHexDecode .

Pour transférer un stream depuis un object, pdf-parser.py peut être appelé avec le paramètre -d dumpname . Faisons le:

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

Notre vidage de données extrait se trouvera dans le fichier nommé dumped-data.ext . Voyons combien il est grand:

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

Oh regarde, il est 1.581.435 octets. Nous avons vu cette figure dans la sortie de la commande précédente. L’ouverture de ce fichier avec un éditeur de texte confirme que son contenu est constitué de données codées en hexadécimal ASCII.

Ouvrir le fichier avec un outil de lecture de police comme otfinfo (ceci fait partie du paquet lcdf-typetools ) conduira à une certaine déception:

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

OK, c’est parce que nous n’avons pas (encore) laissé pdf-parser.py utiliser toute sa magie: pour vider un stream filtré et décodé. Pour cela, nous devons append le paramètre -f :

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

Quelle est la taille de ce nouveau fichier?

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

Oh, regardez: ce nombre exact était aussi déjà enregistré dans l’object PDF no. 15 dictionnaire comme valeur pour clé /Length1

Que pense le file ?

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

Que nous dit otfinfo à ce sujet?

 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, Pasortingcia 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 ressortingctions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. Vendor ID: TMC 

Donc, Bingo !, nous avons un gagnant: pdf-parser.py a effectivement extrait un fichier de police valide pour nous. Compte tenu de la taille de ce fichier (778.552 octets), il semble que cette police ait été intégrée complètement dans le PDF …

Nous pourrions le renommer en arial-regular.ttf et l’installer en tant que tel et l’utiliser avec bonheur.


Mises en garde:

  • Dans tous les cas, vous devez suivre la licence qui s’applique à la police. Certaines licences de fonts ne permettent pas une utilisation et / ou une dissortingbution gratuites. Pirater les fonts, c’est comme pirater n’importe quel logiciel ou autre matériel protégé par des droits d’auteur.

  • La plupart des fichiers PDF qui sont à l’état sauvage n’intègrent pas la police complète, mais seulement des sous-ensembles. Extraire un sous-ensemble d’une police n’est utile que dans une mesure très limitée, voire pas du tout.

Veuillez également lire les informations suivantes sur les avantages et les inconvénients liés aux efforts d’extraction des fonts:

Utilisez le service en ligne http://www.extractpdf.com . Pas besoin d’installer quoi que ce soit.

Finalement, nous avons trouvé le package d’installation Windows de FontForge et ouvert le fichier PDF via le programme installé. A travaillé un régal, tellement heureux.

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html La manière la plus simple d’extraire les fonts de l’OMI (Windows).

PDF2SVG version 6.0 de PDFTron fait un travail raisonnable. Il produit des fonts OpenType ( .otf ) par défaut. Utilisez --preserve_fontnames pour préserver “le schéma de nommage des fonts / fonts de caractères obtenu à partir du fichier source”.

PDF2SVG est un produit commercial, mais vous pouvez télécharger un fichier exécutable de démonstration gratuit (qui inclut des filigranes sur la sortie SVG mais ne restreint pas l’utilisation). Il se peut que d’autres produits PDFTron extraient également des fonts, mais je n’ai découvert récemment que PDF2SVG.

L’un des meilleurs outils en ligne actuellement disponibles pour extraire des fonts pdf est http://www.pdfconvertonline.com/extract-pdf-fonts-online.html