将HTML转换为图像


22

背景

将各种语法突出显示的源文件(C,SQL,Java,PHP,批处理,bash)批量转换为高分辨率图像(600dpi),适用于电子书和印刷书籍。

解决方案失败

迄今为止的尝试:

  • OpenOfficeLibreOffice-每次源文件更改时,都必须将源代码重新导入文档中。(也就是说,对于数百或数千个源文件,该解决方案无法轻松实现自动化。)
  • 文字。无法轻松更改颜色,无法完美渲染输出,不够全面。
  • LyX / LaTeX。不完美地呈现输出。
  • 从gvim到HTML —从HTMLDOC到PostScript —从GhostScript到PNG。HTMLDOC忽略font标签。
  • gvim到HTML — html2ps — GhostScript到PNG。不能识别RGB颜色html2ps
  • Firefox到PostScript — GhostScript到PNG。令人circuit回曲折。
  • gvim到HTML — OmniFormat到任何东西。免费版本不适合批处理;很多广告弹出窗口。
  • 色素。无法轻松更改图像分辨率;没有gvim的配色范围。

最近的解决方案

几乎可行的解决方案是:

  • gvim到HTML — wkhtmltopdf到PDF。将需要使用ImageMagick进行后处理(wkhtmltoimage不能设置图像分辨率,只能设置页面宽度)。

要求

  • Windows和Linux,但可以接受。
  • 免费或OSS
  • 仅命令行(适用于批处理)
  • 轻松更改配色方案
  • 支持:PHP,批处理,bash,Java,JavaScript,R,C和SQL

还有其他方法可以将语法突出显示的源代码转换为高分辨率(600dpi)的图像?

谢谢!


@Dave Jarvis:为什么wkhtmltoimage设置页面宽度不够?由于高度是由html内容决定的,因此无法指定高度。imho宽度是您实际需要的全部,您可以根据所需的每英寸多少像素来计算所需的宽度。
akira 2010年

@戴夫·贾维斯(Dave Jarvis):好吧,告诉我您想要覆盖多大的英寸,我告诉您您需要多少像素。事后用转换来“修剪”结果是一个不错的主意,但是却在某种程度上破坏了“ dpi”的主意。您始终以“我需要填充此x英寸的空间,并且我希望它填充每英寸的z点”开始..根据该公式,您需要像素。
akira

@akira:宽度取决于源代码使用的列数。有时宽度为75个字符。有时会是40个字符。因此,75个字符应占用约5.5英寸,而40个字符应略大于该字符的一半。5.5值取决于书籍的页边距,该页边距可能会更改(一次或两次)。顺便说一句,这是需要自动进行的计算,否则解决方案将无法自动化,从而破坏了整个目的。
戴夫·贾维斯

@戴夫·贾维斯:是的,我知道你的问题。您对convert感到很幸运,因为在这种情况下,webkit的输出确实具有可伸缩性,因此您可以在之后“调整” PDF的大小。对于一个集成解决方案,我怀疑有人需要某种缩放级别和“浏览器”的宽度
akira 2010年

顺便说一句,您用来创建电子书或印刷书的文档格式是什么(乳胶,xsl-fo等)?
akira 2010年

Answers:


9

软件需求

以下软件包可用于Windows和Linux系统,并且是完整,有效的解决方案所必需的:

  • gvim-用于将语法突出显示的源代码导出到HTML。
  • moria-语法突出显示的配色方案。
  • wkhtmltoimage-用于将HTML文档转换为PNG文件。
  • gawksed-文本处理工具。
  • ImageMagick-用于修剪PNG并添加边框。

一般步骤

解决方案的工作原理如下:

  1. 将源代码加载到可以添加颜色飞溅的编辑器中。
  2. 将源代码导出为HTML文档(带有嵌入式FONT标签)。
  3. 从HTML文档中剥离background属性(以实现透明)。
  4. 将HTML文档转换为PNG文件。
  5. 修剪PNG边框。
  6. 在图像周围添加25像素的小边框。
  7. 删除临时文件。

该脚本为包含长度均小于80个字符的行的源文件生成宽度完全相同的图像。行长超过80个字符的源文件会生成足够宽的图像,以保留整行。

安装

将组件安装到以下位置:

  • GVIM -C:\Program Files\Vim
  • 莫里亚 -C:\Program Files\Vim\vim73\colors
  • wkhtmltoimage -C:\Program Files\wkhtml
  • ImageMagick的 -C:\Program Files\ImageMagick
  • GAWK桑达 -C:\Program Files\GnuWin32

注意:ImageMagick有一个名为的程序convert.exe,该程序不能替代Windows convert命令。因此,convert.exe必须在批处理文件中对的完整路径进行硬编码(与将ImageMagick添加到相对PATH)。

环境变量

将PATH 环境变量设置为:

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

批处理文件

使用以下命令运行它:

src2png.bat src2png.bat

src2png.bat通过复制以下内容创建一个名为的批处理文件:

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

欢迎进行改进和优化。

注意:最新版本的wkhtmltoimage可以正确处理覆盖背景色。因此,从理论上讲,不再需要为背景色移除CSS的行。


3

阅读以下手册wkhtmltoimage

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

如果这样做没有帮助:使用Qt和(包括的)Webkit共同破解一个简单的解决方案非常简单。


不幸的是,这是一个文档错误。dpiWindows版本不提供该选项。
戴夫·贾维斯

@戴夫·贾维斯(Dave Jarvis):好的。然后...继续使用QtWebkit。。)
akira

或者,您可以将Linux安装为VM(VirtualBox等)并在那里进行转换...
icyrock.com 2010年

0

您还可以使用Open Office for Html-> PDF转换表单命令行:

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


@Dave,使用OO(OpenOffice),解决方案是:1.使用某种工具生成具有语法突出显示的HTML文件。2.使用OO将HTML转换为PDF。由于这两种操作都可以从命令行完成,因此应该很容易将N个文件的过程自动化。
Shamit Verma

OpenOffice确实不是解决方案。它速度慢,有故障,具有大量的开销(例如Java),并且安装时间比更长wkhtmltoimage。同样,您的解决方案是理论上的。如果您创建的工作批处理文件能够完全再现src2png.bat正确答案中给出的结果(带有透明背景图像),并且转换为HTML的时间比使用wkhtmltoimage全自动解决方案的时间短,那么我建议您发布结果作为替代方案。另外,wkhtmltoimage用OpenOffice 取代的好处是什么?
戴夫·贾维斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.