Jak przekonwertować plik PNG na plik PDF w wysokiej jakości, aby nie był rozmazany ani rozmyty?


54

Istnieje wiele pytań na temat konwertowania pliku PDF na obraz PNG, ale chcę wziąć ładny, ostry plik PNG i po prostu owinąć go lub osadzić w pliku PDF, aby nie był rozmazany lub zamazany.

Po zainstalowaniu imagemagic zdaję sobie sprawę, że mogę wykonać prostą konwersję:

convert sample.png sample.pdf

Próbowałem również wielu przełączników, aby ustawić głębokość, a także ustawienie jakości:

convert -quality 100 sample.png sample.pdf

Jednak plik PDF nadal wydaje się rozmazany / niewyraźny.

Oto przykładowy obraz:

http://img406.imageshack.us/img406/6461/picture3mu.png

Jako png jest ostry i czysty. Kiedy przekonwertuję go na plik PDF, nawet w tym samym rozmiarze wygląda rozmazany:

Zdjęcie 4.png http://img803.imageshack.us/img803/9969/picture4at.png

Jak przekonwertować PNG do formatu PDF w wysokiej jakości?


Mam nadzieję, że znajdziesz dobrą odpowiedź na swoje pytanie, ale myślę, że przechowywanie obrazów w formacie JPG to tylko określona właściwość PDF. PNG, podobnie jak ten, który nam pokazujesz, ma znacznie lepszą jakość niż JPG.
jippie

1
@cwd: Czy próbowałeś umieścić go w pliku .tex, a następnie wygenerować plik PDF? Z \usepackage[pdftex, final]{graphicx}i \includegraphics[width=516px]{calendar.png}, na przykład.
Emanuel Berg,

2
@jippie: Nie, PDF może bezstratnie przechowywać mapy bitowe . Link podaje listę algorytmów kompresji, a nie formatów, ponieważ danych bitmapowych w pliku PDF nie można wyodrębnić i wyświetlić bezpośrednio jako JPEG lub TIFF, ale nie popełniłbyś błędu, mówiąc, że obrazy PDF są JPEG (stratne) ), JPEG 2000 (również stratny) lub dowolny z kilku wariantów TIFF (bezstratny). Co jest prawdą, to jednak, że dany destylator PDF może domyślnie tłumaczeniu bitmap do DCT (aka JPEG) formy, i muszą być poinformowani, aby skorzystać z formularza bezstratne zamiast.
Warren Young,

@cwd Czy zastanawiałeś się nad odpowiedzią? Myślę, że odpowiedź user32208 jest raczej dobra unix.stackexchange.com/a/64495/16920
Léo Léopold Hertz 준영

Odpowiedzi:


34

Spróbuj użyć -densityopcji. Domyślna rozdzielczość to 72 kropki na cal. Więc spróbuj czegoś takiego -density 300.

Informacje można znaleźć -densityw dokumentacji opcji wiersza polecenia ImageMagick.


Kluczem wydaje się być gęstość. Skala i gęstość wydają się być odwrotnie powiązane, więc bawiłem się obiema ustawieniami, aby uzyskać optymalny wynik zarówno pod względem wyglądu, jak i rozmiaru pliku ... Jeśli istnieje ustalona formuła, chciałbym to wiedzieć.
Brian Z

Jak znaleźć najlepszą opcję gęstości? Ile tracą dane w with density 300przypadku dowolnego przykładowego obrazu? Myślę, że wynik zależy od danych wejściowych. Nowy wątek na ten temat tutaj unix.stackexchange.com/q/292025/16920
Léo Léopold Hertz

dla mnie to wcale nie zmienia jakości.
Guillaume Chevalier

19

Uzyskanie dobrych wyników w formacie pdf może być bardzo skomplikowane convert. Spróbuj img2pdfzamiast tego. Z pliku Readme:

Bezstratna konwersja obrazów do formatu PDF bez niepotrzebnego ponownego kodowania plików JPEG i JPEG2000. Dzięki temu nie ma utraty jakości ani niepotrzebnych dużych plików wyjściowych.

Aby to wyjaśnić: PDF może osadzać bezstratne obrazy JPEG 2000 (i większość czytelników wydaje się je wspierać ). Ta konwersja jest więc całkowicie bezstratna:

convert sample.png -quality 0 sample.jp2
img2pdf -o sample.pdf sample.jp2

(Zakładając, że delegat JP2 jest dostępny, oczywiście: sprawdź identify -list format | grep JP2.)


4
To jest najlepsza odpowiedź IMHO tutaj, ale powinieneś lepiej wyjaśnić swój punkt, tzn. Że PDF może osadzać bezstratne obrazy JPEG 2000. Tak pełna komenda dla PO byłoby coś takiego: convert sample.png -quality 0 sample.jp2; img2pdf -o sample.pdf sample.jp2. (Zakładając, że delegat JP2 jest oczywiście dostępny: sprawdź identify -list format | grep JP2.)
Nemo,

1
Jeśli chcesz trzymać się standardowych repozytoriów na Ubuntu 14, converttiff, a potem tiff2pdf.
Camille Goudeseune,

To świetna odpowiedź, dziękuję bardzo i bardzo.
Lyubomyr Shaydariv

@ brian-z Czy w swojej odpowiedzi możesz wyjaśnić argument -quality 0?
SebMa

SebMa, @Nemo dodał to polecenie, ale myślę, że może powinno być -quality 100zamiast tego?
Brian Z

14

Jestem prawie pewien, że to, co postrzegają jako utrata jakości w formacie PDF, jest właśnie efektem Twoja przeglądarka plików PDF anty- „s aliasing funkcji.

Jeśli używasz evincedo przeglądania pliku PDF, możesz zobaczyć, że funkcja wygładzania jest automatycznie wyłączana przy pewnym powiększeniu (300% w moim szybkim teście). Widać to wyraźnie, gdy powiększasz - zauważysz, że w pewnym momencie piksele stają się nagle wyraźnie widoczne. W tym momencie wygładzanie krawędzi musi zostać wyłączone, aby umożliwić dokładną kontrolę obrazu.


Hmm - to ma sens, ale myślę, że miałem nadzieję, że uda mi się jakoś ustawić obraz i „początkowy widok” na 100%, aby wyglądał wyraźniej.
cwd

1
@cwd Nie pomyl powiększenia (sposobu sprawdzania pliku) z faktyczną przyczyną wygładzania obrazu: wygładzaniem . Obraz jest poprawnie przechowywany. Jest to przeglądarka plików PDF, która Cię oszuka. Ale może być nawet na odwrót - jeśli weźmiesz jakieś inne aplikacje do oglądania lub zmienisz ich ustawienia. Następnie można zobaczyć ostry obraz w pliku PDF i wygładzony plik PNG w przeglądarce zdjęć.
rozcietrzewiacz

3

Brian Z powyżej podał poniżej, który jest poprawny, w pełni odwracalny i bezstratny (zakładając, że krok konwersji jest w rzeczywistości bezstratny, co moim zdaniem jest lub przynajmniej powinno być) sposobem na umieszczenie png w pdf. Musisz być przekonwertowany z png do bezstratnego jp2, aby zachować zgodność ze strukturą / czytnikami PDF (tak myślę).

$ convert sample.png -quality 0 sample.jp2
$ img2pdf -o sample.pdf sample.jp2

Warto jednak zauważyć, że możesz sam dostarczyć pliki .png bezpośrednio do img2pdf, np .:

$ img2pdf -o sample.pdf sample-page1.png <sample-page2.png ...>

Spowoduje to utworzenie najmniejszego pliku pdf i bezstratnie wstawi surowy hex png do obiektów w pliku pdf *.

* Wadą jest to, że proces ten nie jest odwracalny w przeciwieństwie do korzystania z jp2. Dane nagłówka / stopki i fragmentu nagłówka / stopki zostały usunięte (co czyni pliki jeszcze mniejszymi!) Z wstawionego pliku png, pozostawiając tylko surowe dane obrazu (usunięte metadane są zintegrowane ze strukturą pdf), przypuszczalnie „zhakuj” plik pdf, aby wyświetlić surowy plik PNG, który jest technicznie niezgodny z kontenerem. Wyświetla się dobrze w Firefoksie i może wyświetlać się dobrze we wszystkich współczesnych czytnikach, ale jeśli png jest niezgodny z kontenerem, ścisli czytelnicy mogą nie wyświetlać surowych danych png (ponieważ nie powinni się tego spodziewać / przetwarzać poprawnie).

Tutaj możesz znaleźć niezwykle surowy skrypt bash, który pracował dla mnie, aby wyodrębnić i zrekonstruować pliki png z dopasowanymi skrótami do tych, które są używane do wprowadzania do pliku pdf. https://github.com/jack4455667788/RebuildRawPNGExtractedFromPDF


2

PDF to format wektorowy (tzn. Plik zawiera opis linii do narysowania), podczas gdy inne formaty (JPG, PNG) to formaty rastrowe (plik opisuje, jaki kolor ma malować każdy piksel). Jeśli wysadzisz plik PDF, nadal są to tylko ostre linie; JPG i PNG pokazują pikselację.

(OK, OK, skłamałem. Plik PDF może być także rastrem).


2

Myślę, że parametr png-to-pdf -densitypowinien być mały, a nie duży. Możesz spróbować czegoś takiegoconvert -quality 100 -density 50


3
Nie, większa gęstość jest zdecydowanie lepsza, właśnie wykonałem test, 50 daje wiele bardzo widocznych pikseli, 300 jest ładnych i wyraźnych.
shaunhusain

To mnie dezorientuje, ale myślę, że większa gęstość powoduje, że wyjście ma niższą rozdzielczość. Oznacza to, że jeśli dane wyjściowe są rozmyte (przesadzone, jak w przykładzie z pierwotnego pytania), to niższa gęstość jest tym, czego chcesz. Ale jeśli plik PDF jest podzielony na piksele, rzeczywiście trzeba przekonwertować go z większą gęstością.
Brian Z
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.