pdf na jpg bez utraty jakości; gscan2pdf

51

Podczas konwersji pliku pdf na kilka plików jpg za pomocą

convert -quality 100 file.pdf page_%04d.jpg

Mam znaczną utratę jakości.

Jeśli jednak wykonam następujące czynności, nie nastąpi (zauważalna) utrata jakości:

Uruchom gscan2pdf, wybierz plik-> importuj (i wybierz plik.pdf). Następnie przejdź do tymczasowego katalogu gscan2pdf. Istnieje wiele plików PNM (jeden na każdą stronę pliku pdf). Teraz ja robię

  for file in *.pnm; do            
  convert $file $file.jpg done

Powstałe pliki jpg są (z grubsza) tej samej jakości co oryginalne pliki pdf (to jest to, czego chcę).

Teraz moje pytanie brzmi: czy istnieje prosty sposób wiersza poleceń do konwersji pliku pdf na kilka plików jpg bez zauważalnej utraty jakości? (Powyższe rozwiązanie jest zbyt skomplikowane i czasochłonne).

student
źródło
W pytaniach nie jest jasne, czy mówisz o tekście i grafice wektorowej w pliku pdf, czy też chcesz wyodrębnić osadzone obrazy.
asoundmove,

Odpowiedzi:

92

Nie jest jasne, co rozumiesz przez „utratę jakości”. To może znaczyć wiele różnych rzeczy. Czy możesz opublikować próbki do zilustrowania? Być może wyciąć tę samą sekcję z wersji niskiej jakości i dobrej jakości (jako PNG, aby uniknąć dalszej utraty jakości).

Być może trzeba użyć -densitydo konwersji w wyższej rozdzielczości:

convert -density 300 file.pdf page_%04d.jpg

(Możesz dodać -units PixelsPerInchlub w -units PixelsPerCentimeterrazie potrzeby. Domyślnie moja kopia to ppi.)

Aktualizacja: Jak już wspomniałeś, gscan2pdf(sposób, w jaki go używasz) jest tylko opakowaniem dla pdfimages(z popplera ). pdfimagesnie robi tego samego, convertco w przypadku pliku PDF jako danych wejściowych.

convert pobiera plik PDF, renderuje go w pewnej rozdzielczości i wykorzystuje uzyskaną bitmapę jako obraz źródłowy.

pdfimagesprzegląda pliki PDF pod kątem osadzonych obrazów bitmapowych i eksportuje je do pliku. Po prostu ignoruje wszelkie polecenia rysowania tekstu lub wektorów w pliku PDF.

W rezultacie, jeśli masz plik PDF, który jest tylko opakowaniem wokół serii map bitowych, pdfimagesznacznie lepiej wyodrębni je, ponieważ dostarczy ci surowe dane w oryginalnym rozmiarze. Prawdopodobnie zechcesz również skorzystać z tej -jopcji pdfimages, ponieważ plik PDF może zawierać surowe dane JPEG. Domyślnie pdfimageskonwertuje wszystko do formatu PNM, a konwersja JPEG> PPM> JPEG jest procesem stratnym.

Więc spróbuj

pdfimages -j file.pdf page

Konieczne może być wykonanie tej czynności krok convertpo .jpgkroku (w zależności od formatu bitmapy, z którego korzystał plik PDF).

Wypróbowałem to polecenie w pliku PDF, który utworzyłem z sekwencji obrazów JPEG. Wyodrębnione pliki JPEG były bajt po bajcie identyczne z obrazami źródłowymi. Nie można uzyskać wyższej jakości niż to.

cjm
źródło
+1 Cieszę się, że nie poddałem się snobistycznemu błędnemu odczytaniu jednego z twoich zdań zainspirowanych we mnie i faktycznie wypróbowałem obrazy pdf - prawdopodobnie najbardziej przydatny program, z którego korzystałem od miesięcy! Zachęcam wszystkich do spróbowania!
ixtmixilix
@ixtmixilix, jestem ciekawa. Co źle odczytałeś i jak?
cjm
Dość niesamowite! Rozwiązałem mój dzień. Dziękuję Ci!
Geppettvs D'Constanzo
convertjest również niepraktyczne w przypadku dużych plików PDF. Na przykład przetworzenie książki złożonej z 700 6-megapikselowych stron zajęło 45 GB pamięci. Zajęło to również około tysiąc razy dłużej niż pdfimages.
Camille Goudeseune,
Odwrotnie, konwertuj obrazy do formatu pdf lub lepiej, zawiń obrazy do formatu pdf, użyj img2pdf, tutaj: gitlab.mister-muffin.de/josch/img2pdf (zawija jpg i jpg2000 do pdf).
erik
4

Jak powiedziała odpowiedź studenta, pdfimagesto dobra opcja. Z mojego doświadczenia zarówno gsi converteksportu do złej jakości niezależnie od tego czy określenie właściwej dpi.

Ale jeśli pdf ma wiele warstw na stronę pdfimages, nie działa i wyodrębnia warstwy jako osobny obraz, w takim przypadku najlepiej jest użyć inskcapedo wyeksportowania strony, jak widać.

Oto polecenia, których używam:

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

Pierwsze polecenie dzieli wszystkie strony. Drugie polecenie konwertuje strona po stronie na png. Możesz zatrzymać png lub przekonwertować je na JPEG

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

W porównaniu do pdfimages, gsi ImageMagick's convertuważam inkscapeeksport za najlepszą jakość.

Eduard Florinescu
źródło
3

odpowiedź z @cjm jest poprawna, ale jeśli podoba ci się GUI i nie chcesz renderować wszystkich stron pdf, tylko żeby uzyskać obraz, użyj gimp.

Otwórz pdf z gimp, a otrzymasz okno importu z wyrenderowanymi wszystkimi stronami. Wybierz dowolne strony i ustaw rozdzielczość na 600 pix / cal (w wielu przypadkach stwierdziłem 300 za dużo wyostrzenia). Zapisz w dowolnym formacie dzięki „Plikowi / eksportowi”

W każdym razie musi istnieć flaga, aby wybrać żądane strony z wiersza poleceń.

albfan
źródło
2

Patrząc na kod źródłowy gscan2pdf zauważyłem, że używa pdfimages. Spowodowałoby pdfimages file.pdf pageto page-001.ppm, page-002.ppmitp.

student
źródło
pdfimages naprawdę działa
Eduard Florinescu
2

W twoim pytaniu nie jest jasne, czy mówisz o tekście i grafice wektorowej w pdf, czy też pdf zawiera osadzone obrazy.

Po przeczytaniu, o co chodzi w gscan2pdf, domyślam się, że twoje pliki pdf zawierają (tylko) osadzoną grafikę.

convertzasadniczo „drukuje” twój pdf bez względu na treść. Jak sugeruje @cjm, możesz chcieć zmienić gęstość wydruku. Jest to jedyny sposób na poprawę jakości grafiki wektorowej.

Jeśli zamiast tego chcesz wyodrębnić osadzone obrazy (podobnie jak robi to gscan2pdf), odgadnięcie gęstości zwykle prowadzi do utraty jakości lub wyższej jakości niż jest to wymagane (i marnowania miejsca na dysku). Odpowiedzią jest więc wyodrębnienie obrazu zamiast wydrukowania pliku pdf. Zobacz ten artykuł, który zasadniczo zaleca użycie pdfimagesw celu wyodrębnienia obrazów bez utraty jakości.

asoundmove
źródło