Comment puis-je extraire des polices intégrées d'un PDF en tant que fichiers de polices valides?

161

Je connais l' pdftk.exeutilitaire qui peut indiquer quelles polices sont utilisées par un PDF, et si elles sont incorporées ou non.

Maintenant, le problème: étant donné que j'avais des fichiers PDF avec des polices intégrées, comment puis-je extraire ces polices de manière à ce qu'elles soient réutilisables en tant que 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?

Kurt Pfeifle
la source

Réponses:

405

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


En utilisant 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 XPDF pdftops(sous Windows: pdftops.exeprogramme d'assistance.
  2. Les polices seront désormais incorporées au .pfaformat (PostScript) + vous pouvez les extraire à l'aide d'un éditeur de texte .
  3. Vous devrez peut-être convertir le fichier .pfa(ASCII) en .pfbfichier (binaire) à l'aide de t1utilset pfa2pfb.
  4. Dans les PDF, il n'y a jamais de fichiers .pfmou de .afmfichiers (fichiers de métriques de polices) incorporés (car le visualiseur PDF a des connaissances internes à ce sujet). Sans ceux-ci, les fichiers de polices ne sont guère utilisables d'une manière visuellement agréable.

En utilisant fontforge

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

  1. Utilisez la boîte de dialogue "Ouvrir la police" 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 avec la police à extraire.
  4. Une boîte de dialogue "Choisir une police" s'ouvre - sélectionnez ici la police à ouvrir.

Consultez le manuel 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 forme de fichier réutilisable.


En utilisant mupdf

Ensuite, MuPDF . Cette application est livrée avec un utilitaire appelé pdfextract(sous Windows :) pdfextract.exequi peut extraire des polices et des images à partir de PDF. (Au cas où vous ne connaissez pas MuPDF, qui est encore relativement inconnu et nouveau: "MuPDF est un visualiseur PDF léger gratuit et une boîte à outils écrite en C. portable" , écrit par les développeurs d'Artifex Software, la même société qui nous a donné Ghostscript. )
( Mise à jour: les nouvelles versions 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.exeest 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 courant. En général, vous verrez une variété de fichiers: des images ainsi que des polices. Ceux-ci incluent 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 PDF était 966.

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

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

Mise à jour: (juillet 2013) Les versions récentes de mupdfont vu un remaniement interne et un changement de nom de leurs binaires, pas seulement une fois, mais plusieurs fois. Le principal utilitaire était un binaire semblable à un «couteau suisse» appelé mubusy(nom inspiré de busybox?), Qui a été renommé plus récemment mutool. Ceux - ci prennent en charge les sous-commandes info, clean, extract, posteret 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 mutoolcomme le pdfextractfaisait son outil précédent , exécutez simplement 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)

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 programme utilitaire spécial nommé extractFonts.ps, écrit en langage PostScript, qui est disponible dans le référentiel de code source de Ghostscript .

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


En utilisant pdf-parser.py

Enfin, pdf-parser.py de Didier Stevens : celui-ci n'est probablement pas aussi simple à utiliser, car il faut avoir un certain savoir-faire sur les structures PDF internes. pdf-parser.pyest un script Python qui peut faire beaucoup d'autres choses aussi. Il peut également décompresser et extraire des flux arbitraires d'objets, et donc également extraire des fichiers de polices incorporés.

Mais vous devez savoir ce qu'il faut rechercher. Voyons cela avec un exemple. J'ai un fichier nommé big.pdf . Dans un premier temps, j'utilise le -sparamètre pour rechercher dans le PDF toute occurrence du mot-clé FontFile ( pdf-parser.pyne 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
  >>   

Cela me dit qu'il y a deux instances de l' FontFile2intérieur du PDF, et ce sont des objets PDF non. 15 et non. 16, respectivement. Objet no. 15 contient la /FontFile2police for / ArialMT , objet no. 16 contient la /FontFile2police for / 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-clé se /FontFile2rapporte à un `` flux contenant un programme de polices TrueType '' ( /FontFilese rapporterait à un `` flux contenant un programme de polices de type 1 '' et /FontFile3se rapporterait à un `` flux contenant un programme de polices dont le format est spécifié par l'entrée de sous-type dans le dictionnaire de flux ' {étant donc un sous-type Type1C ou CIDFontType0C }.)

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

pdf-parser.py -o 15 big1.pdf

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

Cette pdf-parser.pysortie nous indique que cet objet contient un flux (qu'il n'affichera 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 /ASCIIHexDecodefiltre standard .

Pour vider n'importe quel flux d'un objet, pdf-parser.pypeut être appelé avec le -d dumpnameparamè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 regardez, 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 encodées en hexadécimal ASCII.

Ouvrir le fichier avec un outil de lecture de polices comme otfinfo(ceci fait partie du lcdf-typetoolspackage ) 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.pyutiliser toute sa magie: vider un flux filtré et décodé. Pour cela, nous devons ajouter le -fparamè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 également déjà stocké dans l'objet PDF no. 15 dictionnaire comme valeur de clé /Length1...

Que filepense-t-il?

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

Que otfinfonous en dit-il?

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: nous avons en pdf-parser.pyeffet extrait un fichier de police valide. Compte tenu de la taille de ce fichier (778,552 octets), il semble que cette police ait été intégrée même complètement dans le PDF ...

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


Mises en garde:

  • Dans tous les cas, vous devez suivre la licence qui s'applique à la police. Certaines licences de polices ne permettent pas une utilisation et / ou une distribution gratuites. Le piratage des polices est comme le piratage de tout logiciel ou autre matériel protégé par le droit d'auteur.

  • La plupart des fichiers PDF à l'état sauvage n'intègrent de toute façon pas la police complète, mais uniquement des sous-ensembles. Extraire un sous-ensemble d'une police n'est utile que dans une portée très limitée, voire pas du tout.

Veuillez également lire ce qui suit à propos des avantages et (plus) des inconvénients concernant les efforts d'extraction de polices:

Kurt Pfeifle
la source
3
@ kizzx2: n'hésitez pas à voter pour ou contre l'une de mes autres réponses [PDF] ou [Ghostscript] :-)
Kurt Pfeifle
Si vous êtes sur Mac et installez mupdf à partir des ports (ou peut-être aussi du binaire), l'extraction est également appelée mupdfextract. Vous pouvez l'exécuter à partir du terminal, tant qu'il se trouve dans le chemin.
Orwellophile
@Orwellophile: merci pour l'indice. J'en ai profité pour mettre à jour certains de mes indices mupdf. Voir aussi ça ...
Kurt Pfeifle
Je vais les vérifier. Et juste pour que ce ne soit pas un commentaire inutile: votre processus a fonctionné IMPRESSIONNANT ... (voté pour) ... il a extrait et nommé 3 variantes de la police, puis j'ai utilisé fontforge (également gratuit de macports) pour fusionner. Malheureusement ma police n'a toujours pas la majuscule "X" ... Quelles sont les chances: p
Orwellophile
1
@Chris: oui, ce sont deux sous-ensembles différents (qui peuvent même se chevaucher dans une grande partie) .Il n'y a pas d'option pour les fusionner automatiquement.
Kurt Pfeifle
27

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

je vais
la source
Dans mon cas, il ne pouvait extraire que les polices de type 1 et non TrueType
koppor
J'ai extrait des polices en utilisant ce site et je les ai copiées sur ~/.fonts, et le copier-coller fonctionnait!
Eduardo Santana le
3

Même si cette question date de 10 ans, elle est toujours valable et, à mesure que la technologie évolue, une réponse valide change également.

En recherchant les réponses actuelles, aucun d'entre eux n'a remarqué le WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ) qui peut être utilisé pour recréer les caractères individuels (glyphes) et les afficher avec précision dans une page Web.

À l'aide de la page Web en ligne gratuite d'IDR Solutions, PDF en HTML5 ( lien ), convertissez un PDF en fichier zip. Dans le zip résultant sera un répertoire de polices de types de fichiers woff. Les navigateurs Internet actuels prennent en charge les fichiers woff si vous ne le saviez pas. ( référence ) Ceux-ci peuvent être consultés sur le site en ligne FontDrop! ( lien ).

Les fichiers WOFF peuvent être convertis vers / depuis OTF ou TTF chez WOFFer - Convertisseur de polices WOFF

De plus, le fichier zip de PDF à HTML5 contiendra un fichier HTML pour chaque page du PDF qui peut être ouvert dans un navigateur Internet et est l'une des traductions PDF les meilleures et les plus précises que j'ai trouvées ou vues.

Bien que j'apprenne à utiliser les fichiers WOFF, cela vaut la peine de le transmettre. Prendre plaisir.

PS, je mettrai probablement à jour avec plus d'informations au fur et à mesure que j'en apprendrai plus sur l'utilisation des types de fichiers woff, mais comme il s'agit de creative commons, n'hésitez pas à modifier cette réponse si vous avez quelque chose de valeur à transmettre.

Guy Coder
la source
Je vous remercie! Cette solution fonctionne pour moi (comme pour créer un TTF valide) alors que les autres que j'ai essayées ne le font pas. Est-ce parce que WOFF gère mieux les polices incomplètes?
Daan le
@Daan Is it because WOFF handles incomplete fonts better?je n'ai aucune idée. Votre supposition serait aussi bonne qu'une mienne. Comme je l'ai noté, je suis en train d'apprendre sur WOFF moi-même.
Guy Coder le
@Daan Vous devriez peut-être publier Is it because WOFF handles incomplete fonts better?une nouvelle question SO et d'autres personnes ayant plus de connaissances verront et, espérons-le, fourniront une réponse significative.
Guy Coder le
Je pourrais faire ça. Merci.
Daan le
2

PDF2SVG version 6.0 de PDFTron fait un travail raisonnable. Il produit des polices OpenType ( .otf) par défaut. Utilisez --preserve_fontnamespour conserver «le schéma de dénomination des polices / familles 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 comprend des filigranes sur la sortie SVG mais ne restreint pas l'utilisation). Il peut y avoir d'autres produits PDFTron qui extraient également des polices, mais je n'ai découvert que récemment PDF2SVG moi-même.

Cuir Sean
la source
Malheureusement, --preserve_fontnamescela ne fonctionne pas si vous avez des polices partielles qui se chevauchent - il semble ne pas inclure le préfixe, par exemple, le MSCIYGin MSCIYG+Ge'ez-1, donc écrase les partiels précédents.
Chris
0

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

  1. Après avoir ouvert le PDF et sélectionné la police souhaitée, vous devrez sélectionner l'option "Fichier -> Générer des polices ...".
  2. S'il y a des erreurs dans le fichier, vous pouvez choisir de les ignorer ou d'enregistrer le fichier et de les modifier. La plupart des erreurs peuvent être corrigées automatiquement si vous cliquez suffisamment de fois sur "Réparer".
  3. Cliquez sur "Élément -> Informations sur la police ...", et "Nom de police", "Nom de famille" et "Nom pour les humains" sont tous définis 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 le nom de votre fichier et cliquez sur "Enregistrer ..."

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

  1. Copier dans le dossier /usr/share/fonts(en tant que root)
  2. Exécution fc-cache -f /usr/share/fonts/(en tant que root)
Physicien fou
la source