Конвертировать HTML в изображение

22

Задний план

Пакетное преобразование различных исходных файлов с подсветкой синтаксиса (C, SQL, Java, PHP, batch, bash) в изображения с высоким разрешением (600 точек на дюйм), подходящие для электронных книг и печатных книг.

Неудачные решения

Ряд попыток пока:

  • OpenOffice или LibreOffice - приходится повторно импортировать исходный код в документ каждый раз, когда изменяется исходный файл. (То есть решение не может быть легко автоматизировано для сотен или тысяч исходных файлов.)
  • EnScript. Не может легко изменить цвета, неправильно отображает вывод, не является исчерпывающим.
  • LyX / LaTeX. Несовершенно оказывает вывод.
  • gvim to HTML - HTMLDOC в PostScript - GhostScript для PNG. HTMLDOC игнорирует fontтеги.
  • gvim to HTML - html2ps - GhostScript для PNG. Цвета RGB не распознаются html2ps.
  • Firefox для PostScript - GhostScript для PNG. Неприятно обходной.
  • gvim to HTML - OmniFormat к чему угодно. Бесплатная версия не подходит для пакетной обработки; много рекламных всплывающих окон.
  • pygments. Не может легко изменить разрешение изображения; не имеет диапазона цветовых схем gvim.

Ближайшее решение

Решение, которое почти работает:

  • gvim to HTML - wkhtmltopdf to PDF. Потребуется постобработка с ImageMagick ( wkhtmltoimage не может установить разрешение изображения, только ширину страницы).

Требования

  • Windows и Linux, но любой из них приемлем.
  • Бесплатно или OSS
  • Только командная строка (подходит для пакетной обработки)
  • Легко изменить цветовую гамму
  • Поддержка: PHP, Batch, Bash, Java, JavaScript, R, C и SQL

Вопрос

Любые другие способы преобразовать выделенный синтаксисом исходный код в изображение с высоким разрешением (600 точек на дюйм)?

Спасибо!

Дейв Джарвис
источник
@ Дэйв Джарвис: почему wkhtmltoimageи настройки ширины страницы недостаточно? высота не может быть указана, так как она определяется содержанием HTML-материала. imho width - это все, что вам действительно нужно, вы можете рассчитать необходимую ширину, исходя из того, сколько пикселей на дюйм вы хотите.
Акира
@ Дэйв Джарвис: ну, просто скажите мне, сколько дюймов вы хотите покрыть, и я скажу вам, сколько пикселей вам понадобится. «Обрезка» результата с помощью convert впоследствии хорошая идея, но она несколько разрушает идею «dpi». вы всегда начинаете с "Мне нужно заполнить этот x-дюймовый пробел, и я хочу, чтобы он был заполнен z-точками на дюйм" ... и на основе этой формулы вы запрашиваете пиксели.
Акира
@akira: ширина зависит от количества столбцов, которые использует исходный код. Иногда ширина будет 75 символов. Иногда это будет 40 символов. Таким образом, 75 символов должны занимать около 5,5 дюймов, а 40 символов - чуть больше, чем половина. Значение 5,5 зависит от полей книги, которые могут быть изменены (один или два раза). Это расчет, который должен быть сделан автоматически, кстати, в противном случае решение не может быть автоматизировано, что наносит ущерб всей цели.
Дэйв Джарвис
@ Дэйв Джарвис: да, я понимаю твою проблему. вам повезло с конвертированием, что вывод webkit в вашем случае действительно масштабируемый и, таким образом, вы можете «изменить» размер pdf впоследствии. для интегрированного решения, я подозреваю, понадобится какой-то уровень масштабирования и ширина «браузера»
akira
Кстати, какой формат документа вы используете для создания книги или печатной книги (латекс, xsl-fo .. и т. д.?)
Акира

Ответы:

9

Требования к программному обеспечению

Следующие пакеты программного обеспечения доступны как для систем Windows, так и для Linux, и необходимы для полного рабочего решения:

  • gvim - используется для экспорта выделенного синтаксиса исходного кода в HTML.
  • moria - Цветовая схема для подсветки синтаксиса.
  • wkhtmltoimage - используется для преобразования документов HTML в файлы PNG.
  • gawk and sed - Инструменты для обработки текста.
  • ImageMagick - используется для обрезки PNG и добавления рамки.

Общие шаги

Вот как работает решение:

  1. Загрузите исходный код в редактор, который может добавить всплески цвета.
  2. Экспортируйте исходный код в виде HTML-документа (со встроенными FONTтегами).
  3. Уберите атрибут фона из документа HTML (чтобы обеспечить прозрачность).
  4. Преобразуйте документ HTML в файл PNG.
  5. Обрежьте границу PNG.
  6. Добавьте небольшую 25-пиксельную рамку вокруг изображения.
  7. Удалить временные файлы.

Сценарий генерирует изображения одинаковой ширины для исходных файлов, содержащих строки длиной до 80 символов. Исходные файлы со строками длиной более 80 символов приводят к изображениям шириной, необходимой для сохранения всей строки.

Установка

Установите компоненты в следующих местах:

  • гвим -C:\Program Files\Vim
  • Мория -C:\Program Files\Vim\vim73\colors
  • wkhtmltoimage -C:\Program Files\wkhtml
  • ImageMagick -C:\Program Files\ImageMagick
  • Гоук и Сед -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 довольно просто.

Акира
источник
Это ошибка документации, к сожалению. dpiОпция не доступна с версии Windows.
Дейв Джарвис
@ Дэйв Джарвис: хорошо. тогда ... продолжай и используй QtWebkit. .)
Акира
Или вы можете установить Linux как VM (VirtualBox или что-то подобное) и выполнить преобразование там ...
icyrock.com
0

Вы также можете использовать командную строку формы преобразования Open Office для Html-> PDF:

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

Шамит Верма
источник
@Dave, с OO (OpenOffice), решение будет следующим: 1. Используйте какой-нибудь инструмент для генерации HTML-файлов с подсветкой синтаксиса. 2. Конвертировать HTML в PDF с помощью OO. Поскольку обе эти операции могут быть выполнены из командной строки, должно быть легко автоматизировать процесс для N числа файлов.
Шамит Верма
OpenOffice действительно не является решением. Это медленно, глючно, имеет огромное количество накладных расходов (т.е. Java) и занимает больше времени, чем установка wkhtmltoimage. Кроме того, ваше решение является теоретическим. Если вы создаете рабочий пакетный файл, который точно воспроизводит результаты, src2png.batкак указано в правильном ответе (с прозрачными фоновыми изображениями), и конвертирует HTML за меньшее время, чем при использовании в wkhtmltoimageкачестве полностью автоматического решения, я рекомендую вам опубликовать результаты в качестве альтернативы. , Кроме того, что было бы преимуществом замены wkhtmltoimageна OpenOffice?
Дейв Джарвис,