Codage de police PDF-pourquoi ne puis-je pas copier le texte d'un PDF? [fermé]

après avoir converti un fichier PDF, Je ne peux plus copier le texte.

Tout ce que j'obtiens ce sont des caractères illisibles qui n'ont aucun sens.

la police est le Script Français MT, mais l'encodage est personnalisé (voir le résultat de Adobe reader > File > propriétés du Document > Font).

Ici est le PDF.

j'ai essayé plusieurs méthodes... édition en format PDF; notepad++; Word; Acrobat Pro.

  • y a-t-il quelque chose de mal avec le code source du fichier PDF qui empêche la copie correcte des éléments de texte?

  • le code source de ce PDF peut-il être changé/modifié/modifié de façon à ce que la copie+le collage du texte fonctionne?

21
demandé sur Kurt Pfeifle 2012-10-03 11:00:10

1 réponses

j'ai regardé votre fichier en utilisant différents outils:

  • qpdf (par Jay Berkenbilt) pour analyser le fichier.
  • pdfid.py et pdf-parser.py (par Didier Stevens) pour analyser plus.
  • Pdflib's TET (outil d'extraction de texte) pour essayer d'extraire du texte.
  • Pdflib's Police Journaliste Acrobat{, Lecteur} plugin pour générer une table avec des glyphes utilisés par le PDF.
  • Poppler pdffonts utilitaire en ligne de commande.

même TET n'a pas réussi à extraire le texte. Et TET est le meilleur que je connaisse pour cette tâche -- il réussit souvent là où d'autres méthodes échouent.

Mon analyse m'a donné les résultats suivants:

  1. pdffonts donne un premier aperçu rapide. Il retourne les informations suivantes:

    $ pdffonts "so#12703387-problem.pdf" 
    
       name                      type         encoding    emb sub uni object ID
       ------------------------- ------------ ----------- --- --- --- ---------
       YLWHHJ+FrenchScriptMT     Type 1C      Custom      yes yes no      14  0
    

    La colonne uni doit contenir un yes entrée. no dans cette colonne indique qu'un /ToUnicode la table est manquante dans la police utilisée par le PDF. Que la police est intégrée comme un sous-ensemble sous le nom de YLWHHJ+FrenchScriptMT. Il utilise également un Custom encodage de la police (très probablement en utilisant un /Differences array). Sans une correcte et complète /ToUnicode tableau il sera impossible d'extraire le texte correctement.

  2. le créateur de PDF utilisé pour générer Ce PDF était PDFCreator Version 1.0.2 basé sur la très ancienne version de Ghostscript 8.70. (Ceci est révélé en exécutant "pdfinfo so#12703387-problem.pdf".)

  3. La police utilisée est un sous-ensemble de FrenchScriptMT, contenant 94 glyphes différents.

  4. l'encodage de la police est "personnalisé", en utilisant un /Differences tableau.

  5. le dessin de texte dans le PDF utilise principalement l'opérateur TJ, qui permet le positionnement individuel du glyphe.

  6. toutes les opérations de dessin de texte font large utilisation de la fonction "positionnement glyphe individuel". Presque tous les glyphes sont positionnés individuellement, comme vous pouvez le voir à partir de cet extrait de code (première occurrence de TJ):

    [<01>-3.18894<02>3.62397<02>3.62397<03>-2.42535<04>3.12889<05>3.88047<06>
    -14.1669<07>-3.7221<02>-4.37556<04>3.62397(\b)-4.88286(\t)3.88047<01>
    -3.18874(\n)1.29105<06>-13.6718(\b)-4.88245<0b>1.78573<02>3.1293<06>
    -21.6714<04>3.62438(\f)0.553714(\r)0.0464142<0e>-1.28494<0f>-0.448671<10>
    3.88007<06>-21.6714(\b)-4.88245<0b>1.78573<02>3.1293<06>-13.6718<11>
    0.0920142<02>-4.37515<04>3.62438(\b)2.622<06>-13.6718<03>
    -10.4245(\t)3.88007<11>0.0920142<02>3.62438<12>-6.14134(\b)3.11708<13>
    3.3858<14>0.0455999<15>-7.42628<06>-14.1669<16>2.90048(\r)0.0455999<17>
    -1.88425(\r)0.0455999<0b>1.78654(\r)]TJ
    
  7. Comme on peut le voir à partir de '6.', le le dessin ne pas utiliser 'une séquence de caractères entre parenthèses ( )', mais utiliser 'données hexadécimales placée entre crochets < >' (voir PDF spec, chapitre 7.3.4.1).

  8. les valeurs hexadécimales des noms de caractères ne correspondent pas facilement aux noms de caractères (bien qu'elles soient supposées être dérivées de WinAnsiEncoding).

    il faut rechercher l'encodage personnalisé table pour sa première.

    j'ai utilisé la commande pdf-parser.py -s encoding so#12703387-problem.pdf pour cela. Résultat:

        <<
           /Type /Encoding
           /BaseEncoding /WinAnsiEncoding
            /Differences [
         1
            /g81 /g72
            /g71 /g86
            /g30 /g3
            /g53 /g87
            /g76 /g74
                 (... skipping some lines of output ...)
            /g32 /g170
            /g105 /g103
            /g95 ]
          >>
    
  9. Maintenant que le dernier point expose l'essentiel de la question: la table d'encodage de la police n'utilise pas de noms de caractères standard. Au lieu de cela il utilise 1,/g81,/g72,... /g95 (au total 94 noms différents).

  10. mon dernier point sur les noms de glyphe est également confirmé par les résultats du FontReporter de PDFlib plugin:

    PDFFontReporter results

  11. Pas automatiquement outil de travail pour l'extraction du texte (aucun de ceux que je connais, au moins) pourrait faire de têtes et de queues de ce gâchis. Un expert humain pourrait, mais je n'ai même pas essayé (parce que cela ne vous aiderait pas beaucoup -- voir mon CV pour une meilleure aide).

  12. la meilleure façon, en général, pour l'extraction automatisée de texte pour ce type d'encodage de police est d'utiliser OCR (reconnaissance optique de caractères) de logiciels. Toutefois, dans ce cas, le type de police 'French Script MT') ne fonctionnera pas bien avec la ROC.

  13. en théorie, il devrait être possible d'ajouter du code PDF au fichier PDF existant qui ajoute en fait le/ToUnicode tableau. Je ne connais aucun outil qui pourrait faire ça automatiquement. Ajouter ceci impliquerait:

    • re-verse engineering le fichier PDF, puis
    • écrire la table à la main, puis
    • l'insérant à l'endroit correct du fichier PDF comme un objet PDF séparé, puis
    • insérant une entrée pointant vers cette table dans le dictionnaire de l'objet font, et enfin
    • mettre à jour le fichier PDF xref table avec l'octet correct offsets à tous les ID d'objet qui ont été touchés par les changements.

Resume -- Mon conseil pour vous:

  1. recréez votre PDF.
  2. si possible, basez votre créateur PDF sur une version plus récente de Ghostscript.
  3. modifier le paramètre de PDFCreator pour qu'il ne crée plus de sous-ensemble de police. Assurez-vous que la police originale est entièrement intégré.

alors très probablement, le problème d'encodage de la police disparaîtra et vous pourrez copier le texte de votre PDF.


mise à Jour:

j'ai créé 5 exemples de fichiers PDF codés à la main qui exposent le problème causé par un fichier manquant ou incorrect/manipulé /ToUnicode tableau dans un fichier PDF. Ces échantillons sont maintenant engagés dans notre récemment créé GitHub dédié à fournir des exemples de fichiers PDF qui peuvent être utilisés pour étudier, apprendre et explorer la syntaxe PDF en regardant leur code source. Ces 5 fichiers sont sous-répertoire 'textextract':

52
répondu Kurt Pfeifle 2017-08-09 03:47:36