opcja kompresji pdftk

94

Używam pdftk do kompresji pliku PDF za pomocą następującego wiersza poleceń

pdftk file1.pdf output file2.pdf compress

Działa, gdy zmniejszyła się waga mojego pliku.

Czy są [opcje] zmiany kompresji ???

A może inne rozwiązania do kompresji mojego pliku? Jest ciężki, ponieważ niektóre grafiki mają dużo punktów . Czy istnieje sposób na przekonwertowanie tych wykresów na przykład do formatu jpg i dostosowanie kompresji?

RockScience
źródło
1
Z mojego doświadczenia wynika, że ​​to zależy, co znajduje się w Twoim pliku PDF. Jeśli na przykład jest to wykres z wieloma kropkami, najlepszym rozwiązaniem jest przekonwertowanie wykresu na png i dołączenie tego png do pliku PDF.
RockScience,

Odpowiedzi:

122

Miałem ten sam problem i znalazłem dwa różne rozwiązania ( więcej szczegółów w tym wątku ). Obie radykalnie zmniejszyły rozmiar mojego nieskompresowanego pliku PDF.

  • Pikselowane (stratne):

    convert input.pdf -compress Zip output.pdf
    
  • Niespikselowane (bezstratne, ale może wyświetlać się nieco inaczej):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=output.pdf input.pdf
    

Edycja : właśnie odkryłem inną opcję (dla bezstratnej kompresji), która pozwala uniknąć nieprzyjemnego polecenia gs. qpdf to zgrabne narzędzie, które konwertuje pliki PDF (kompresja / dekompresja, szyfrowanie / deszyfrowanie) i jest znacznie szybsze niż polecenie gs:

qpdf --linearize input.pdf output.pdf
nullglob
źródło
3
Niesamowite. gs pracował dla mnie, konwertując plik 4MB do 339K. Wystąpiła utrata jakości, ale spełniło to moje zadanie wystarczająco.
Sridhar Sarnobat
27
Możesz użyć ustawienia „drukarka” PDF, aby uzyskać lepszą jakość:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
imriss
10
Aby dostosować jakość (a tym samym rozmiar), zmień wartość USTAWIENIA PDF. Zobacz ghostscript.com/doc/current/Ps2pdf.htm#Options
1in9ui5t
6
Zauważ, że gspolecenie w odpowiedzi nie jest dokładnie bezstratne, ponieważ obniża rozdzielczość i jakość osadzonych plików JPG. Ale to jest bezstratne. tekst, zachowując go jako tekst, podczas gdy convertpolecenie konwertuje go na grafikę rastrową.
tanius
14
Ustawienie opcji -dPDFSETTINGS=na /ebookdaje mi bardzo ładny wynik: oczywiście, jest skompresowany i niektóre artefakty jpg są widoczne, ale jest całkowicie czytelny dla rozsądnego rozmiaru. Dzięki!
Joël
35

ta procedura działa całkiem nieźle

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

Spróbuj.

jortizromo
źródło
8
To nie jest rozwiązanie ogólne. W wielu przypadkach wynikowy plik PDF jest większy.
rotskoff
4
To działało najlepiej ze wszystkich wymienionych rozwiązań. Kilka dużych obrazów zmniejszyło się z 23 MB do 1,4 MB przy zdecydowanie najmniejszej utracie jakości.
AerandiR
1
@rotskoff Prawdopodobnie nie ma ogólnego rozwiązania, ponieważ istnieją różne typy dokumentów. Jednak rozumiem twój punkt widzenia. Byłoby miło mieć oprogramowanie sprawdzające, co jest dla nas najlepsze.
tiktak
Dzięki, to zadziałało dla mnie, podczas gdy qpdf i gs nie zmniejszyły rozmiaru pliku wyjściowego.
sebastian
1
Jak wspomniano tutaj, kolejną wadą tej metody jest to, że przerywa ona linki URL w dokumencie.
ptomato,
31

Próbuję skompresować plik PDF, który utworzyłem za pomocą plików tiff 400ppi, głównie 8-bitowych, kilka 24-bitowych, z kompresją PackBits, przy użyciu tiff2pdfskompresowanego za pomocą Zip / Deflate. Miałem jeden problem z każdą z tych metod: żadna z powyższych metod nie zachowała spisu zakładek, które starannie ręcznie utworzyłem w programie Acrobat Pro X. Nawet nie zalecane ebookustawienie dla gs. Jasne, mogłem po prostu otworzyć kopię oryginału z nienaruszonym spisem treści i wykonać, Replace pagesale niestety żadna z tych metod nie wykonała zadowalającej pracy na początku. Albo zmniejszyli rozmiar tak bardzo, że jakość była niedopuszczalnie pikselowana, albo w ogóle nie zmniejszyli rozmiaru, aw jednym przypadku faktycznie zwiększyli go pomimo utraty jakości.

pdftk compress:

no change in size
bookmarks TOC are gone

gs screen:

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer:

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs ebook:

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize:

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps:

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf:

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone
hmj6jmh
źródło
2
To niezwykle cenne badanie (dziękuję!), Ale też nie jest to odpowiedź na tyle, że przez chwilę myślałem o oddaniu głosów przeciw.
ndemou
3
Dlaczego to nie jest odpowiedź?
hmj6jmh
22

Jeśli rozmiar pliku jest nadal zbyt duży, może pomóc użycie ps2pdf do zmniejszenia rozdzielczości utworzonego pliku pdf:

pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

Dostosuj wartość opcji -dColorImageResolution , aby uzyskać wynik odpowiadający Twoim potrzebom (wartość opisuje rozdzielczość obrazu w DPI). Jeśli plik wejściowy jest w skali szarości, zastępując Kolor poprzez Grey lub stosując obie opcje w powyższej komendzie mogłaby również pomóc. Dalsze dostrajanie jest możliwe poprzez zmianę opcji -dPDFSETTINGS na / default lub / printer . Wyjaśnienia dotyczące wszystkich możliwych opcji znajdują się w podręczniku ps2pdf .

Dominik
źródło
1
Dzięki za napiwek. Dzięki -dPDFSETTINGS mogłem zmniejszyć rozmiar zeskanowanego pliku PDF
eshwar
2
DZIĘKUJĘ CI. Nie sądzę, że istnieje ogólne rozwiązanie dla każdego przypadku użycia - ale wypróbowałem prawie każde rozwiązanie w tym wątku i jest to jedyne, które działało dla mnie !!! Możliwość „dostrojenia” parametru dColorImageResolution była kluczowa - należało uzyskać rozmiar dokumentu na tyle mały, aby witryna rządowa go zaakceptował, ale wystarczająco duży, aby był czytelny. Dzięki, wujku Samie, za kolejną bolesną obręcz do przeskoczenia :)
Michael Klear
4

Po wypróbowaniu gpdf, jak sugerował nullglob , stwierdziłem, że otrzymałem te same wyniki kompresji (plik ~ 900 MB do ~ 30 MB), używając po prostu drukarki cups-pdf. Może to być łatwiejsze / preferowane, jeśli już przeglądasz dokument i potrzebujesz tylko skompresować jeden lub dwa dokumenty.

W Ubuntu 12.04 możesz to zainstalować przez

sudo apt-get install cups-pdf

Po instalacji sprawdź Narzędzia systemowe > Administracja > Drukowanie > kliknij prawym przyciskiem myszy „PDF” i ustaw go na „Włącz”

Domyślnie wynik jest zapisywany w folderze o nazwie PDF w katalogu domowym.

ryanjdillon
źródło
4

Jednowierszowa opcja pdf2ps (autorstwa Lee) faktycznie zwiększyła rozmiar pliku PDF. Jednak te dwa kroki okazały się lepsze. I można to połączyć w jeden za pomocą przekierowania z & do standardowego wejścia / wyjścia i potoków:

pdf2ps duży.pdf - | ps2pdf - mały.pdf

zredukowaliśmy plik PDF wygenerowany przez xsane z 18 Mo do 630 ko!

Łącza się gubią, ale w obecnym przykładzie to nie problem ... i był to najłatwiejszy sposób na osiągnięcie pożądanego rezultatu.

E. Curis
źródło
Zamiast ps2pdftego możesz spróbować , zobacz mój komentarz do odpowiedzi @ Lee.
myrdd
3

pdf2ps large.pdf small.pdf wystarczy, zamiast dwóch kroków

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

Jednak ps2pdf large.pdf small.pdfjest to lepszy wybór.

  • ps2pdf jest znacznie szybszy
  • bez określonych dodatkowych parametrów, pdf2psczasami tworzy większy plik.
Zawietrzny
źródło
Gdzie znalazłeś tę opcję? Czy jest to funkcja w jakiejś najnowszej wersji? Na mnie to nie wyszło. Mimo że nazwałem plik wyjściowy out.pdf, stał się plikiem PS ( mimetype out.pdfmówi out.pdf: application/postscript).
myrdd
moja to najnowsza wersja 9.xx. nie jestem pewien.
Lee
Używam spakowanej wersji Debiana stabilnej („stretch”), czyli 9.25. Czy możesz sprawdzić, czy rzeczywiście masz plik pdf, wpisując mimetype small.pdf?
myrdd
wyjście mimetype small.pdfjest small.pdf: application/pdf. Myślę, że program może automatycznie określić typ pliku zgodnie z przyrostkiem.
Lee
1
@myrdd yeah, zrobiłem testy. ps2pdfjest lepiej.
Lee,
1

Nie zauważyłem dużej redukcji rozmiaru pliku przy użyciu qpdf. Najlepszym sposobem, jaki znalazłem, jest użycie ghostscript po zakończeniu pdftk, aby przekonwertować pdf na postscript, a następnie z powrotem na pdf. W PHP użyłbyś exec:

$ps = $save_path.'/psfile.ps';
exec('ps2ps2 ' . $pdf . ' ' . $ps);
unlink($pdf);
exec('ps2pdf ' .$ps . ' ' . $pdf);
unlink($ps);

Użyłem tego kilka minut temu, aby zwiększyć wydajność pdftk z 490k do 71k.

Tomek
źródło
2
PHP dodaje całkowicie niepotrzebną złożoność i zawęża zastosowanie tej odpowiedzi
ndemou
-2

Miałem ten sam problem i użyłem tej funkcji do kompresowania poszczególnych stron, co powoduje, że rozmiar pliku jest kompresowany nawet o 1/3 pierwotnego rozmiaru.

for (int i = 1; i <= theDoc.PageCount; i++)
{
       theDoc.PageNumber = i;
       theDoc.Flatten();
}
Gabbar
źródło
1
czy używasz biblioteki C ++ pdftk?
RockScience
-3

W przypadku, gdy chcesz skompresować plik PDF zawierający dużo tekstu do wyboru, w systemie Windows możesz użyć programu NicePDF Compressor - wybierz opcję „Flate”. Po wypróbowaniu wszystkiego (cpdf, pdftk, gs) w końcu pomogło mi skompresować mój 1360 stron PDF z 500 MB do 10 MB.

solf
źródło