Extraction de données du flux PDF / Filter / FlateDecode en PHP

je ne peux pas déchiffrer les données dans le flux de la forme:

    56 0 obj 
    << /Length 1242 /Filter /FlateDecode >>
    stream
    x]êΩnƒ Ñ{ûbÀKq¬æâê¢....(whole binary is omitted)
    endstream
    endobj

j'ai essayé d'isoler le contenu binaire (x]êΩnƒ Ñ{ûbÀKq¬æâê¢....) dans un fichier et dans une chaîne binaire. Fonction de décodage gzinflate($encripted_data) m'envoie une erreur de décodage, et je pense que ça arrive parce que le contenu encodé n'est pas "dégonflé" ou ainsi.

Dans le PDF Référence v 1.7 (six édition), sur une page 67, j'ai trouvé la description de /FlateDecode filtre sous la forme: ...Décompresse les données encodées par la méthode de compression zlib / deflate, la reproduction du texte original ou des données binaires

j'ai besoin d'une VRAIE solution brute, alias fonction php ou/et algorithme Que faire de ce flux "FlateDecoded".

Merci!

29
demandé sur Ruben Kazumov 2012-07-31 04:08:51

4 réponses

puisque vous n'avez pas dit si vous avez besoin d'accéder flux décompressé seulement ou si vous avez besoin de tous les flux décompressés, je vais vous suggérer un outil en ligne de commande simple qui le fait en une seule fois pour le PDF complet: Jay Berkenbilt's qpdf.

Exemple de ligne de commande:

 qpdf --qdf --object-streams=disable in.pdf out.pdf

out.pdf peut alors être inspecté dans un éditeur de texte (seuls les profils ICC, les images et les polices intégrés peuvent encore être binaires).

qpdf va aussi réordonner automatiquement les objets et afficher la syntaxe PDF d'une manière normalisée (et vous dire dans un commentaire quel était l'ID de l'objet original de l'objet défait).

si vous avez besoin de compresser à nouveau le fichier (peut-être après l'avoir édité), Lancez juste cette commande:

 qpdf out-edited.pdf out-recompressed.pdf

(vous pouvez voir un message d'avertissement, disant que l'utilitaire tentait de réparer un fichier endommagé....)

disponible à partir de Sourceforge.

46
répondu Kurt Pfeifle 2015-02-27 20:19:54
header('Content-Type: text');           // I going to download the result of decoding
$n = "binary_file.bin";                 // decoded part in file in a directory
$f = @fopen($n, "rb");                  // now file is mine
$c = fread($f, filesize($n));           // now I know all about it 
$u = @gzuncompress($c);                 // function, exactly fits for this /FlateDecode filter
$out = fopen("php://output", "wb");     // ready to output anywhere
fwrite($out, $u);                       // output to downloadable file

Jingle bells! Jingle bells!...

gzuncompress() la solution

13
répondu Ruben Kazumov 2015-01-11 18:54:05

longtemps en retard, mais quelqu'un pourrait le trouver utile. Dans ce cas: < < / Length 1242 / Filter / FlateDecode > > tout ce dont vous avez besoin est de passer la chaîne binaire isolée (donc essentiellement tout ce qui se trouve entre "stream" et "endstream") à zlib.décompresser:

import zlib
stream = b"êΩnƒ Ñ{ûbÀKq¬æ\âê"  # binary stream here
data = zlib.decompress(stream) # Here you have your clean decompressed stream

cependant, si vous avez/DecodeParms dans votre objet PDF la chose devient compliquée. Vous aurez besoin de la valeur / Predictor et du nombre de colonnes. Mieux utiliser PyPDF2 pour cela.

3
répondu Belial 2017-01-13 15:20:17

j'ai simplement utilisé

import de.intarsys.pdf.filter.FlateFilter;

de jpod / Source forge et ça fonctionne bien

FlateFilter filter = new FlateFilter(null);
byte[] decoded = filter.decode(bytes, start, end - start);

les octets sont directement du fichier pdf

-1
répondu Gordon Bartel 2014-11-27 16:16:42