Jak mogę zmniejszyć rozmiar zeskanowanego pliku PDF?


372

Mam plik PDF o wielkości 72,9 MB, który muszę zmniejszyć do 500 KB.

Plik był obrazem JPEG, który zeskanowałem, a następnie przekonwertowałem do formatu pdf.


1
zależy to od tego, co zajmuje miejsce ... potrzebujesz dużo więcej informacji. kompresowanie przestrzeni obrazu może pomóc, ale jeśli próbujesz rozpylić dużą stertę plików, to nie zadziała. poważnie potrzebujesz więcej informacji.
RobotHumans

1
przekonwertować go na DjVu, zamiast tego próbować zredukować do niemożliwego rozmiaru pliku PDF (według źródła)
zetah

plik był obrazem JPEG, który zeskanowałem, a następnie przekonwertowałem do formatu pdf.
tamimym

Wydaje się, że pomaga to tylko w niewielkim rozmiarze, ale pdfoptma prostą składnię i poprawia szybkość ładowania i przewracania stron w erze iPada. :-)
Ari B. Friedman

1
PDF do PS nie działa w zeskanowanym pliku PDF, próbuję przekonwertować 56 MB pdf na plik ps, ale plik ps przekonwertować na 1,3 GB i ponownie ps2pdf jest przekonwertowany na plik 45 MB

Odpowiedzi:


145

aking1012 ma rację. Więcej informacji na temat możliwych osadzonych obrazów, hiperłączy itp. Byłoby znacznie łatwiej odpowiedzieć na to pytanie!

Oto kilka rozwiązań skryptów i wiersza poleceń. Używaj według własnego uznania.


15
Bardzo dziękuję za sugestie, powłoka ghostscript działała cuda i zmniejszyła ją do 460 KB :)
tamimym

To niekoniecznie prawda. Jeśli treść przeszła z obrazu do tekstu, jest to więcej niż możliwe. [Przy założeniu, że tekst jest dokładnie ocredny]
mnich

2
Polecam ci skrypt shrinkpdf.sh, możesz dostosować kod, aby używał żądanej wartości ppi (domyślnie 72) i osiągnąć dokładnie taki rozmiar pliku, jaki potrzebujesz, aby poświęcić najmniejszą jakość. Dzięki temu mogłem przesłać zeskanowany dokument o wielkości 11 MB z maksimum. rozmiar 3 MB bez utraty jakości.
Severo Raz,

4
shrinkpdf działa świetnie!
AmanicA

2
Gdzie jest powłoka ghostscript, którą OP odnosi się do askubuntu.com/questions/113544/… ?
user13107,

519

Użyj następującego polecenia ghostscript :

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
  • -dPDFSETTINGS=/screenniższa jakość, mniejszy rozmiar. ( 72 dpi )
  • -dPDFSETTINGS=/ebookdla lepszej jakości, ale nieco większych plików pdf. ( 150 dpi )
  • -dPDFSETTINGS=/prepresswyjście podobne do ustawienia „Prepress Optimized” programu Acrobat Distiller ( 300 dpi )
  • -dPDFSETTINGS=/printerwybiera dane wyjściowe podobne do ustawienia „Optymalizacja wydruku” programu Acrobat Distiller ( 300 dpi )
  • -dPDFSETTINGS=/default wybiera dane wyjściowe, które mają być przydatne w szerokim zakresie zastosowań, być może kosztem większego pliku wyjściowego

5
To powinna być zaakceptowana odpowiedź. Ghostscript jest PDF, XPS i realizacja PS dla Uniksów i można zrobić w zasadzie wszystko, zapewniając najlepszą jakość ...
DOM0

7
@Sina: W rzeczywistości istnieje Skrypt Nautilus z prostym graficznym interfejsem użytkownika opartym na Zenity, który wykorzystuje to polecenie gs ze wszystkimi opcjami jakości: launchpad.net/compress-pdf
Sadi

36
To jest prawidłowa odpowiedź na to pytanie (kompresja pliku pdf, który jest w większości danymi bitmapowymi). Stwierdziłem, że screenustawienie było dla mnie zbyt niskiej jakości, ale ebookdziałało dobrze, zmniejszając plik PDF oparty na skanowaniu 33 Mb do 3,6 Mb i utrzymując go w bardzo dobrej czytelności. Inne opcje dla tej -dPDFSETTINGSopcji są wymienione tutaj: milan.kupcevic.net/ghostscript-ps-pdf i dobrym pomysłem może być uwzględnienie ich w tej odpowiedzi.
naught101

5
gs dostępne parametry konfiguracyjne: ghostscript.com/doc/current/Ps2pdf.htm
Antonios Hadjigeorgalis

3
17.10 zrobiło 42 MB pdf do 127 MB :(
YaSh Chaudhary

156

Moim ulubionym sposobem na to jest konwersja pdf na ps i odwrotnie. Jednak nie zawsze działa, ale kiedy działa, wyniki są dobre:

ps2pdf input.pdf output.pdf

Działa to również bezpośrednio na pliki pdf, jak sugerowano w komentarzach.

Niektórzy użytkownicy zgłaszają również większy sukces podczas korzystania z ustawień ebooka w następujący sposób:

ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf 

4
Jest to bardzo prosty i skuteczny sposób na zrobienie tego. Byłem zaskoczony, widząc, jak bardzo ta metoda skompresowała pliki. Dzięki Ci!
Gabriel

16
Pomimo tego, że to jedno podejście stało się moim ulubionym rozwiązaniem do kompresji plików pdf, rozbija linki URL, które może mieć dokument (co nie dzieje się w przypadku podejścia @Michaela D). Poza tym niesamowitą rzeczą jest wszystko, co mogę myśleć o uruchomieniu tego fragmentu! (:
Rubens

1
@Rubens Ah. Nie wiedziałem o tym, że zrywa linki URL. Dzięki za dodanie tego.
don.joey

3
Ten omija zabezpieczenie hasłem ... po prostu mówię
jojo

8
ps2pdf weźmie pdf jako dane wejściowe, więc możesz to zrobić w jednym kroku:ps2pdf intput.pdf output.pdf
frabjous

127

Jeśli masz plik pdf ze zeskanowanymi obrazami , możesz go użyć convertdo utworzenia pliku pdf z kompresją jpeg (możesz użyć tej metody na dowolnym pliku pdf, ale utracisz wszystkie informacje tekstowe).

Na przykład:

convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf

Dostosuj gęstość (np. 100 x 100) i jakość do swoich potrzeb.

W zależności od danych wejściowych kompresja jpeg może nie być najlepszym wyborem ze względu na artefakty kompresji. Masz do wyboru BZip, Faks, Group4, JPEG, JPEG2000, Lossless, LZW, RLE lub Zip jako alternatywne metody kompresji (niektóre dopuszczają tylko obrazy czarno-białe). Szczegółowe informacje można znaleźć tutaj .

Udało mi się osiągnąć świetne współczynniki kompresji zeskanowanych / sfotografowanych dokumentów (w zależności od ustawień). W zależności od źródła dokumentu może być konieczne zmniejszenie głębi kolorów ( -depthargument).


3
W przypadku zeskanowanego dokumentu, w którym interesuje Cię tekst, a nie obrazy, a zachowanie głębi nie stanowi problemu, kompresja JPEG nie jest dobrym pomysłem, ponieważ artefakty są bardzo zauważalne. Jeśli używasz pdfimages input.pdf pagesdo wyodrębniania plików PBM, to można zrobić coś takiego: for page in *.pbm; do convert $page -compress Group4 -type bilevel TIFF:- | convert - output.pdf. Wszelkie OCR zostaną utracone, więc zwykle to robię pdfsandwich output.pdf, co wydaje się jeszcze bardziej zmniejszać rozmiar pliku.
Brian Z

1
@BrianZ na pewno kompresja JPEG nie zawsze jest najlepszym wyborem, ale dla mnie było to najlepsze podejście do dokumentów mieszanych. Do odpowiedzi dodałem kilka informacji o innych metodach kompresji.
ktoś

2
Ta metoda ostatecznie wykorzystuje gsza kulisami.
alfC

2
Musiałem użyć podwójną kreskę na opcje, aby uruchomić polecenie --density --quality --compressvs -density -quality -compress.
Rotareti,

1
Jeśli jakość obrazu nie jest najważniejsza (a chcesz, aby ten załączony e-mail był wystarczająco mały, aby go wysłać), możesz -resize 50%również dodać , zmień procent w zależności od tego, ile DPI zostało użyte podczas skanowania
chrki

41

Musiałem zmniejszyć rozmiar pliku PDF, który zawierał skanowanie dokumentów w pełnym kolorze. Każda z moich stron była obrazem w pełnym kolorze, jeśli chodzi o plik. Były to obrazy stron zawierających tekst i obrazy, ale zostały utworzone przez skanowanie do obrazu.

Użyłem kombinacji poniższego polecenia ghostscript i jednego z innego wątku.

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true \
-dColorImageResolution=150 -dNOPAUSE  -dBATCH -sOutputFile=output.pdf input.pdf

Zmniejszyło to rozdzielczość obrazu do 150 dpi, zmniejszając rozmiar mojego pliku o połowę. Patrząc na dokument, prawie nie było zauważalnej utraty jakości obrazu. Tekst jest nadal doskonale czytelny na moim Nexusie z 2012 roku.


3
+1 za próbkowanie w dół obrazów, ale zachowanie tekstu jako wektorów. Zrobiłem ogromną różnicę z boku, nie powodując pikselowania mojego tekstu.
Jason O'Neil,

Fantastycznie, że można dostroić rozdzielczość za pomocą tego polecenia - to dało mi lepsze wyniki niż tylko użycie dPDFSETTINGS = \ screen
wymiana

29

Oto skrypt do przepisywania zeskanowanych plików PDF:

#!/bin/sh

gs  -q -dNOPAUSE -dBATCH -dSAFER \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.3 \
    -dPDFSETTINGS=/screen \
    -dEmbedAllFonts=true \
    -dSubsetFonts=true \
    -dColorImageDownsampleType=/Bicubic \
    -dColorImageResolution=72 \
    -dGrayImageDownsampleType=/Bicubic \
    -dGrayImageResolution=72 \
    -dMonoImageDownsampleType=/Bicubic \
    -dMonoImageResolution=72 \
    -sOutputFile=out.pdf \
     $1

Możesz go nieco dostosować, aby był bardziej wielokrotnego użytku, ale jeśli masz tylko jeden plik pdf, możesz po prostu zastąpić $1go nazwą pliku pdf i zatrzasnąć go w terminalu.


1
Działa uczta, dzięki Oli. Odpowiedziałeś prawie na wszystkie pytania, o które do tej pory prosiłem :-D
Rob Cowell

To dobra odpowiedź, ale w moim przypadku konwersja dość dużego (> 10 Mb) pliku PDF (ponad minutę) zajmuje co najmniej dużo czasu.
Gabriel

Nie jestem pewien, co się stanie, ale plik PDF o wielkości 30 MB daje plik o wielkości 68 MB. Zamiast zmniejszać, powiększa się. To samo wyjście, jeśli używasz bezpośrednio ps2pdf, jak podano w następnej odpowiedzi.
Ed Villegas,

@EdVillegas Jedyne, co mogę wymyślić (aby wyjaśnić tego rodzaju wzrost) to to, że obrazy mają niższą rozdzielczość niż generowane (72dpi). Lub w jakiś sposób osadzanie czcionek powoduje zasysanie wszystkich czcionek.
Oli

21

Zwykle używam do tego ps2pdf (łatwiejsza składnia), coś takiego:

ps2pdf -dPDFSETTINGS=/ebook BiggerPdf SmallerPDF

Używam następującego skryptu python, aby zmniejszyć rozmiar wszystkich plików pdf w katalogu na serwerze produkcyjnym (8.04). Więc powinno działać.

#!/usr/bin/python

import os

for fich in os.listdir('.'):
        if fich[-3:]=="pdf":
                os.system("ps2pdf -dPDFSETTINGS=/ebook %s reduc/%s" % (fich,fich))

Dzięki za alternatywne rozwiązanie. Najpierw wypróbowałem Oli i dało mi to wynik, którego potrzebowałem, ale zachowam ten również do wykorzystania w przyszłości.
Rob Cowell,

1
-dPDFSETTINGS = / opcja drukarki zmienia rozmiar o 50%. ebook do 90% zmiany rozmiaru.
neouyghur

17
  1. Korzystam z LibreOffice Draw, aby otworzyć plik pdf.
  2. Następnie „eksportuję jako pdf”
  3. I ustaw „jakość kompresji jpeg” na 50%, a „rozdzielczość obrazu” na 150 dpi

To będzie dobry wynik.


Najgorsze możliwe rozwiązanie problemu! Całkowicie zawiedli mój plik!

9

Najlepsze było dla mnie

convert -compress Zip -density 150x150 input.pdf output.pdf

Inaczej:

#### gs
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

### pdf2ps && ps2pdf
pdf2ps input.pdf output.ps && ps2pdf output.ps output.pdf

### Webservice
http://compress.smallpdf.com/de

pozdrowienia


Świetne rozwiązanie. Łatwy do zapamiętania i przyniósł mój pdf z 32 do 3,5 MB bez wyraźnej utraty czytelności.
Immanuel Weihnachten

Podobał mi się drugi sposób pdf2ps input.pdf temp.ps && ps2pdf14 temp.ps output.pdf && rm temp.ps
McPeppr

5

Właśnie sam napotkałem ten problem. Jeśli używasz prostego skanowania, wybierz tryb tekstowy dla skanów w niskiej rozdzielczości i nie będziesz musiał się martwić o elementy wiersza poleceń. Tylko mówię.


1
To jest jedyna odpowiedź w tym wątku, która rozwiązała mój problem. Zlekceważyłem Simplescan, ale tak naprawdę była to dla mnie odpowiedź, zamiast walczyć z Xsane w czymś, co wydawało się nieskończoną agonią.
verss

4

Kontroluj jakość kompresji:

#!/bin/sh
INPUT=$1; shift
OUTPUT=$1; shift
GS_BIN=/usr/bin/gs
QFACTOR="0.40"

# Image Compression Quality
#
# Quality HSamples VSamples QFactor
# Minimum [2 1 1 2] [2 1 1 2] 2.40
# Low     [2 1 1 2] [2 1 1 2] 1.30
# Medium  [2 1 1 2] [2 1 1 2] 0.76
# High    [1 1 1 1] [1 1 1 1] 0.40
# Maximum [1 1 1 1] [1 1 1 1] 0.15 

${GS_BIN} -dBATCH -dSAFER -DNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=${OUTPUT} -c "<< /ColorImageDict << /QFactor ${QFACTOR} /Blend 1 /HSample [1 1 1 1] /VSample [1 1 1 1] >> >> setdistillerparams" -f ${INPUT}

... więc zarówno WEJŚCIE, jak i WYJŚCIE są tym samym argumentem? Możesz dodać wytyczne dotyczące użytkowania.
mikewhthing

2
Uwaga shift. Pierwszy parametr to plik wejściowy, drugi to plik wyjściowy, a pozostałe parametry zostaną przekazane w niezmienionej gspostaci.
Mikko Rantalainen

Myślę, że chcesz / HSample s i / VSample s , a nie / HSample i / VSample. Zobacz np. Dokumenty ps2pdf lub podręcznik języka PostScript. Warto również zauważyć, że dozwolony zakres współczynnika QFactor wynosi od 0 do 1 000 000, a niższe wartości dają wyższą jakość.
Pont

3

Ponieważ ten link był dla mnie pierwszy podczas wyszukiwania w Google, pomyślałem, że dodam jeszcze jedną możliwość. Żadne z powyższych rozwiązań nie działało dla mnie na pliku PDF eksportowanym z Inkscape (15 MB), ale w końcu mogłem go zmniejszyć do 1 MB, otwierając go w GIMP i ponownie eksportując jako pdf.

Inną opcją, która się zbliżyła (ale tekst był trochę niewyraźny), było narzędzie do konwersji ImageMagick:

convert -compress Zip input.pdf output.pdf

convert -compress ZipWydaje mi się, że to właśnie rozumiesz przez „trochę zamazany”, ale dla wyjaśnienia, wydaje się, że rasteryzuje wszystkie wektory.
Sparhawk


3

Zdecydowanie polecam pdfsizeopt .

Jest o wiele bardziej wydajny pod względem zmniejszania wielkości niż jakikolwiek poprzedni CLI i GUI oprogramowania, które próbowałem (w tym convert, gs, pdftkitp) - chociaż być może wolniej pngoutaktywna - i nie ma niektórych swoich problemów (nie ciężko obrazy pikselowe / zdegradowane, bez utraty zakładek itp.).

Teraz, jeśli chcesz osiągnąć określony rozmiar bez względu na konsekwencje (w tym degradację obrazów do punktu nieczytelności), może to nie być narzędzie, którego potrzebujesz, ale jako zawsze działające rozwiązanie, aby zmniejszyć niepotrzebne duże rozmiary w plikach PDF bez utraty czytelności, informacji i akceptowalnej jakości obrazu, myślę, że to najlepsza opcja. (Uwaga: zwykle używam go po uprzednim wykonaniu wektoryzacyjnego OCR w Adobe Acrobat [funkcja nazywała się „CleanScan”], co może mieć ogromny wpływ na rozmiar niektórych skanowanych dokumentów tekstowych.)


Polecam ogólną instalację Uniksa :

  1. Zainstaluj wszystkie wymagane zależności:

  2. Pobierz i zainstaluj plik wykonywalny:

    curl -L -o https://raw.githubusercontent.com/pts/pdfsizeopt/master/pdfsizeopt.single
    cp pdfsizeopt.single /usr/local/bin/pdfsizeopt
    

Stosowanie:

pdfsizeopt original.pdf [compressed.pdf]

Uwaga dla użytkowników komputerów Mac, którzy znajdą ten post (lub użytkownicy Linuxbrew): istnieje formuła instalacji Homebrew:

brew install --HEAD pts/utils/pdfsizeopt

2

Miałem ten sam problem i cieszyłem się, że znalazłem ten wątek. Konkretnie miałem plik pdf wygenerowany na podstawie zeskanowanych obrazów i musiałem zmniejszyć jego rozmiar bajtu sześciokrotnie.

Niestety żadne z powyższych rozwiązań nie zadziałało :(. Wtedy zdałem sobie sprawę, że gdzieś w skanerze-> jpeg-> pdf rozmiar strony został rozdęty o współczynnik aprx 4. Wszystkie zeskanowane dokumenty miały rozmiar Letter, ale plik pdf miał rozmiar

identify -verbose doc_orig.pdf | grep "Print size"
 Print size: 35.4167x48.7222

W końcu uzyskałem pożądane wyniki dzięki poleceniu „konwersja”, które zmieniło zarówno rozmiar, jak i kroki kompresji w jednym:

convert -density 135x135 -quality 70 -compress jpeg -resize 22.588% doc_orig.pdf doc_lowres.pdf

Zauważ, że doc_orig miał gęstość 72x72 dpi.


1

Jeśli konwersja do djvu również będzie w porządku i jeśli nie zostaną użyte żadne kolory, możesz spróbować:

Konwertuj pdf na pliki jpg za pomocą pdfimages -j

Jeśli zamiast tego otrzymasz pliki PBM, wykonaj pośredni krok:

for FILENAME in $(ls *.pbm); do convert $FILENAME ${FILENAME%.*}.jpg ;done

Polecenie konwersji pochodzi z pakietu imagemagick.

Następnie użyj scantailor, aby zrobić z niego tif.

W ostatnim kroku przejdziesz do scantailors out direcory (gdzie znajdują się tif) i zastosujesz djvubind do tego katalogu.

Powinno to drastycznie zmniejszyć rozmiar pliku bez dużej utraty jakości tekstu. Jeśli chcesz mieć lepszą kontrolę nad backendem ocr, możesz spróbować djvubind --no-ocrużyć ocrodjvu, aby później dodać warstwę ocr.

Jeśli masz w dokumencie kolory, sprawy stają się nieco bardziej skomplikowane. Zamiast djvubind możesz użyć didjvu, aw scantailor musisz zmienić tryb mieszany i czasami ręcznie wybrać kolorowe obrazy.


1

załaduj obraz lub nawet plik pdf do inkscape.

From inkscape: Zapisz w formacie wektorowym (jako natywny plik .svg).

Importuj pliki wektorowe do programu scribus, edytuj układ i eksportuj / zapisz jako .pdf stamtąd


0

Super proste narzędzie do kompresji plików PDF: strona GitHub.

Instalacja na Ubuntu:

sudo add-apt-repository ppa:jfswitz/released

sudo apt-get update

sudo apt-get install pdf-compressor

Używa ghostscript.


0

Możesz spróbować:

$ time pdftk myFile.pdf output myFile__SMALLER.pdf compress
GC Warning: Repeated allocation of very large block (appr. size 16764928):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 8384512):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 11837440):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 8384512):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 33525760):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 7254016):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 34041856):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 33525760):
    May lead to memory leak and poor performance.

real    0m23.677s
user    0m23.142s
sys     0m0.540s
$ du myFile*.pdf
108M    myFile.pdf
74M     myFile__SMALLER.pdf

W tym przypadku jest szybszy niż, gsale kompresuje do 30% dla pliku wejściowego 107,5 Mb.


0

Dla mnie screenopcja gs była zbyt zła, a ta ebookza duża.

Mój oryginalny dokument zawierał tekst w postaci kolorowych i czarno-białych obrazów (w zależności od strony).

Najlepsze rozwiązanie, jakie wymyśliłem, to:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=130 -dGrayImageResolution=130 -dMonoImageResolution=130 -r130 -dNOPAUSE  -dBATCH -sOutputFile=output_lr.pdf input.pdf

Zauważ, że poziom kompresji nie jest liniowy. Gdybym określił 135, nie był skompresowany, stwierdziłem, że 130 jest (w moim przypadku) maksymalną rozdzielczością, która osiąga kompresję.


-1

Użyłem poniższych poleceń, ale nie skompresowało to znacząco mojego pliku pdf. Czasami część porcji była sczerniała po kompresji.

  1. gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

  2. "ps2pdf -dPDFSETTINGS=/ebook %s %s" % (input_file_path, out_file_path)

Po zbyt dużej wędrówce po Internecie po prostu nie mogłem znaleźć odpowiedniej biblioteki kompresji. Natknąłem się pdfcompressor.com. To jest po prostu niesamowita strona internetowa. Kompresuje pdf o 95% (15 MB plików). Użyłem więc selenu i Tora do automatyzacji kompresji. Sprawdź moje repozytorium Github. [GITHUB] ( https://github.com/gugli28/PdfCompressor )

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.