将源代码转换为语法高亮图像

Dav*_*vis 5 syntax-highlighting imagemagick openoffice-writer ghostscript enscript

背景

OpenOffice Writer无法链接到ASCII文本源文件,应用语法突出显示,将其包装在帧中,并在源文件更改时更新帧内容.但是,OpenOffice Writer可以链接到图像,并在更改时自动更新图像.

问题

图像需要是高分辨率(300 dpi或更高),语法着色适合白色背景(即打印页面).

如何从源代码文件自动创建高质量图像,例如:

  • SQL;
  • PostgreSQL函数;
  • Java的;
  • bash脚本; 和
  • R和PL/R?

尝试

大多数尝试都是以下主题的变体:

$ enscript --color -f Courier12 -B -1 --highlight=sql -h -o - source.sql |\
  convert - -trim -border 10 source.png
Run Code Online (Sandbox Code Playgroud)

这种方法存在一些问题:

  1. 决议缺乏(使用-resample并且-density没有改进).
  2. 语法高亮不适合白页(可能会改变enscript的颜色主题).
  3. 使用Courier100生成几个.png文件,需要将它们拼接在一起.
  4. -border 10意外更改背景颜色从白色到浅灰色.

手动解决方案

将源文件转换为PostScript - 完全避免使用ImageMagick - 然后将它们导入GIMP将产生所需的结果.不幸的是,该解决方案涉及一些手动工作,我的GIMP批处理编程经验几乎为零.

Dav*_*vis 5

软件要求

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

  • gvim - 用于将语法突出显示的源代码导出为HTML.
  • moria - 语法高亮的配色方案.
  • wkhtmltopdf - 将HTML文档转换为PDF或PostScript(PS)文档.
  • Ghostscript - 用于将PS转换为PNG.
  • ImageMagick - 用于修剪PNG并添加边框.

一般步骤

以下是该解决方案的工作原理:

  1. 将源代码加载到可以添加颜色的编辑器中.
  2. 将源代码导出为HTML文档(带有嵌入式FONT标记).
  3. 将HTML文档转换为PS文件.
  4. 将PS文件转换为PNG文件.
  5. 修剪PNG的白色边框和过分热的源代码边框.
  6. 使用与HTML文档相同的背景颜色在图像周围添加边框.
  7. 删除临时文件.

安装

将组件安装到以下位置:

  • gvim -C:\Program Files\Vim
  • moria -C:\Program Files\Vim\vim73\colors
  • wkhtmltopdf -C:\Program Files\wkhtml
  • Ghostscript -C:\Program Files\gs
  • ImageMagick -C:\Program Files\ImageMagick

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

环境变量

添加或更新以下环境变量:

  • GS_LIB =C:\Program Files\gs\gs9.00\lib
  • GS_PROG =C:\Program Files\gs\gs9.00\bin\gswin32.exe
  • 路径 ="C:\Program Files\Vim\vim73";"C:\Program Files\wkhtml";"C:\Program Files\gs\gs9.00\bin"

批处理文件

这是批处理源文本:

@ECHO OFF

ECHO Converting %1 to %1.html ...

gvim -e %1 -c "set nobackup" -c ":colorscheme moria" -c :TOhtml -c wq -c :q

ECHO Converting %1.html to %1.ps ...

wkhtmltopdf --quiet --dpi 1200 %1.html %1.ps

ECHO Converting %1.pdf to %1.png ...
IF EXIST %1.png DEL /q %1.png

gswin32 -q -dBATCH -dNOPAUSE -dSAFER -dNOPROMPT ^
 -sDEVICE=png16m -dDEVICEXRESOLUTION=600 -dDEVICEYRESOLUTION=600 ^
 -dDEVICEWIDTH=4958 -dDEVICEHEIGHT=7017 -dNOPLATFONTS ^
 -dTextAlphaBits=4 -sOutputFile=%1.png %1.ps

ECHO Trimming %1.png ...

move %1.png %1.orig.png

"C:\Program Files\ImageMagick\convert.exe" -trim +repage -trim +repage ^
  -bordercolor "#f0f0f0" -border 25x25 %1.orig.png %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 %1.ps DEL /q %1.ps
Run Code Online (Sandbox Code Playgroud)