HTML in Bild konvertieren

22

Hintergrund

Batch-Konvertierung verschiedener syntaktisch hervorgehobener Quelldateien (C, SQL, Java, PHP, Batch, Bash) in hochauflösende Bilder (600 dpi), die für ein eBook und ein gedrucktes Buch geeignet sind.

Fehlgeschlagene Lösungen

Bisher einige Versuche:

  • OpenOffice oder LibreOffice - Bei jeder Änderung der Quelldatei muss der Quellcode erneut in das Dokument importiert werden. (Das heißt, die Lösung kann nicht einfach für Hunderte oder Tausende von Quelldateien automatisiert werden.)
  • Enskript. Farben können nicht einfach geändert werden, die Ausgabe wird unvollständig wiedergegeben.
  • LyX / LaTeX. Rendert die Ausgabe unvollständig.
  • gvim zu HTML - HTMLDOC zu PostScript - GhostScript zu PNG. HTMLDOC ignoriert fontTags.
  • gvim zu HTML - html2ps - GhostScript zu PNG. RGB-Farben werden von nicht erkannt html2ps.
  • Firefox zu PostScript - GhostScript zu PNG. Widerlich umständlich.
  • gvim zu HTML - OmniFormat zu irgendetwas. Kostenlose Version für Stapelverarbeitung ungeeignet; viele Werbe-Popups.
  • pygments. Die Bildauflösung kann nicht einfach geändert werden. hat keine Farbpalette von gvim.

Nächste Lösung

Die Lösung, die fast funktioniert, ist:

  • gvim zu HTML - wkhtmltopdf zu PDF. Benötigt eine Nachbearbeitung mit ImageMagick ( wkhtmltoimage kann nicht die Bildauflösung einstellen, nur die Seitenbreite).

Bedarf

  • Windows und Linux, aber beides ist akzeptabel.
  • Kostenlos oder OSS
  • Nur Befehlszeile (geeignet für Stapelverarbeitung)
  • Einfaches Ändern des Farbschemas
  • Unterstützung: PHP, Batch, Bash, Java, JavaScript, R, C und SQL

Frage

Gibt es noch andere Möglichkeiten, um syntaktisch hervorgehobenen Quellcode in ein hochauflösendes Bild (600 dpi) umzuwandeln?

Vielen Dank!

Dave Jarvis
quelle
@ Dave Jarvis: Warum ist das wkhtmltoimageEinstellen der Seitenbreite nicht ausreichend? Die Höhe kann nicht angegeben werden, da sie durch den Inhalt des HTML-Materials bestimmt wird. Imho-Breite ist alles, was Sie tatsächlich benötigen. Sie können die erforderliche Breite basierend auf der Anzahl der gewünschten Pixel pro Zoll berechnen.
Akira
@ Dave Jarvis: Nun, sag mir einfach, wie viel Zoll du abdecken möchtest und ich sage dir, wie viel Pixel du brauchen wirst. Das Ergebnis mit Konvertieren nachträglich zu "trimmen" ist eine nette Idee, zerstört aber die Idee von "dpi" ein wenig. Sie beginnen immer mit "Ich muss diesen x-Zoll-Raum füllen und ich möchte, dass er mit z-Punkten pro Zoll gefüllt wird". Und basierend auf dieser Formel fordern Sie Pixel an.
Akira
@akira: Die Breite ist abhängig von der Anzahl der Spalten, die der Quellcode verwendet. Manchmal beträgt die Breite 75 Zeichen. Manchmal sind es 40 Zeichen. 75 Zeichen sollten also etwa 5,5 Zoll einnehmen, und 40 Zeichen sollten etwas mehr als die Hälfte davon sein. Der 5,5-Wert hängt von den Seitenrändern des Buches ab, die sich ändern können (ein- oder zweimal). Dies ist eine Berechnung, die übrigens automatisch durchgeführt werden muss, da sonst die Lösung nicht automatisiert werden kann, was den gesamten Zweck zunichte macht.
Dave Jarvis
@ Dave Jarvis: Ja, ich verstehe dein Problem. Mit convert haben Sie das Glück, dass die Ausgabe des Webkits in Ihrem Fall wirklich skalierbar ist und Sie die PDF-Datei anschließend in der Größe ändern können. für eine integrierte lösung brauche man
vermutlich eine zoomstufe
Übrigens, welches Dokumentformat verwenden Sie, um das E-Book oder das gedruckte Buch (Latex, XSL-
FO

Antworten:

9

Software Anforderungen

Die folgenden Softwarepakete sind sowohl für Windows- als auch für Linux-Systeme verfügbar und für eine vollständige, funktionierende Lösung erforderlich:

  • gvim - Wird zum Exportieren von syntaktisch hervorgehobenem Quellcode nach HTML verwendet.
  • moria - Farbschema zum Hervorheben der Syntax.
  • wkhtmltoimage - Wird zum Konvertieren von HTML-Dokumenten in PNG-Dateien verwendet.
  • gawk and sed - Textverarbeitungswerkzeuge.
  • ImageMagick - Zum Zuschneiden des PNG und Hinzufügen eines Rahmens.

Allgemeine Schritte

So funktioniert die Lösung:

  1. Laden Sie den Quellcode in einen Editor, der Farbtupfer hinzufügen kann.
  2. Exportieren Sie den Quellcode als HTML-Dokument (mit eingebetteten FONTTags).
  3. Entfernen Sie das Hintergrundattribut aus dem HTML-Dokument (um Transparenz zu ermöglichen).
  4. Konvertieren Sie das HTML-Dokument in eine PNG-Datei.
  5. Schneiden Sie den PNG-Rand.
  6. Fügen Sie einen kleinen 25-Pixel-Rand um das Bild ein.
  7. Temporäre Dateien löschen.

Das Skript generiert Bilder mit der gleichen Breite für Quelldateien, die Zeilen mit einer Länge von weniger als 80 Zeichen enthalten. Quelldateien mit Zeilen von mehr als 80 Zeichen führen zu Bildern, die so breit sind, dass die gesamte Zeile erhalten bleibt.

Installation

Installieren Sie die Komponenten an folgenden Speicherorten:

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

Hinweis: ImageMagick verfügt über ein Programm convert.exe, das den Windows- convertBefehl nicht ersetzen kann . Aus diesem Grund muss der vollständige Pfad zu convert.exein der Batch-Datei fest codiert sein (im Gegensatz zum Hinzufügen von ImageMagick zu PATH).

Umgebungsvariablen

Setzen Sie die Umgebungsvariable PATH auf:

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

Batch-Datei

Führen Sie es aus mit:

src2png.bat src2png.bat

Erstellen Sie eine Stapeldatei, src2png.batindem Sie den folgenden Inhalt kopieren:

@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*.

Verbesserungen und Optimierungen sind willkommen.

Hinweis: Die neueste Version von wkhtmltoimage behandelt das Überschreiben der Hintergrundfarbe ordnungsgemäß. Somit ist die Zeile zum Entfernen des CSS für Hintergrundfarben theoretisch nicht mehr erforderlich.

Dave Jarvis
quelle
3

Lesen Sie die Manpage von wkhtmltoimage:

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

wenn das nicht hilft: eine einfache Lösung mit Qt und (dem mitgelieferten) Webkit zusammen zu hacken, ist ziemlich unkompliziert.

Akira
quelle
Das ist leider ein Dokumentationsfehler. Die dpiOption ist in der Windows-Version nicht verfügbar.
Dave Jarvis
@ Dave Jarvis: ok. dann ... fahren Sie fort und verwenden Sie QtWebkit. .)
Akira
Oder Sie können Linux als VM (VirtualBox oder so) installieren und die Konvertierung dort durchführen ...
icyrock.com 20.11.10
0

Sie können auch die Befehlszeile von Open Office für HTML-> PDF-Konvertierungsformular verwenden:

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

Schamit Verma
quelle
@ Dave, mit OO (OpenOffice) wäre die Lösung: 1. Verwenden Sie ein Tool, um HTML-Dateien mit Syntaxhervorhebung zu generieren. 2. Konvertieren Sie HTML in PDF mit OO. Da diese beiden Vorgänge über die Befehlszeile ausgeführt werden können, sollte es einfach sein, den Vorgang für N Dateien zu automatisieren.
Shamit Verma
OpenOffice ist wirklich keine Lösung. Es ist langsam, fehlerhaft, hat einen enormen Overhead (z. B. Java) und die Installation dauert länger als wkhtmltoimage. Auch Ihre Lösung ist theoretisch. Wenn Sie eine funktionierende Batch-Datei erstellen , die src2png.batdie in der richtigen Antwort angegebenen Ergebnisse genau wiedergibt (mit transparenten Hintergrundbildern) und HTML-Code in kürzerer Zeit konvertiert als dies wkhtmltoimagebei einer vollautomatischen Lösung der Fall ist, empfehlen wir Ihnen, die Ergebnisse als Alternative zu veröffentlichen . Was wäre der Vorteil eines Austauschs wkhtmltoimagedurch OpenOffice?
Dave Jarvis