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 :
- Convertissez le PDF en PostScript, par exemple à l'aide de l'outil XPDF
pdftops
(sous Windows : pdftops.exe
programme d'aide.
- Les polices seront désormais intégrées dans
.pfa
(PostScript) + vous pouvez les extraire à l'aide d'une éditeur de texte .
- Vous devrez peut-être convertir le
.pfa
(ASCII) à un .pfb
(binaire) en utilisant l'option t1utils
y pfa2pfb
.
- 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 :
- Utilisez le "Police ouverte" boîte de dialogue utilisée lors de l'ouverture des fichiers.
- Sélectionnez ensuite "Extraire du PDF" dans la section filtre de la boîte de dialogue.
- Sélectionnez le fichier PDF contenant la police à extraire.
- 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 :