Próbuję przekonwertować plik PDF na obraz PNG (przynajmniej okładkę jednego). Pomyślnie wyodrębniam pierwszą stronę pliku PDF za pomocą pdftk. Używam imagemagick do konwersji:
convert cover.pdf cover.png
To działa, ale niestety plik cover.png jest nieprawidłowo renderowany (niektóre obiekty alfa w pliku PDF nie są poprawnie renderowane). Wiem, że ImageMagick używa GhostScript do konwersji i jeśli zrobię to bezpośrednio z gs, mogę uzyskać pożądane wyniki, ale wolałbym użyć biblioteki konwertującej, ponieważ ma inne narzędzia, które chciałbym wykorzystać.
To polecenie w GhostScript wykonuje żądany obraz:
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
Zastanawiam się, czy istnieje sposób na przekazywanie argumentów przez konwersję do GhostScript, czy też utknąłem z bezpośrednim wywołaniem GhostScriptu?
image
pdf
png
imagemagick
ghostscript
Adam
źródło
źródło
Odpowiedzi:
Możesz użyć jednego wiersza poleceń z dwoma poleceniami (
gs
,convert
) połączonymi potokiem, jeśli pierwsze polecenie może zapisać swoje wyjście na stdout, a drugie może odczytać swoje wejście ze stdin.... -o %stdout ...
).convert -background transparent - output.png
).Problem rozwiązany:
Kompletne rozwiązanie:
Aktualizacja
Jeśli chcesz mieć osobny plik PNG na stronę PDF, możesz użyć rozszerzenia
%d
składni:Spowoduje to utworzenie plików PNG o nazwach
page-000.png
,page-001.png
... (uwaga, że%d
-counting jest od zera -file-000.png
odpowiada do strony 1 PDF,001
na stronie 2 ...Lub, jeśli chcesz zachować przezroczyste tło, w przypadku 100-stronicowego pliku PDF, zrób to
źródło
-dBATCH -dNOPAUSE -dQUIET
do opcji gs.-o output.file
a to automatycznie i cicho również ustawia-dBATCH -dNOPAUSE -dQUIET
w tym samym czasie.Spośród wszystkich dostępnych alternatyw znalazłem Inkscape, który zapewnia najdokładniejsze wyniki podczas konwersji plików PDF do PNG. Zwłaszcza gdy plik źródłowy miał przezroczyste warstwy, Inkscape odniósł sukces tam, gdzie zawiodły Imagemagick i inne narzędzia.
Oto polecenie, którego używam:
I tutaj jest zaimplementowany w skrypcie:
źródło
Aby przekonwertować plik PDF na pliki graficzne, użyj następujących poleceń:
W przypadku PNG
gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf
W przypadku JPG
gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf
Jeśli masz wiele stron, dodaj do nazwy % 03d
gs -o a%03d.jpg a.pdf
Co oznacza każda opcja:
źródło
Można również skorzystać z narzędzi wiersza poleceń zawartych w
poppler-utils
pakiecie:Przykład:
źródło
Nie udało się uzyskać zaakceptowanej odpowiedzi. Potem okazało się, że w rzeczywistości rozwiązanie jest i tak znacznie prostsze, ponieważ Ghostscript nie tylko natywnie obsługuje PNG, ale nawet wiele różnych „kodowań” :
png256
png16
pnggray
pngmono
Polecenie powłoki, które działa dla mnie, to:
Spowoduje to zapisanie strony 2 pliku test.pdf do pliku test.png przy użyciu
pnggray
kodowania i rozdzielczości 500 DPI.źródło
Oto niemiecka dyskusja na temat takiego problemu z plikami SVG, w którym można go rozwiązać za pomocą
Być może to działa również dla Ciebie.
źródło
Dodam moje rozwiązanie, nawet myślałem, że jego nić jest stara. Może i tak komuś to pomoże.
Najpierw muszę wygenerować plik PDF. Do tego używam XeLaTeX :
Teraz ImageMagick i GraphicMagic analizują oba parametry od lewej do prawej, więc parametr skrajny lewy zostanie wykonany jako pierwszy. Skończyło się na użyciu tej sekwencji do optymalnego przetwarzania:
Daje ładną grafikę na przezroczystym tle, przyciętą do tego, co faktycznie znajduje się na stronie.
-density
I-resize
parametry, dają lepszą szczegółowość i zwiększyć ogólną rozdzielczość.Proponuję sprawdzić, czy dla Ciebie można zmniejszyć gęstość. Skróci to czas konwersji.
źródło
W przypadku pliku PDF, który ImageMagick podawał niedokładne kolory, stwierdziłem, że GraphicsMagick wykonał lepszą pracę:
źródło
Ponieważ ta strona zawiera również listę alternatywnych narzędzi, wspomnę o xpdf, który ma gotowe narzędzia wiersza poleceń skompilowane dla systemu Linux / Windows / Mac. Obsługuje przejrzystość. Jest darmowy do użytku komercyjnego - w przeciwieństwie do Ghostscript, który ma naprawdę skandaliczne ceny.
W teście na dużym pliku PDF był o 7,5% szybszy niż Ghostscript.
(Posiada również konwertery PDF na tekst i HTML)
źródło
Spróbuj wyodrębnić jedną stronę.
$ page = 4
źródło
Moje rozwiązanie jest znacznie prostsze i bardziej bezpośrednie. Przynajmniej działa w ten sposób na moim komputerze (z następującymi specyfikacjami):
z
Oto, co uruchamiam na moim
file.pdf
:źródło
Możesz użyć ImageMagick bez oddzielania pierwszej strony pliku PDF innymi narzędziami. Po prostu zrób
Tutaj zwiększam gęstość nominalną o 400% (72 * 4 = 288), a następnie zmieniam rozmiar o 1/4 (25%). Daje to znacznie lepszą jakość wynikowego png.
Jeśli jednak plik PDF jest w formacie CMYK, format PNG tego nie obsługuje. Musiałby zostać przekonwertowany na sRGB, zwłaszcza jeśli ma przezroczystość, ponieważ Ghostscript nie obsługuje CMYK z alfa.
źródło