Converti HTML in immagine


22

sfondo

Converti vari file sorgente evidenziati dalla sintassi (C, SQL, Java, PHP, batch, bash) in immagini ad alta risoluzione (600 dpi), adatte per un eBook e un libro stampato.

Soluzioni fallite

Numerosi tentativi finora:

  • OpenOffice o LibreOffice : devono reimportare il codice sorgente nel documento ogni volta che cambia il file sorgente. (Cioè, la soluzione non può essere facilmente automatizzata per centinaia o migliaia di file di origine.)
  • enscript. Impossibile cambiare facilmente i colori, rende in modo imperfetto l'output, non completo.
  • LyX / LaTeX. Rendering imperfetto dell'output.
  • gvim in HTML - HTMLDOC in PostScript - GhostScript in PNG. HTMLDOC ignora i fonttag.
  • gvim in HTML - html2ps - GhostScript in PNG. I colori RGB non sono riconosciuti da html2ps.
  • Da Firefox a PostScript - Da GhostScript a PNG. Odiosamente tortuoso.
  • gvim in HTML - OmniFormat per qualsiasi cosa. Versione gratuita non adatta per l'elaborazione in batch; molti pop-up pubblicitari.
  • Pygments. Non è possibile modificare facilmente la risoluzione dell'immagine; non ha la gamma di combinazioni di colori di gvim.

La soluzione più vicina

La soluzione che quasi funziona è:

  • gvim in HTML - wkhtmltopdf in PDF. Richiederà la post-elaborazione con ImageMagick ( wkhtmltoimage non può impostare la risoluzione dell'immagine, ma solo la larghezza della pagina).

Requisiti

  • Windows e Linux, ma entrambi sono accettabili.
  • Gratuito o OSS
  • Solo riga di comando (adatto per l'elaborazione batch)
  • Cambia facilmente la combinazione di colori
  • Supporto: PHP, batch, bash, Java, JavaScript, R, C e SQL

Domanda

Altri modi per convertire il codice sorgente evidenziato in sintassi in un'immagine ad alta risoluzione (600 dpi)?

Grazie!


@Dave Jarvis: perché wkhtmltoimagenon è sufficiente impostare la larghezza della pagina? l'altezza non può essere specificata poiché è determinata dal contenuto della roba html. imho width è tutto ciò di cui hai effettivamente bisogno, puoi calcolare la larghezza necessaria in base a quanti pixel per pollice desideri.
Akira,

@Dave Jarvis: bene, dimmi solo quanti pollici vuoi coprire e ti dico quanti pixel avrai bisogno. 'tagliare' il risultato con convert in seguito è una buona idea ma distrugge in qualche modo l'idea di 'dpi'. si inizia sempre con "ho bisogno di riempire questo x pollice di spazio e lo voglio riempito con z punti per pollice" .. e in base a quella formula che richiedi pixel.
Akira,

@akira: la larghezza dipende dal numero di colonne utilizzate dal codice sorgente. A volte la larghezza sarà di 75 caratteri. A volte sarà di 40 caratteri. Quindi 75 caratteri dovrebbero occupare circa 5,5 pollici e 40 caratteri dovrebbero essere leggermente più della metà. Il valore 5.5 dipende dai margini del libro, che sono soggetti a modifiche (una o due volte). Questo è un calcolo che deve essere fatto automaticamente, a proposito, altrimenti la soluzione non può essere automatizzata, il che vanifica l'intero scopo.
Dave Jarvis,

@Dave Jarvis: sì, capisco il tuo problema. sei fortunato con convert che l'output di webkit nel tuo caso è davvero scalabile e quindi potresti "ridimensionare" il pdf in seguito. per una soluzione integrata ho il sospetto che uno avrebbe bisogno di una sorta di livello di zoom E la larghezza del 'browser'
Akira

a proposito, qual è il formato del documento che stai usando per creare l'ebook o il libro stampato (latex, xsl-fo .. etc?)
Akira,

Risposte:


9

Requisiti software

I seguenti pacchetti software sono disponibili per i sistemi Windows e Linux e sono necessari per una soluzione completa e funzionante:

  • gvim - Usato per esportare il codice sorgente evidenziato dalla sintassi in HTML.
  • moria - Combinazione di colori per l'evidenziazione della sintassi.
  • wkhtmltoimage - Usato per convertire documenti HTML in file PNG.
  • gawk e sed - Strumenti per l'elaborazione del testo.
  • ImageMagick : utilizzato per tagliare il PNG e aggiungere un bordo.

Passaggi generali

Ecco come funziona la soluzione:

  1. Carica il codice sorgente in un editor che può aggiungere macchie di colore.
  2. Esporta il codice sorgente come documento HTML (con FONTtag incorporati ).
  3. Rimuovi l'attributo di sfondo dal documento HTML (per consentire la trasparenza).
  4. Converti il ​​documento HTML in un file PNG.
  5. Taglia il bordo del PNG.
  6. Aggiungi un piccolo bordo di 25 pixel attorno all'immagine.
  7. Elimina i file temporanei.

Lo script genera immagini della stessa larghezza per i file di origine contenenti righe di lunghezza inferiore a 80 caratteri. I file di origine con righe di lunghezza superiore a 80 caratteri generano immagini ampie quanto necessario per conservare l'intera riga.

Installazione

Installare i componenti nei seguenti percorsi:

  • 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

Nota: ImageMagick ha un programma chiamato convert.exe, che non può sostituire il convertcomando di Windows . Per questo motivo, il percorso completo convert.exedeve essere codificato nel file batch (anziché aggiungere ImageMagick a PATH).

variabili ambientali

Impostare la variabile di ambiente PATH su:

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

File batch

Eseguilo usando:

src2png.bat src2png.bat

Creare un file batch chiamato src2png.batcopiando i seguenti contenuti:

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

Miglioramenti e ottimizzazioni sono benvenuti.

Nota: l'ultima versione di wkhtmltoimage gestisce correttamente la sostituzione del colore di sfondo. Pertanto, la linea per rimuovere il CSS per i colori di sfondo non è più necessaria, in teoria.


3

leggendo la manpage di wkhtmltoimage:

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

se ciò non aiuta: hackerare insieme una soluzione semplice con Qt e (incluso) Webkit è piuttosto semplice.


Questo è un errore di documentazione, sfortunatamente. L' dpiopzione non è disponibile con la versione di Windows.
Dave Jarvis,

@Dave Jarvis: ok. quindi ... continua e usa QtWebkit. .)
Akira,

Oppure puoi installare Linux come VM (VirtualBox o simile) e fare la conversione lì ...
icyrock.com

0

Puoi anche usare Open Office per Html-> riga di comando del modulo di conversione PDF:

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


@Dave, con OO (OpenOffice), la soluzione sarebbe: 1. Utilizzare alcuni strumenti per generare file HTML con l'evidenziazione della sintassi. 2. Converti HTML in PDF con OO. Poiché entrambe queste operazioni possono essere eseguite dalla riga di comando, dovrebbe essere semplice automatizzare il processo per N numero di file.
Shamit Verma

OpenOffice non è davvero una soluzione. È lento, pieno di bug, ha una grande quantità di sovraccarico (cioè Java) e richiede più tempo per l'installazione di wkhtmltoimage. Inoltre, la tua soluzione è teorica. Se crei un file batch funzionante che riproduca esattamente i risultati src2png.batcome indicato nella risposta corretta (con immagini di sfondo trasparenti) e converta l'HTML in meno tempo rispetto all'utilizzo wkhtmltoimagepur essendo una soluzione completamente automatica, ti incoraggio a pubblicare i tuoi risultati come alternativa . Inoltre, quale sarebbe il vantaggio di sostituire wkhtmltoimagecon OpenOffice?
Dave Jarvis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.