Konwertuj HTML na obraz

22

tło

Batch konwertuje różne pliki źródłowe wyróżnione składnią (C, SQL, Java, PHP, batch, bash) na obrazy o wysokiej rozdzielczości (600 dpi), odpowiednie dla eBooków i drukowanych książek.

Nieudane rozwiązania

Dotychczasowe próby:

  • OpenOffice lub LibreOffice - Konieczne jest ponowne importowanie kodu źródłowego do dokumentu przy każdej zmianie pliku źródłowego. (Oznacza to, że rozwiązanie nie może być łatwo zautomatyzowane dla setek lub tysięcy plików źródłowych).
  • enscript. Nie można łatwo zmieniać kolorów, niedokładnie renderuje wydruk, nie jest kompleksowy.
  • LyX / LaTeX. Niedokładnie renderuje dane wyjściowe.
  • gvim do HTML - HTMLDOC do PostScript - GhostScript do PNG. HTMLDOC ignoruje fonttagi.
  • gvim do HTML - html2ps - GhostScript do PNG. Kolory RGB nie są rozpoznawane przez html2ps.
  • Firefox do PostScript - GhostScript do PNG. Nieprzyjemnie okrężny.
  • gvim do HTML - OmniFormat do czegokolwiek. Darmowa wersja nieodpowiednia do przetwarzania wsadowego; wiele wyskakujących okienek reklamowych.
  • świnie Nie można łatwo zmienić rozdzielczości obrazu; nie ma gvima w gamie schematów kolorów.

Najbliższe rozwiązanie

Prawie działającym rozwiązaniem jest:

  • gvim do HTML - wkhtmltopdf do PDF. Będzie wymagał przetwarzania końcowego za pomocą ImageMagick ( wkhtmltoimage nie może ustawić rozdzielczości obrazu, tylko szerokość strony).

Wymagania

  • Windows i Linux, ale oba są dopuszczalne.
  • Darmowy lub OSS
  • Tylko wiersz poleceń (odpowiedni do przetwarzania wsadowego)
  • Łatwo zmieniaj schemat kolorów
  • Wsparcie: PHP, wsadowy, bash, Java, JavaScript, R, C i SQL

Pytanie

Jakieś inne sposoby konwersji wyróżnionego składnią kodu źródłowego na obraz o wysokiej rozdzielczości (600 dpi)?

Dziękuję Ci!

Dave Jarvis
źródło
@Dave Jarvis: dlaczego wkhtmltoimagei ustawienie szerokości strony nie wystarcza? nie można określić wysokości, ponieważ jest ona określana na podstawie zawartości HTML. Szerokość imho jest wszystkim, czego naprawdę potrzebujesz, możesz obliczyć potrzebną szerokość na podstawie liczby pikseli na cal, którą chcesz.
akira
@Dave Jarvis: cóż, po prostu powiedz mi, jak wiele cali chcesz zakryć, a ja powiem ci, ile pikseli będziesz potrzebować. „przycięcie” wyniku za pomocą konwersji jest dobrym pomysłem, ale nieco niszczy pomysł „dpi”. zawsze zaczynasz od „muszę wypełnić ten x cal przestrzeni i chcę, aby był wypełniony kropkami z na cal” .. i na podstawie tej formuły żądasz pikseli.
akira
@akira: Szerokość zależy od liczby kolumn używanych przez kod źródłowy. Czasami szerokość będzie wynosić 75 znaków. Czasami będzie to 40 znaków. Więc 75 znaków powinno zająć około 5,5 cala, a 40 znaków powinno być nieco więcej niż połowę. Wartość 5,5 zależy od marginesów książki, które mogą ulec zmianie (raz lub dwa razy). Nawiasem mówiąc, jest to obliczenie, które należy wykonać automatycznie, w przeciwnym razie rozwiązanie nie może zostać zautomatyzowane, co psuje cały cel.
Dave Jarvis,
@Dave Jarvis: tak, rozumiem twój problem. masz szczęście z przekonwertowaniem, że dane wyjściowe pakietu webkit w twoim przypadku są naprawdę skalowalne, dzięki czemu możesz później „zmienić rozmiar” pliku pdf. podejrzewam, że dla zintegrowanego rozwiązania potrzebny byłby pewien poziom powiększenia ORAZ szerokość „przeglądarki”
akira,
btw, jakiego formatu dokumentu używasz do stworzenia ebooka lub drukowanej książki (lateks, xsl-fo .. itd.)
akira

Odpowiedzi:

9

Wymagania Systemowe

Następujące pakiety oprogramowania są dostępne dla systemów Windows i Linux i są wymagane dla kompletnego, działającego rozwiązania:

  • gvim - Używany do eksportowania podświetlonego składni kodu źródłowego do HTML.
  • moria - Schemat kolorów do podświetlania składni.
  • wkhtmltoimage - Używany do konwersji dokumentów HTML do plików PNG.
  • gawk i sed - Narzędzia do przetwarzania tekstu.
  • ImageMagick - Używany do przycinania PNG i dodawania ramki.

Ogólne kroki

Oto jak działa to rozwiązanie:

  1. Załaduj kod źródłowy do edytora, który może dodawać plamy koloru.
  2. Wyeksportuj kod źródłowy jako dokument HTML (z osadzonymi FONTznacznikami).
  3. Usuń atrybut tła z dokumentu HTML (aby umożliwić przezroczystość).
  4. Konwertuj dokument HTML na plik PNG.
  5. Przytnij granicę PNG.
  6. Dodaj małą, 25-pikselową ramkę wokół obrazu.
  7. Usuń pliki tymczasowe.

Skrypt generuje obrazy o tej samej szerokości dla plików źródłowych zawierających wiersze o długości poniżej 80 znaków. Pliki źródłowe z liniami o długości ponad 80 znaków dają obrazy tak szerokie, jak to konieczne do zachowania całej linii.

Instalacja

Zainstaluj komponenty w następujących lokalizacjach:

  • gvim -C:\Program Files\Vim
  • moria -C:\Program Files\Vim\vim73\colors
  • wkhtmltoimage -C:\Program Files\wkhtml
  • ImageMagick -C:\Program Files\ImageMagick
  • Gawk and Sed -C:\Program Files\GnuWin32

Uwaga: ImageMagick ma program o nazwie convert.exe, który nie może zastąpić convertpolecenia systemu Windows . Z tego powodu pełna ścieżka do convert.exepliku musi być zakodowana na stałe w pliku wsadowym (w przeciwieństwie do dodawania ImageMagick do PATH).

Zmienne środowiska

Ustaw zmienną środowiskową PATH na:

"C:\Program Files\Vim\vim73";"C:\Program Files\wkhtml";"C:\Program Files\GnuWin32\bin"

Plik wsadowy

Uruchom go za pomocą:

src2png.bat src2png.bat

Utwórz plik wsadowy o nazwie src2png.bat, kopiując następującą zawartość:

@ECHO OFF

SET NUMBERS=-c "set number"
IF "%2" == "" SET NUMBERS=

ECHO Converting %1 to %1.html...
gvim -e %1 -c "set nobackup" %NUMBERS% -c ":colorscheme moria" ^
  -c :TOhtml -c wq -c :q

REM Remove all background-color occurrences (without being self-referential)
sed -i "s/background-color: #......; \(.*\)}$/\1 }/g" %1.html

ECHO Converting %1.html to %1.png...
wkhtmltoimage --format png --transparent --minimum-font-size 80 ^
  --quality 100 --width 3600 ^
  %1.html %1.png

move %1.png %1.orig.png

REM If the text file has lines that exceed 80 characters, don't crop the
REM resulting image. (The book automatically shrinks large images to fit.)
REM The 3950 is the 80 point font at 80 characters with padding for line
REM numbers.
SET LENGTH=0
FOR /F %%l IN ('gawk ^
  "BEGIN {x=0} {if( length($0)>x ) x=length()} END {print x;}" %1') ^
DO (
  SET LENGTH=%%l
)
SET EXTENT=-extent 3950x
IF %LENGTH% GTR 80 SET EXTENT=

REM Trim the image height, then extend the width for 80 columns, if needed.
REM The result is that all images will be resized the same amount, thus
REM making the font size the same maximum for all source listings. Source
REM files beyond the 80 character limit will be scaled as necessary.
ECHO Trimming %1.png...
"C:\programs\ImageMagick\convert.exe" -format png %1.orig.png ^
  -density 150x150 ^
  -background none -antialias -trim +repage ^
  %EXTENT% ^
  -bordercolor none -border 25 ^
  %1.png

ECHO Removing old files...
IF EXIST %1.orig.png DEL /q %1.orig.png
IF EXIST %1.html DEL /q %1.html
IF EXIST sed*. DEL /q sed*.

Mile widziane ulepszenia i optymalizacje.

Uwaga: Najnowsza wersja wkhtmltoimage poprawnie obsługuje nadpisywanie koloru tła. Zatem teoretycznie linia do usuwania CSS dla kolorów tła nie jest już potrzebna.

Dave Jarvis
źródło
3

czytanie strony podręcznika wkhtmltoimage:

 -d,    --dpi   <dpi>   Change the dpi explicitly

jeśli to nie pomoże: zhakowanie prostego rozwiązania za pomocą Qt i (w zestawie) Webkit jest dość proste.

akira
źródło
To niestety błąd w dokumentacji. Ta dpiopcja nie jest dostępna w wersji Windows.
Dave Jarvis,
@Dave Jarvis: ok. potem ... idź dalej i użyj QtWebkit. .)
akira,
Lub możesz zainstalować Linuksa jako VM (VirtualBox lub
podobny
0

Możesz także użyć wiersza polecenia Open Office for Html-> PDF formularz konwersji:

http://www.oooninja.com/2008/02/batch-command-line-file-conversion-with.html

Shamit Verma
źródło
@Dave, w przypadku OO (OpenOffice) rozwiązaniem byłoby: 1. Użyj jakiegoś narzędzia do wygenerowania plików HTML z podświetleniem składni. 2. Konwertuj HTML na PDF za pomocą OO. Ponieważ obie te operacje można wykonać z wiersza poleceń, powinno być łatwo zautomatyzować proces dla liczby N plików.
Shamit Verma
OpenOffice naprawdę nie jest rozwiązaniem. Jest powolny, błędny, ma znaczną część kosztów ogólnych (tj. Java) i zajmuje więcej czasu niż instalacja wkhtmltoimage. Twoje rozwiązanie jest również teoretyczne. Jeśli utworzysz działający plik wsadowy, który dokładnie odtwarza wyniki src2png.batpodane w poprawnej odpowiedzi (z przezroczystymi obrazami tła) i konwertuje HTML w krótszym czasie niż użycie wkhtmltoimage, będąc rozwiązaniem w pełni automatycznym, zachęcam do opublikowania wyników jako alternatywy . Jaka byłaby zaleta zastąpienia wkhtmltoimageOpenOffice?
Dave Jarvis