194 votes

Comment extraire les polices incorporées d'un PDF en tant que fichiers de polices valides ?

Je suis conscient de la pdftk.exe Utilitaire qui peut indiquer quelles polices sont utilisées par un PDF, et si elles sont intégrées ou non.

Maintenant, le problème : étant donné que j'ai des fichiers PDF avec des polices intégrées, comment puis-je extraire ces polices de manière à ce qu'elles soient réutilisables comme des fichiers de polices ordinaires ? Existe-t-il des outils (de préférence gratuits) qui peuvent le faire ? De plus, cela peut-il être fait de manière programmatique avec, par exemple, iText ?

464voto

Kurt Pfeifle Points 24491

Vous avez plusieurs possibilités. Toutes ces méthodes fonctionnent aussi bien sous Linux que sous Windows ou Mac OS X. Toutefois, sachez que la plupart des PDF n'incluent pas la police complète lorsqu'ils contiennent une police intégrée. La plupart du temps, ils n'incluent que le sous-ensemble des glyphes utilisés dans le document.


Utilisation de pdftops

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

  1. Convertissez le PDF en PostScript, par exemple à l'aide de l'outil XPDF pdftops (sous Windows : pdftops.exe programme d'aide.
  2. Les polices seront désormais intégrées dans .pfa (PostScript) + vous pouvez les extraire à l'aide d'une éditeur de texte .
  3. Vous devrez peut-être convertir le .pfa (ASCII) à un .pfb (binaire) en utilisant l'option t1utils y pfa2pfb .
  4. Dans les PDF, il n'y a jamais .pfm o .afm (fichiers de métrique de police) intégrés (parce que le visualiseur PDF a une connaissance interne de ces fichiers). Sans ces fichiers, les fichiers de polices sont difficilement utilisables d'une manière visuellement agréable.

Utilisation de fontforge

Une autre méthode consiste à utiliser l'éditeur de polices gratuit FontForge :

  1. Utilisez le "Police ouverte" boîte de dialogue utilisée lors de l'ouverture des fichiers.
  2. Sélectionnez ensuite "Extraire du PDF" dans la section filtre de la boîte de dialogue.
  3. Sélectionnez le fichier PDF contenant la police à extraire.
  4. A "Choisissez une police" La boîte de dialogue s'ouvre - sélectionnez ici la police à ouvrir.

Consultez le manuel de FontForge. Il se peut que vous deviez suivre quelques étapes spécifiques qui ne sont pas nécessairement simples afin d'enregistrer les données de police extraites dans un fichier réutilisable.


Utilisation de mupdf

Suivant, MuPDF . Cette application est livrée avec un utilitaire appelé pdfextract (sous Windows : pdfextract.exe ) qui peut extraire les polices et les images des PDF. (Au cas où vous ne connaîtriez pas MuPDF, qui est encore relativement inconnu et nouveau : "MuPDF est un visualiseur et une boîte à outils PDF légers et gratuits écrits en C portable." écrit par les développeurs d'Artifex Software, la même société qui nous a donné Ghostscript).
(Le plus connu <a href="http://blog.kowalczyk.info/software/sumatrapdf/download.html" rel="nofollow">SumatraPDF </a>(Windows seulement) est basé sur MuPDF, et il est également livré avec <code>pdfextract.exe</code> .)

Note : 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 va vider tous les fichiers extractibles du fichier pdf référencé dans le répertoire courant. En général, vous verrez une variété de fichiers : des images ainsi que des polices. Il s'agit notamment de PNG, TTF, CFF, CID, etc. Les noms des images seront les suivants img-0412.png si le numéro d'objet PDF de l'image était 412. Les noms de police seront les suivants FGETYK+LinLibertineI-0966.ttf si le numéro d'objet PDF de la police était 966.

CFF ( Format de police compact ) sont un format reconnu qui peut être converti en d'autres formats via une variété de convertisseurs pour être utilisé sur différents systèmes d'exploitation.

Encore une fois, soyez conscient que la plupart de ces fichiers de polices peuvent avoir seulement une sous-ensemble de caractères et peut ne pas représenter le caractère complet.

Mise à jour : (Juillet 2013) Les versions récentes de mupdf ont connu un remaniement interne et un changement de nom de leurs binaires, pas seulement une fois, mais plusieurs fois. L'utilitaire principal était auparavant un binaire semblable à un "couteau suisse" appelé mubusy (nom inspiré de busybox ?), qui plus récemment a été renommé en mutool . Celles-ci prennent en charge les sous-commandes info , clean , extract , poster y show . Malheureusement, la documentation officielle de ces outils n'est pas (encore) à jour. Si vous êtes sur un Mac utilisant 'MacPorts' : alors 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 des résultats (à peu près) équivalents avec mutool comme son outil précédent pdfextract a fait, juste exécuter mubusy extract ... .*

Ainsi, pour extraire les polices et les images, vous devrez peut-être exécuter l'une des lignes de commande suivantes :

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

Utilisation de gs (Ghostscript)

Ensuite, Ghostscript peut également extraire les polices directement des PDF. Cependant, il nécessite l'aide d'un programme utilitaire spécial appelé extractFonts.ps écrit en langage PostScript, qui est disponible sur le site de la Commission européenne. Dépôt du 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 polices du PDF. Cela ressemble à ceci sous Windows (oui, Ghostscript comprend la barre oblique, /, comme séparateur de chemin, même sous Windows !)

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

ou sur 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. À l'époque, elle permettait d'extraire les fichiers *.ttf (TrueType) sans problème. Je ne sais pas si d'autres types de polices seront également extraits, et si oui, de manière réutilisable. Je ne sais pas si l'utilitaire bloque l'extraction des polices qui sont marquées comme protégées.


Utilisation de pdf-parser.py

Enfin, l'article de Didier Stevens pdf-parser.py Cette solution n'est probablement pas aussi facile à utiliser, car vous devez avoir des connaissances sur les structures internes des PDF. pdf-parser.py est un script Python qui peut faire beaucoup d'autres choses aussi. Il peut aussi décompresser et extraire des flux arbitraires à partir d'objets, et donc il peut aussi extraire des fichiers de police intégrés.

Mais vous devez savoir ce qu'il faut rechercher. Voyons cela à l'aide d'un exemple. J'ai un fichier nommé grand.pdf . Dans un premier temps, j'utilise le -s pour rechercher dans le PDF toute occurrence du mot-clé Fichier de police ( pdf-parser.py ne nécessite pas une 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 à l'intérieur du PDF, et ceux-ci sont dans les objets PDF no. 15 et 16, respectivement. L'objet n° 15 contient le /FontFile2 pour la police /ArialMT L'objet n° 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 le mot-clé /FontFile2 concerne un flux contenant un programme de police TrueType". ( /FontFile se rapporterait à un flux contenant un programme de polices de caractères de type 1 y /FontFile3 se rapporterait à un flux contenant un programme de police dont le format est spécifié par l'entrée Subtype du dictionnaire des flux". {donc être soit un Type1C o un CIDFontType0C sous-type}.)

Pour regarder spécifiquement l'objet PDF n° 15 (qui contient la police /ArialMT ), on peut utiliser le -o 15 paramètre :

pdf-parser.py -o 15 big1.pdf

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

Ce site pdf-parser.py nous indique que cet objet contient un flux (qu'il n'affichera pas directement) d'une longueur de 1.581.435 octets, encodé ( == "compressé") avec ASCIIHexEncode et devant être décodé ( == "dé-compressé" ou "filtré") à l'aide du standard /ASCIIHexDecode filtre.

Pour vider n'importe quel flux d'un objet, pdf-parser.py peut être appelé avec l'option -d dumpname paramètre. Faisons-le :

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

Notre vidage de données extraites sera dans le fichier nommé dumped-data.ext . Voyons quelle est sa taille :

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

Oh regarde, c'est 1.581.435 octets. Nous avons vu ce chiffre 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 polices comme otfinfo (il s'agit d'une partie de la lcdf-typetools paquet ) entraînera une certaine déception au début :

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 d'utiliser toute sa magie : pour décharger un flux filtré et décodé. Pour cela, nous devons ajouter l'option -f paramètre :

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à stocké dans le dictionnaire de l'objet PDF n°15 comme valeur pour la clé /Length1 ...

Qu'est-ce que file pense que c'est le cas ?

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

Qu'est-ce que otfinfo nous en parler ?

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

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é incorporée même complètement dans le PDF...

Nous pourrions le renommer en arial-régulier.ttf et l'installer comme tel et l'utiliser avec bonheur.


Mises en garde :

  • Dans tous les cas, vous devez respecter la licence qui s'applique à la police. Certaines licences de polices n'autorisent pas la libre utilisation et/ou la distribution. Le piratage des polices est comparable au piratage de tout logiciel ou autre matériel protégé par le droit d'auteur.

  • La plupart des PDF qui circulent dans la nature n'intègrent pas la police complète, mais seulement des sous-ensembles. L'extraction d'un sous-ensemble d'une police n'est utile que dans un cadre très limité, voire pas du tout.

Veuillez également lire ce qui suit sur les avantages et (plus) les inconvénients des efforts d'extraction des polices de caractères :

30voto

igo Points 700

Utiliser le service en ligne http://www.extractpdf.com . Il n'est pas nécessaire d'installer quoi que ce soit.

8voto

Dapizz Points 31

On a fini par trouver le paquet d'installation de FontForge pour Windows et ouvert le PDF via le programme installé. Ça a marché à merveille, je suis très content.

6voto

non Points 55

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html Le moyen le plus simple d'extraire les polices (Windows).

3voto

Sean Leather Points 158

PDF2SVG version 6.0 de PDFTron fait un travail raisonnable. Il produit des caractères OpenType ( .otf ) par défaut. Utilisez --preserve_fontnames pour préserver "le schéma de dénomination des polices/familles de caractères tel qu'il est obtenu dans le fichier source".

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X