Jak się dowiedzieć, czy plik PDF jest skompresowany, czy nie (i) aby go skompresować

18

Właśnie dowiedziałem się, że pliki PDF można kompresować w celu zmniejszenia ich rozmiaru dysku.

  1. Zastanawiałem się, jak się dowiedzieć, czy plik PDF został już skompresowany?
  2. Jakich aplikacji / poleceń można używać do kompresji lub dekompresji pliku PDF?

Moje środowisko to Linux Ubuntu 10.10.


Niektóre próby nie dają zadowalających rezultatów:

  1. Oto wyniki próby 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
    

    Właściwości plików pokazują, że nie wszystkie są zoptymalizowane.

  2. Wyniki konwersji do ps, a następnie z powrotem do 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 dla wszystkich
źródło
Nie mogę go teraz przetestować, ponieważ nie mam pod ręką skompresowanego pliku PDF, ale spróbuj file. Powinien pokazywać, czy plik jest skompresowany czy nie.
polemon
1
@polemon: Dzięki! Nie ma Nakładane na $file 3.pdfto3.pdf: PDF document, version 1.4
Stack Exchange Network for All
Pamiętaj, że poszczególne strumienie w pliku PDF można skompresować. Pytanie „jest skompresowany cały plik PDF” jest złym pytaniem (choć w wielu przypadkach wszystkie lub większość strumieni zostanie skompresowana lub nieskompresowana).
bezpośrednio

Odpowiedzi:

30

w skrócie:

Aby wiedzieć, czy jest już skompresowany:

strings your.pdf | grep /Filter

Aby (od) kompresować plik PDF, użyj QPDF

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

wyjaśnienie:

Słowo kluczowe „Filtruj” w pliku pdf jest wskaźnikiem zastosowanej metody kompresji. Niektórzy z nich są:

CCITT G3 / G4 - używany do obrazów monochromatycznych
JPEG - algorytm stratny stosowany do obrazów
JPEG2000 - bardziej nowoczesna alternatywa dla JPEG, która jest również używana do kompresji obrazów
Flate - służy do kompresji tekstu oraz obrazów
JBIG2 - alternatywa dla Kompresja CCITT dla obrazów monochromatycznych
LZW - używana do kompresji tekstu oraz obrazów, ale zastępowana przez Flate
RLE - używana do obrazów monochromatycznych
ZIP - używana do obrazów w skali szarości lub kolorowych

(skopiowane stąd ).

Jednak biorąc pod uwagę złożoną strukturę plików PDF, przez większość czasu część (lub „strumień”) pliku PDF będzie już w jakiś sposób skompresowana (i pojawi się podczas grepping / Filter), podczas gdy inna część nie będzie, więc nie ma odpowiedzi TAK / NIE na pytanie, czy plik PDF jest skompresowany.
Jednym ze sposobów rozwiązania tego problemu byłoby dodanie -copcji do grep, która zwraca liczbę wystąpień, dzięki czemu można stosunkowo łatwo zobaczyć, jak dobrze jest skompresowany. na przykład, jeśli zwraca mniej niż 10, jest to dość nieskompresowane.strings "large.pdf" | grep -c /Filter

Inną właściwością związaną z rozmiarem w plikach PDF jest to, czy zostały zoptymalizowane pod kątem szybkiego dostępu, przy czym „zoptymalizowane” pliki PDF mają większy rozmiar, cytat z wikipedii :

Pliki PDF mają dwa układy - nieliniowy (nie „zoptymalizowany”) i liniowy („zoptymalizowany”). Nieliniowe pliki PDF zajmują mniej miejsca na dysku niż ich odpowiedniki liniowe, chociaż dostęp do nich jest wolniejszy, ponieważ części danych wymagane do złożenia stron dokumentu są rozproszone w całym pliku PDF. Liniowe pliki PDF (zwane również „zoptymalizowanymi” lub „zoptymalizowanymi” plikami PDF) są zbudowane w sposób, który umożliwia ich odczytanie we wtyczce przeglądarki internetowej bez czekania na pobranie całego pliku, ponieważ są zapisywane na dysku moda liniowa (jak w kolejności stron). Pliki PDF można optymalizować za pomocą oprogramowania Adobe Acrobat lub QPDF.

Możesz sprawdzić, czy plik PDF jest zoptymalizowany za pomocą pdfinfo your.pdf.

Philomath
źródło
Dzięki! (1) Rezultaty użycia qpdf są podobne do użycia pdftk: w przypadku kompresji rozmiar faktycznie stał się nieco większy (dziwny), a po rozpakowaniu rozmiar stał się znacznie większy, prawie podwojony. (2) Czy pdftk i gpdf próbują osiągnąć to samo, używając opcji kompresji i dekompresji?
StackExchange dla wszystkich
@Tim: (przepraszam, że mnie tu nie było). dla (1), jak wyjaśniłem, plik PDF jest już częściowo skompresowany (najprawdopodobniej), dlatego kompresja nie oszczędza zbyt wiele, (a dekompresja czyni ją znacznie większą, ponieważ dekompresuje wszystkie skompresowane strumienie). (2) najprawdopodobniej qpdfi pdftkzrobić mniej więcej to samo w odniesieniu do kompresji, ale qpdfmoże również zoptymalizować (plus wiele innych rzeczy).
Philomath
10

pdftk to narzędzie do wykonywania niektórych operacji na plikach PDF, takich jak kompresja / dekompresja:

$ pdftk test.pdf output compressed_test.pdf compress
uloBasEI
źródło
Dzięki! Zastanawiałem się, jak się dowiedzieć, czy plik pdf został już skompresowany?
StackExchange dla wszystkich
1
@Tim: pdfinfo file.pdfinformuje, czy plik PDF jest zoptymalizowany . Nie jestem jednak pewien, czy to oznacza kompresję, czy nie.
nico
1
@uloBasEI: Próbowałem twojej komendy za pomocą pdftk do kompresji, ale rozmiar prawie się nie zmienił. Jeśli rozpakuję, rozmiar pliku podwoi się. Wszystkie właściwości oryginalnego pliku, pliku skompresowanego i nieskompresowanego pokazują, że nie są one zoptymalizowane.
StackExchange dla wszystkich
@nico: Dzięki! Zobacz mój komentarz powyżej i moją aktualizację. Wydaje się, że kompresja i optymalizacja nie implikują się nawzajem?
StackExchange dla wszystkich
1

Znalazłem metodę kompresji w pliku pdf. Otwórz plik PDF za pomocą edytora tekstu. Uruchom CCITT Wyszukaj lub Znajdź - jeśli nie znaleziono, wprowadź JPEG, następnie Flate, następnie JBIG2, następnie LZW, następnie RLE, a następnie ZIP.
Brzmi gorzej niż jest! Bardzo łatwo znaleźć metodę kompresji strumienia danych.

bizhubkey1
źródło
To raczej niepewne. Użyłem twojej metody, by sprawdzić nieskompresowany plik PDF (nieskompresowany przez qpdf) używając grep jak w grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" nieskompresowany.pdf i zwraca ten komunikat Plik binarny nieskompresowany.pdf mecze . Wygląda na to, że wykrywa plik nieskompresowany.pdf zawierający zarówno wzorce LZW, jak i RLE.
user91822,
-1

Wystarczy sprawdzić jego właściwości; powie, czy plik jest skompresowany czy nie.

rosni
źródło
Myślę, że pytaniem Heidi jest program, za pomocą którego sprawdzane są właściwości, w szczególności w programach opartych na skryptach.
Caleb
> Wystarczy sprawdzić jego właściwości - którego programu [open source] można jednak użyć do tego celu?
Maxim