Ostatnim razem, gdy użyłem convert
takiego zadania, wyraźnie określiłem rozmiar miejsca docelowego, zmieniając rozmiar:
$ i=150; convert a.png b.png -compress jpeg -quality 70 \
-density ${i}x${i} -units PixelsPerInch \
-resize $((i*827/100))x$((i*1169/100)) \
-repage $((i*827/100))x$((i*1169/100)) multipage.pdf
convert
Komenda nie zawsze używać DPI jako jednostki domyślnego formatu gęstość / strona, więc możemy jednoznacznie określić DPI z -units
opcji (w przeciwnym razie można uzyskać różne wyniki w różnych wersjach / kombinacje format wejściowy). Nowy rozmiar (określony przez -resize
) to rozmiar strony DIN A4 w pikselach. Argument zmiany rozmiaru określa maksymalny rozmiar strony. Wybór rozdzielczości i jakości zależy dokładnie od przypadku użycia - wybrałem 150 DPI i średnią jakość, aby zaoszczędzić trochę miejsca, a nie wygląda tak źle po wydrukowaniu na papierze.
Należy pamiętać, że convert
domyślnie nie zmienia współczynnika proporcji podczas operacji zmiany rozmiaru:
Zmiana rozmiaru dopasuje obraz do żądanego rozmiaru. NIE wypełnia żądanego rozmiaru pudełka.
( Instrukcja ImageMagick )
W zależności od wersji ImageMagick i zaangażowanych formatów wejściowych może być pominięcie tej -repage
opcji. Ale czasami jest to wymagane i bez tej opcji nagłówek PDF może zawierać zbyt małe wymiary. W każdym razie -repage
nie powinno boleć.
Obliczenia wykorzystują arytmetykę liczb całkowitych, ponieważ bash
tylko to obsługuje. Dzięki zsh
wyrażeniom można uprościć - tzn. Zastąpić je $((i*8.27))x$((i*11.69))
.
Obrazy Lineart
Jeśli pliki PNG są obrazami dwupoziomowymi (czarno-biały aka lineart), to img2pdf
narzędzie daje lepsze wyniki niż ImageMagick convert
. Oznacza to, że img2pdf
jest szybszy i daje mniejsze pliki PDF.
Przykład:
$ img2pdf -o multipage.pdf a.png b.png
lub:
$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
-repage a4
dostajęinvalid argument for option '-repage': a4
-repage
nie obsługuje już nazwy A4. Pracowałem nad tym za pomocą arytmetyki powłoki:-repage $((150*8.27))x$((150*11.69))
-density 150
argument był ważny do dodania.To, czego naprawdę chcesz użyć to:
-extent
faktycznie wydłuża obraz do rozmiaru 1240 x 1753,-resize
zachowując proporcje obrazu, dopasowując go do jednego1240x...
lub...x1753
.Ten
-gravity
parametr jest opcjonalny, ale można go użyć do wyśrodkowania obrazu podczas rozciągania.źródło
-extent
jest naprawdę tym, czego chcę użyć :) - dodaj brakujący lewy cytat przed tekstem, dzięki!Dodatek do odpowiedzi caugnera :
po zainstalowaniu IM v6.6.9-7 dowiedziałem się, że
-gravity
parametr musi być umieszczony pomiędzy-resize
i-extent
aby mieć efekt.dodatkowo (choć nie jest to część pytania operacyjnego) ustaliłem, że ustawienie innego koloru tła jest atrakcyjne, co spowodowałoby całkowitą kontrolę nad
kolejna przydatna odmiana, której często używam, gdy nie chcę przeskalować obrazu, który już ma prawidłowy współczynnik kształtu, ale zachowuje indywidualną rozdzielczość
gdzie docelowa gęstość jest określana dynamicznie przez obliczenie szerokości podzielonej przez 8,27 (która jest szerokością w calach strony A4).
-repage a4
parametr może być pominięte przez większość czasu, ale miałem kilka przypadków, w których powstały .pdf miałyby inny format Sligtly off wymiarach A4 (210x297mm 8.27x11.6" )źródło
Uznałem, że kod Mikhera jest bardzo przydatny, jednak określa on całkowicie PDF jako Pionowy lub Poziomy, więc zmodyfikowałem go, aby sprawdzić układ każdego pliku wejściowego i dopasować go do wyniku.
Nie dodałem edycji Yotam, ponieważ działa ona bez niej na moim systemie Ubuntu 15.04.
źródło
Uważam, że wygodny jest następujący skrypt, który łączy wymienione tutaj odpowiedzi, a także niektóre problemy, które miałem z obliczeniami zmiennoprzecinkowymi:
Skrypt jest wywoływany (zapisany jako plik images2pdf)
/ edit: Dodano flagę „-l” zgodnie z komentarzem Taniusa dla większej precyzji.
źródło
$(echo "150*8.27" | bc)
nadal nie jest świetna do liczb zmiennoprzecinkowych. Działa tutaj, ponieważ jest to mnożenie. W przypadku$(echo "150/8.27" | bc)
jednak, wynik18
(skrócony na całkowitą). Zamiast tego zadzwońbc
z wyższymscale
:$(echo "150/8.27" | bc -l)
wyniki są18.137847…
.Walczyłem też z tymi rzeczami. Na podstawie powyższych informacji napisałem skrypt, który dodaje posortowane alfabetycznie pliki obrazów do jednego pliku PDF.
Niektóre zmienne są ustawiane w skrypcie. To zależy od ImageMagick i pdftk.
Uwaga: Jeśli obraz wejściowy ma wyższą rozdzielczość (dpi) niż pożądana rozdzielczość pliku wyjściowego.pdf, obraz jest ponownie próbkowany do niższej rozdzielczości. W przeciwnym razie obraz nie jest ponownie próbkowany i jest rozszerzany tylko w celu dopasowania do obszaru roboczego strony.
źródło
-set density $ImgDens
na-density $ImgDens
Bardzo polecam program CLI Python
img2pdf
do bezstratnej konwersji:https://gitlab.mister-muffin.de/josch/img2pdf
Przykładowe użycie:
źródło
Właśnie użyłem czegoś podobnego do odpowiedzi maxschlepzigs pod Ubuntu 16.04 / ImageMagick
To także centruje wynik
źródło