web-dev-qa-db-fra.com

Extraction de données de / Filter / FlateDecode PDF stream in PHP

Je ne peux pas décrypter les données du flux comme:

    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. La fonction de décodage gzinflate($encripted_data) m'envoie une erreur de décodage, et je pense que cela se produit parce que le contenu encodé n'est pas "dégonflé".

Dans PDF Reference v 1.7, (six edition), sur une page 67, j'ai trouvé la description du filtre/FlateDecode comme: ... Décompresse les données encodées à l'aide de zlib/deflate méthode de compression, reproduisant le texte d'origine ou les données binaires

J'ai besoin d'une vraie solution brute, alias fonction php ou/et algorithme, que faire de ce flux "\ FlateDecoded".

Je vous remercie!

34
Ruben Kazumov
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

Vive le vent! Vive le vent!...

gzuncompress() - la solution

15
Ruben Kazumov

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

Exemple de ligne de commande:

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

out.pdf peut ensuite être inspecté dans un éditeur de texte (seuls les profils, images et polices ICC incorporés peuvent toujours être binaires).

qpdf réorganisera également automatiquement les objets et affichera la syntaxe PDF de manière normalisée (et vous indiquera dans un commentaire quel est l'ID d'objet d'origine de l'objet décompressé) était).

Si vous avez besoin de recompresser le fichier à nouveau (peut-être après l'avoir modifié), exécutez simplement cette commande:

 qpdf out-edited.pdf out-recompressed.pdf

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

qpdf est multi-plateforme et disponible auprès de Sourceforge .

53
Kurt Pfeifle

Attendu depuis longtemps, mais quelqu'un pourrait le trouver utile. Dans ce cas: <</Longueur 1242/Filtre/FlateDecode >> tout ce dont vous avez besoin est de passer la chaîne binaire isolée (donc fondamentalement tout entre "stream" et "endstream") à zlib.decompress:

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 objet devenu compliqué. Vous aurez besoin de la valeur/Predictor et du nombre de colonnes. Mieux utiliser PyPDF2 pour cela.

5
Belial