web-dev-qa-db-fra.com

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

Je connais l'utilitaire pdftk.exe qui peut indiquer les polices utilisées par un fichier PDF, qu'elles soient incorporées ou non.

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

150
simplybest55

Vous avez plusieurs options. Toutes ces méthodes fonctionnent sous Linux, ainsi que sous Windows ou Mac OS X. Sachez toutefois que la plupart des fichiers PDF n'incluent pas une police complète, une police de caractères complète lorsqu'ils possèdent une police incorporée. Généralement, ils comprennent uniquement le sous-ensemble de glyphes utilisés dans le document.


Utiliser 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, en utilisant par exemple XPDF pdftops (sous Windows: _pdftops.exe_ programme d’aide.
  2. Les polices seront maintenant intégrées au format _.pfa_ (PostScript) + vous pouvez les extraire à l'aide d'un éditeur de texte .
  3. Vous devrez peut-être convertir le fichier _.pfa_ (ASCII) en un fichier _.pfb_ (binaire) à l'aide des fichiers _t1utils_ et _pfa2pfb_.
  4. Dans les PDF, il n'y a jamais de fichiers _.pfm_ ou _.afm_ (fichiers de métrique de police) incorporés (car le visualiseur PDF en a une connaissance interne). Sans ceux-ci, les fichiers de polices sont difficilement exploitables visuellement.

Utiliser fontforge

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

  1. Utilisez la boîte de dialogue "Ouvrir la police" utilisée lors de l’ouverture des fichiers.
  2. Puis sélectionnez "Extraire du PDF" dans la section filtre de la boîte de dialogue.
  3. Sélectionnez le fichier PDF avec la police à extraire.
  4. A La boîte de dialogue "Choisir une police" s'ouvre. Sélectionnez ici la police à ouvrir.

Consultez le manuel de FontForge. Vous devrez peut-être suivre certaines étapes spécifiques, qui ne sont pas nécessairement simples, afin de sauvegarder les données de police extraites sous forme de fichier réutilisable.


Utiliser mupdf

Ensuite, MuPDF . Cette application est fournie avec un utilitaire appelé pdfextract (sous Windows: _pdfextract.exe_), qui permet d’extraire des polices et des images à partir de fichiers PDF. (Si vous ne connaissez pas MuPDF, qui est encore relativement inconnu et nouveau: "" MuPDF est un visualiseur léger et léger [PDF et une boîte à outils écrits en C portable. ", écrit par les développeurs d'Artifex Software, la même société qui nous a donné Ghostscript.)
( Mise à jour: Les versions les plus récentes de MuPDF ont déplacé l'ancienne fonctionnalité de 'pdfextract' vers la commande 'extrait mutool' . Téléchargez-le 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. Généralement, vous verrez une variété de fichiers: images ainsi que des polices. Il s’agit des fichiers PNG, TTF, CFF, CID, etc. Les noms d’image seront comme img-0412.png si le numéro d’objet PDF de l’image était 412. Les noms de police seront comme FGETYK + LinLibertineI-0966.ttf , si le numéro d'objet de la police PDF était 966.

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

Encore une fois: sachez que la plupart de ces fichiers de polices ne peuvent contenir qu'un sous-ensemble et ne représentent pas nécessairement la police de caractères complète.

Mise à jour: (juil. 2013) Les versions récentes de mupdf ont connu un remaniement interne et un changement de nom de leurs fichiers binaires, pas une fois, mais plusieurs fois. L’utilité principale était jadis un binaire du type "couteau suisse" appelé mubusy (nom inspiré par busybox?), Rebaptisé plus récemment en mutool. Ceux-ci supportent les sous-commandes info, clean, extract, poster et show. Malheureusement, la documentation officielle de ces outils n'est pas (pour le moment) à jour. Si vous utilisez un Mac utilisant 'MacPorts': l'utilitaire a été renommé afin d'éviter les conflits de noms avec d'autres utilitaires utilisant des noms identiques. Il est possible que vous deviez utiliser mupdfextract.

Pour obtenir les résultats (à peu près) équivalents avec mutool comme l'ancien outil pdfextract, exécutez simplement _mubusy extract ..._. *.

Donc, 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)
_

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


Utilisation de gs (Ghostscript)

Ensuite, Ghostscript peut également extraire des polices directement à partir de fichiers PDF. Cependant, il a besoin de l'aide d'un utilitaire spécial nommé extractFonts.ps , écrit en langage PostScript, qui est disponible depuis le référentiel de code source Ghostscript .

Maintenant, utilisez-le, vous devez exécuter à la fois ce fichier _extractFonts.ps_ et votre fichier PDF. Ghostscript utilisera ensuite les instructions du programme PostScript pour extraire les polices du fichier PDF. Cela ressemble à ceci sur Windows (oui, Ghostscript comprend la 'barre oblique', /, comme séparateur de chemin également 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à, l'extraction de * .ttf (TrueType) était parfaite. Je ne sais pas si d'autres types de polices seront également extraits et, le cas échéant, de manière réutilisable. Je ne sais pas si l'utilitaire bloque l'extraction des polices marquées comme protégées.


Utilisation de _pdf-parser.py_

Enfin, Didier Stevens ' pdf-parser.py : celui-ci n'est probablement pas aussi facile à utiliser, car vous devez avoir une certaine connaissance des structures internes PDF. _pdf-parser.py_ est un script Python qui peut également faire beaucoup d'autres choses. Il peut également décompresser et extraire des flux arbitraires d'objets et, par conséquent, extraire également des fichiers de polices 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 respectant 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
  >>   
_

Cela me dit qu'il y a deux instances de _FontFile2_ dans le PDF, et que celles-ci se trouvent dans PDF objets no. 15 et non. 16, respectivement. N ° d'objet 15 contient le _/FontFile2_ pour la police /ArialMT , objet n °. 16 contient le _/FontFile2_ pour la police /Arial-BoldMT .

Pour montrer cela plus clairement:

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

Un rapide aperçu de la spécification PDF révèle que le mot clé _/FontFile2_ est associé à un flux 'contenant un programme de polices TrueType' (_/FontFile_ se rapporterait à un flux 'contenant un programme de polices de type 1' et _/FontFile3_ se rapporterait à un flux 'contenant un programme de polices dont le format est spécifié par l'entrée Sous-type dans le dictionnaire de flux ' {étant donc un Type1C ou un CIDFontType0C sous-type}.)

Pour examiner spécifiquement le PDF objet 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 objet contient un flux (qu’il ne verra pas directement) d’une longueur de 1.581.435 octets et est codé (== "compressé") avec ASCIIHexEncode et doit être décodé ( == "décompressé" ou "filtré") à l'aide du filtre standard _/ASCIIHexDecode_.

Pour vider n'importe quel flux d'un objet, _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 fichier de données extrait sera dans le fichier nommé dumped-data.ext . Voyons combien c'est grand:

_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 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 un fichier codé ASCII hex.

L’ouverture du fichier avec un outil de lecture de police tel que otfinfo (il s’agit d’une partie du paquet _lcdf-typetools_)) va conduire à 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_ utiliser pleinement sa magie: vider un flux filtré et décodé. Pour cela, nous devons ajouter 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 également déjà stocké dans le PDF objet no. 15 dictionnaire comme valeur pour la clé _/Length1_...

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

_file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data
_

Qu'est-ce que otfinfo nous en dit?

_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. Étant donné la taille de ce fichier (778.552 octets), il semble que cette police ait été incorporée même complètement dans le fichier PDF ...

Nous pourrions le renommer en arial-regular.ttf , l'installer en tant que tel et l'utiliser avec joie.


Mises en garde:

  • Dans tous les cas, vous devez suivre la licence qui s'applique à la police. Certaines licences de polices n'autorisent pas l'utilisation et/ou la distribution gratuites. Pirater des polices, c'est comme pirater un logiciel ou autre matériel protégé par le droit d'auteur.

  • La plupart des PDF qui se trouvent dans la nature n'intègrent de toute façon pas la police complète, mais seulement des sous-ensembles. L'extraction d'un sous-ensemble d'une police n'est utile que dans une étendue très limitée, voire pas du tout.

Veuillez également lire ce qui suit sur les avantages et les inconvénients de l'extraction de polices:

375
Kurt Pfeifle

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

22
igo

Finalement trouvé le paquet d'installation de Windows de FontForge et ouvert le PDF via le programme installé. Travaillé un régal, si heureux.

5
Dapizz

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

4
l00k

PDF2SVG version 6.0 de PDFTron fait un travail raisonnable. Il produit les polices OpenType (.otf) par défaut. Utilisez --preserve_fontnames pour conserver "le schéma de nommage police/famille de polices obtenu à partir du 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 l’utilisation de cette dernière). Il se peut que d’autres produits PDFTron extraient également des polices, mais je n’ai découvert moi-même que récemment PDF2SVG.

2
Sean Leather

Un des meilleurs outils en ligne actuellement disponibles pour extraire les polices pdf est http://www.pdfconvertonline.com/extract-pdf-fonts-online.html

1

Ceci fait suite à la section font-forge de réponse de @ Kurt Pfeifle , spécifique à Red Hat (et éventuellement à d'autres distributions Linux).

  1. Après avoir ouvert le PDF et sélectionné la police souhaitée, vous souhaiterez sélectionner l'option "Fichier -> Générer les polices ...".
  2. S'il y a des erreurs dans le fichier, vous pouvez choisir de les ignorer ou de sauvegarder le fichier et de les éditer. La plupart des erreurs peuvent être corrigées automatiquement si vous cliquez suffisamment de fois sur "Corriger".
  3. Cliquez sur "Elément -> Informations sur la police ...", et "Nom de la police", "Nom de famille" et "Nom des humains" sont tous réglés sur les valeurs que vous aimez. Sinon, modifiez-les et enregistrez le fichier quelque part. Ces noms détermineront comment votre police apparaît sur le système.
  4. Sélectionnez votre nom de fichier et cliquez sur "Enregistrer ..."

Une fois que vous avez votre fichier TTF, vous pouvez l’installer sur votre système en

  1. Copie dans le dossier /usr/share/fonts (en tant que root)
  2. Lancer fc-cache -f /usr/share/fonts/ (en tant que root)
0
Mad Physicist