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?


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

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.


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

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 .


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.


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.


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.

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.


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();
}

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.