Comment savoir si un fichier PDF est compressé ou non et (dé) compresser

18

Je viens d'apprendre que les fichiers PDF peuvent être compressés pour réduire la taille de leur disque.

  1. Je me demandais comment savoir si un fichier PDF avait déjà été compressé?
  2. Quelles applications / commandes peuvent être utilisées pour compresser ou décompresser un fichier PDF?

Mon environnement est Linux Ubuntu 10.10.


Certaines tentatives ne donnent pas de résultats satisfaisants:

  1. Voici les résultats de l'essai pdftk:

    $ pdftk 3.pdf output 5.pdf uncompress 
    $ pdftk 3.pdf output 3comp.pdf compress 
    $ ls -l 3.pdf 3comp.pdf 5.pdf
    -rwxrwx--- 1 root plugdev  8652269 2011-07-30 12:27 3comp.pdf
    -rwxrwx--- 1 root plugdev  8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 16829828 2011-07-30 12:27 5.pdf
    

    Les propriétés des fichiers montrent que tous ne sont pas optimisés.

  2. Résultats de la conversion en ps puis de nouveau en pdf:

    $ pdf2ps 3.pdf 3.ps
    $ ps2pdf 3.ps 3c.pdf
    $ ls -l 3.pdf 3.ps 3c.pdf
    -rwxrwx--- 1 root plugdev   8808946 2011-07-30 13:14 3c.pdf
    -rwxrwx--- 1 root plugdev   8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 122375966 2011-07-30 13:14 3.ps
    
StackExchange pour tous
la source
Je ne peux pas le tester pour le moment, car je n'ai pas de PDF compressé à portée de main, mais essayez file. Il doit indiquer si le fichier est compressé ou non.
polemon
1
@polemon: Merci! Ce n'est pas le cas. Le résultat $file 3.pdfest3.pdf: PDF document, version 1.4
StackExchange for All
Notez que les flux individuels du fichier PDF peuvent être compressés. Donc, demander "est tout le fichier PDF compressé" n'est pas la bonne question (bien que dans la plupart des cas, la plupart des flux seront compressés ou non compressés).
dirkt

Réponses:

30

en bref:

Pour savoir s'il est déjà compressé:

strings your.pdf | grep /Filter

Pour ( ) compresser un PDF, utilisez QPDF

qpdf --stream-data=compress your.pdf compressed.pdf
qpdf --stream-data=uncompress compressed.pdf uncompressed.pdf  

explication:

Le mot-clé "Filter" dans un fichier pdf est un indicateur de la méthode de compression utilisée. Certains d'entre eux sont:

CCITT G3 / G4 - utilisé pour les images monochromes
JPEG - un algorithme avec perte utilisé pour les images
JPEG2000 - une alternative plus moderne au JPEG, qui est également utilisé pour compresser les images
Flate - utilisé pour compresser le texte ainsi que les images
JBIG2 - une alternative à Compression CCITT pour les images monochromes
LZW - utilisé pour compresser le texte ainsi que les images mais remplacé par Flate
RLE - utilisé pour les images monochromes
ZIP - utilisé pour les images en niveaux de gris ou en couleur

(copié d' ici ).

Cependant, étant donné la structure complexe des fichiers PDF, la plupart du temps, une partie (ou un "flux") du PDF sera déjà compressé d'une certaine manière (et s'affichera lors de la réception / filtrage) tandis qu'une autre partie ne le sera pas, donc il n'y a pas de réponse OUI / NON à la question de savoir si le PDF est compressé.
une façon de résoudre ce problème serait d'ajouter l' -coption à grep, qui renvoie le nombre d'occurrences, de sorte que vous pouvez voir relativement bien la compression. par exemple, si renvoie moins de 10, il est assez non compressé.strings "large.pdf" | grep -c /Filter

Une autre propriété relative à la taille des PDF est de savoir s'ils ont été optimisés pour un accès rapide, les PDF "optimisés" étant de plus grande taille, pour citer wikipedia :

Les fichiers PDF comportent deux dispositions: non linéaire (non "optimisée") et linéaire ("optimisée"). Les fichiers PDF non linéaires consomment moins d'espace disque que leurs homologues linéaires, bien qu'ils soient plus lents à accéder car des parties des données requises pour assembler les pages du document sont dispersées dans le fichier PDF. Les fichiers PDF linéaires (également appelés fichiers PDF "optimisés" ou "optimisés pour le Web") sont construits de manière à pouvoir être lus dans un plug-in de navigateur Web sans attendre le téléchargement du fichier entier, car ils sont écrits sur le disque dans un mode linéaire (comme dans l'ordre des pages). Les fichiers PDF peuvent être optimisés à l'aide du logiciel Adobe Acrobat ou QPDF.

Vous pouvez vérifier si le PDF est optimisé à l'aide de pdfinfo your.pdf.

Philomath
la source
Merci! (1) Les résultats de l'utilisation de qpdf sont similaires à ceux de pdftk: avec compress, la taille est en fait devenue un peu plus grande (étrange) et avec décompresser, la taille est devenue beaucoup plus grande, presque doublée. (2) pdftk et gpdf essaient-ils d'accomplir la même chose en utilisant les options de compression et de décompression?
StackExchange for All
@Tim: (désolé, je n'étais pas ici). pour (1), comme je l'ai expliqué, le PDF est déjà partiellement compressé (très probablement), c'est pourquoi la compression n'économise pas trop (et la décompression le rend beaucoup plus grand, car il décompresse tous les flux compressés). (2) très probablement qpdfet pdftkfont plus ou moins la même chose en ce qui concerne la compression, mais qpdfpeuvent également optimiser (et bien d'autres choses).
Philomath
10

pdftk est un outil pour effectuer certaines opérations sur les fichiers PDF, comme la compression / décompression:

$ pdftk test.pdf output compressed_test.pdf compress
uloBasEI
la source
Merci! Je me demandais comment savoir si un fichier pdf avait déjà été compressé?
StackExchange for All
1
@Tim: pdfinfo file.pdfvous indique si un PDF est optimisé . Cependant, je ne sais pas si cela signifie compressé ou non.
nico
1
@uloBasEI: J'ai essayé votre commande en utilisant pdftk pour la compression, mais la taille n'a presque pas changé. Si je décompresse, la taille du fichier double. Les propriétés du fichier d'origine, du fichier compressé et des fichiers non compressés montrent toutes qu'elles ne sont pas optimisées.
StackExchange for All
@nico: Merci! Voir mon commentaire ci-dessus et ma mise à jour. Il semble que la compression et l'optimisation ne s'impliquent pas?
StackExchange for All
1

J'ai trouvé la méthode de compression dans le fichier pdf. Ouvrez le PDF avec l'éditeur de texte. Exécutez un CCITT de recherche ou de recherche s'il n'est pas trouvé, entrez JPEG, puis Flate, puis JBIG2, puis LZW, puis RLE, puis ZIP.
Ça a l'air pire que ça! Très facile à trouver la méthode de compression du flux de données.

bizhubkey1
la source
C'est assez incertain. J'ai utilisé votre méthode pour vérifier un fichier PDF non compressé (non compressé par qpdf) en utilisant grep comme dans grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" uncompressed.pdf et il renvoie ce message Fichier binaire uncompressed.pdf matchs . Il semble que le fichier uncompressed.pdf contienne à la fois les modèles LZW et RLE.
user91822
-1

Vérifiez simplement ses propriétés; il dira si le fichier est compressé ou non.

rosni
la source
Je pense que la question de Heidi est de savoir avec quel programme vérifier les propriétés, en particulier avec les programmes basés sur la ligne de commande.
Caleb
> Vérifiez simplement ses propriétés - quel programme [open source] pourrait-on utiliser pour ce faire, cependant ??
Maxim