Jak destylować / rasteryzować plik PDF w systemie Linux

14

W naszym biurze mamy drukarkę, która drukuje pliki PDF z pamięci USB. Drukuje większość plików w porządku, ale ma problemy z niektórymi, szczególnie tymi generowanymi z lateksem. Niektóre pliki PDF po prostu odmawia drukowania, niektóre pliki PDF drukuje czcionką kurierską, a niektóre drukuje dobrze, z wyjątkiem równań.

Szukam sposobu na „destylację” plików PDF do absolutnie pewnego formatu do wydrukowania. Albo przez uproszczenie / znormalizowanie pliku PDF do tego stopnia, że ​​każdy moduł renderujący go poprawnie wyrenderuje, albo przez zwykłe uczynienie każdej strony obrazem rastrowym 600 dpi w pliku PDF. (Mógłbym podzielić plik PDF na poszczególne obrazy rastrowe i połączyć je ręcznie, ale chcę coś skryptowalnego).

Rozmiar pliku wyjściowego nie ma znaczenia, o ile jest pewny do wydrukowania, ma rozmiar papieru A4 (lub oryginał) i rozdzielczość 300 ~ 600 dpi.

Sampo
źródło
Może pdf2ps może pomóc, jeśli drukarka obsługuje PostScript.
frlan
To ma być drukarka PostScript, ale ta obsługa jest nawet gorsza niż w przypadku PDF (i nie będzie drukować PS z pamięci USB).
Sampo,

Odpowiedzi:

23

Po bezskutecznym wypróbowaniu niektórych opcji renderowania czcionek jako kontury (w tym to pytanie i pstoedit), wymyśliłem sposób łatwej konwersji pliku PDF do postaci zrasteryzowanej za pomocą ImageMagick:

convert -density 600 +antialias input.pdf output.pdf

Spowoduje to utworzenie pliku PDF renderowanego w rozdzielczości 600 dpi z wyłączonymi antyaliami (niepotrzebne przy tej rozdzielczości).

Pliki wyjściowe są ogromne (~ 30 MB dla 8-stronicowego dokumentu) i bardzo wolno drukują, ale powinny działać, o ile drukarka ma wystarczającą ilość pamięci do renderowania zawartości.

Sampo
źródło
1
Tak! Użyłem tego do spłaszczenia warstw w moim pliku PDF, aby odnieść wielki sukces. + Antialias nie były konieczne, ponieważ mieliśmy tylko obrazy (to nie miało znaczenia) i obniżyłem rozdzielczość do 150, ponieważ wydawało się to wystarczające do archiwizacji bez zajmowania tak dużo miejsca. Dzięki!
mlissner
2
Pamiętaj, że convertnie zachowuje zawartości formularzy, które mogłeś wypełnić. (Chciałem zrasteryzować plik PDF, aby upewnić się, że zawartość formularza wszędzie wygląda tak samo, w szczególności, że będzie wyświetlana przede wszystkim przez każdą przeglądarkę plików PDF). Aby zachować zawartość formularza, użyj evince(lub cokolwiek innego aplikacja, której użyłeś do wypełnienia formularza), aby wydrukować dokument „do pliku” - jest to kolejny plik PDF, w którym zawartość formularza faktycznie stała się częścią zwykłego tekstu. Następnie nadal możesz zrasteryzować ten nowy plik PDF, w zależności od potrzeb.
balu
Zauważ, że włącza to antyaliasing ( +antialias), a nie ( -antialias).
xiii1408
Nie, +antialiaswyłącza wygładzanie krawędzi: imagemagick.org/script/command-line-options.php?#antialias
Sampo
1
Musiałem ulepszyć imagemagick ( stackoverflow.com/questions/42928765/... ), aby to zadziałało.
SteveSong,
1

Używanie imagemagick nie jest, moim zdaniem, stabilne przy wysokich rozdzielczościach i / lub dużych plikach. Wiele drukarek ma rozdzielczość 1200 dpi i więcej, więc zrasteryzowany plik powinien mieć podobną rozdzielczość. Lepszym rozwiązaniem jest użycie pdf2djvu, który jest szybszy, bardziej niezawodny, a nawet tworzy pliki o rozmiarze, który często dorównuje oryginalnemu plikowi PDF w rozdzielczości 1200 lub 2400 dpi. Pliki te można przeglądać i drukować za pomocą okularu lub evince.

Przykład:

pdf2djvu -d 2400 file.pdf > rastered.djvu
mjo
źródło
1

Myślę, że mój obecny preferowany sposób to:

  1. Użyj pdftoppm, aby przekonwertować plik PDF na serię obrazów.

    $ pdftoppm source.pdf wyjście -png

  2. Użyj img2pdf, aby utworzyć plik pdf z tych obrazów.

    $ img2pdf * .png -o output.pdf

Dobrą wiadomością jest to, że możesz stworzyć skrypt bash, aby zautomatyzować cały proces.

Oto skrypt bash, który destyluje wszystkie pliki pdf w katalogu i zachowuje oryginały w nowym katalogu „oryginały”.

#!/bin/bash

mkdir "originals";
for filename in ./*.pdf; do
    pdftoppm "$filename" output -png
    mv "$filename" ./originals
    img2pdf *.png "-o" "$filename"
    rm *.png
done

Kredyty: img2pdf answer & pdftoppm answer & bash script script pomoc: 1 i 2

(Uwaga dodatkowa) Możesz zainstalować img2pdf przy użyciu:

$ sudo apt install img2pdf

Michał
źródło
-1

Inną alternatywą jest konwersja na obrazy za pomocą czegoś podobnego

pdfimages

Ze strony podręcznika „Pdfimages zapisuje obrazy z pliku Portable Document Format (PDF) jako Portable Pixmap (PPM), Portable Bitmap (PBM) lub JPEG. Pdfimages odczytuje plik PDF plik PDF, skanuje jedną lub więcej stron, i zapisuje jeden plik PPM, PBM lub JPEG dla każdego obrazu, image-root-nnn.xxx, gdzie nnn to numer obrazu, a xxx to typ obrazu (.ppm, .pbm, .jpg). ”

Następnie użyj pdftk, aby przekonwertować z powrotem na plik PDF https://www.pdflabs.com/docs/pdftk-cli-examples/

Na koniec wydrukuj ten plik. Oczywiście kluczowym pytaniem jest, jak to zrobić.

Możesz to zautomatyzować za pomocą prostej strony internetowej dla użytkowników. W końcu drukują przekonwertowany plik i powinieneś mieć wyższą wydajność i wydruk działający?

dtbnguyen
źródło
3
pdfimages wyodrębnia osadzone obrazy rastrowe z plików PDF, nie rasteryzuje tekstu ani grafiki wektorowej.
Sampo,