Chuyển đổi HTML sang hình ảnh


22

Lý lịch

Batch chuyển đổi các tệp nguồn được tô sáng theo cú pháp khác nhau (C, SQL, Java, PHP, batch, bash) thành hình ảnh có độ phân giải cao (600dpi), phù hợp cho sách điện tử và sách in.

Giải pháp thất bại

Một số nỗ lực cho đến nay:

  • OpenOffice hoặc LibreScript - Phải nhập lại mã nguồn vào tài liệu mỗi khi tệp nguồn thay đổi. (Nghĩa là, giải pháp không thể dễ dàng tự động cho hàng trăm hoặc hàng nghìn tệp nguồn.)
  • ký hiệu. Không thể dễ dàng thay đổi màu sắc, đầu ra hoàn hảo, không toàn diện.
  • LyX / LaTeX. Hoàn hảo làm cho đầu ra.
  • gvim sang HTML - HTMLDOC sang PostScript - GhostScript sang PNG. HTMLDOC bỏ qua fontcác thẻ.
  • gvim sang HTML - html2ps - GhostScript sang PNG. Màu RGB không được công nhận bởi html2ps.
  • Firefox sang PostScript - GhostScript sang PNG. Đáng ghét mạch.
  • gvim sang HTML - OmniFormat cho bất cứ điều gì. Phiên bản miễn phí không phù hợp để xử lý hàng loạt; rất nhiều quảng cáo bật lên.
  • kim tự tháp. Không thể dễ dàng thay đổi độ phân giải hình ảnh; không có phạm vi phối màu của gvim.

Giải pháp gần nhất

Giải pháp gần như hoạt động là:

  • gvim sang HTML - wkhtmltopdf sang PDF. Sẽ yêu cầu xử lý hậu kỳ bằng ImageMagick ( wkhtmltoimage không thể đặt độ phân giải hình ảnh, chỉ chiều rộng trang).

Yêu cầu

  • Windows và Linux, nhưng hoặc là chấp nhận được.
  • Miễn phí hoặc OSS
  • Chỉ dòng lệnh (phù hợp để xử lý hàng loạt)
  • Dễ dàng thay đổi bảng màu
  • Hỗ trợ: PHP, batch, bash, Java, JavaScript, R, C và SQL

Câu hỏi

Có cách nào khác để chuyển đổi mã nguồn được tô sáng cú pháp thành hình ảnh có độ phân giải cao (600dpi) không?

Cảm ơn bạn!


@Dave Jarvis: tại sao wkhtmltoimagevà thiết lập độ rộng của trang không đủ? chiều cao không thể được chỉ định vì nó được xác định bởi nội dung của nội dung html. chiều rộng imho là tất cả những gì bạn thực sự cần, bạn có thể tính toán chiều rộng cần thiết dựa trên số lượng pixel trên mỗi inch bạn muốn.
akira

@Dave Jarvis: tốt, chỉ cần cho tôi biết bạn muốn che đi bao nhiêu inch và tôi sẽ cho bạn biết bạn sẽ cần bao nhiêu pixel. 'Cắt tỉa' kết quả với chuyển đổi sau đó là một ý tưởng hay nhưng phá hủy ý tưởng của 'dpi' phần nào. bạn luôn bắt đầu với "tôi cần lấp đầy khoảng trống x inch này và tôi muốn nó được lấp đầy bằng các chấm z trên mỗi inch" .. và dựa trên công thức đó bạn yêu cầu pixel.
akira

@akira: Chiều rộng phụ thuộc vào số lượng cột mà mã nguồn sử dụng. Đôi khi chiều rộng sẽ là 75 ký tự. Đôi khi nó sẽ là 40 ký tự. Vì vậy, 75 ký tự sẽ chiếm khoảng 5,5 inch và 40 ký tự nên nhiều hơn một nửa. Giá trị 5,5 phụ thuộc vào lề của cuốn sách có thể thay đổi (một hoặc hai lần). Đây là một tính toán cần phải được thực hiện tự động, nếu không, giải pháp không thể được tự động hóa, làm thất bại toàn bộ mục đích.
Dave Jarvis

@Dave Jarvis: vâng, tôi hiểu vấn đề của bạn. bạn thật may mắn khi chuyển đổi rằng đầu ra của webkit trong trường hợp của bạn thực sự có thể mở rộng và do đó bạn có thể 'thay đổi kích thước' pdf sau đó. đối với một giải pháp tích hợp, tôi nghi ngờ người ta sẽ cần một số mức thu phóng VÀ độ rộng của 'trình duyệt'
akira

btw, định dạng tài liệu bạn đang sử dụng để tạo ebook hoặc sách in (latex, xsl-fo .. vv?)
akira

Câu trả lời:


9

Yêu cầu phần mềm

Các gói phần mềm sau đây có sẵn cho cả hệ thống Windows và Linux và được yêu cầu cho một giải pháp hoàn chỉnh, hoạt động:

  • gvim - Được sử dụng để xuất cú pháp tô sáng mã nguồn sang HTML.
  • moria - Bảng màu để tô sáng cú pháp.
  • wkhtmltoimage - Được sử dụng để chuyển đổi tài liệu HTML thành tệp PNG.
  • gawksed - Công cụ xử lý văn bản.
  • ImageMagick - Được sử dụng để cắt PNG và thêm đường viền.

Các bước chung

Đây là cách giải pháp hoạt động:

  1. Tải mã nguồn vào một trình soạn thảo có thể thêm các mảng màu.
  2. Xuất mã nguồn dưới dạng tài liệu HTML (có FONTthẻ nhúng ).
  3. Tách thuộc tính nền từ tài liệu HTML (để cho phép độ trong suốt).
  4. Chuyển đổi tài liệu HTML thành tệp PNG.
  5. Cắt đường viền PNG.
  6. Thêm một đường viền nhỏ, 25 pixel xung quanh hình ảnh.
  7. Xóa các tập tin tạm thời.

Kịch bản tạo các hình ảnh có cùng chiều rộng cho các tệp nguồn chứa các dòng có độ dài dưới 80 ký tự. Các tệp nguồn có dòng dài hơn 80 ký tự dẫn đến hình ảnh càng rộng càng cần thiết để giữ lại toàn bộ dòng.

Cài đặt

Cài đặt các thành phần vào các vị trí sau:

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

Lưu ý: ImageMagick có một chương trình được gọi convert.exe, không thể thay thế convertlệnh Windows . Do đó, đường dẫn đầy đủ convert.exephải được mã hóa cứng trong tệp bó (trái ngược với việc thêm ImageMagick vào PATH).

Biến môi trường

Đặt biến môi trường PATH thành:

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

Tập tin hàng loạt

Chạy nó bằng cách sử dụng:

src2png.bat src2png.bat

Tạo một tệp bó được gọi src2png.batbằng cách sao chép các nội dung sau:

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

Cải tiến và tối ưu hóa chào đón.

Lưu ý: Phiên bản mới nhất của wkhtmltoimage xử lý đúng cách ghi đè màu nền. Do đó, theo lý thuyết, dòng để loại bỏ CSS cho màu nền không còn cần thiết nữa.


3

đọc trang của wkhtmltoimage:

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

nếu điều đó không giúp được gì: việc hack cùng một giải pháp đơn giản với Qt và Webkit (bao gồm) khá đơn giản.


Đó là một lỗi tài liệu, không may. Các dpitùy chọn là không có sẵn với các phiên bản Windows.
Dave Jarvis

@Dave Jarvis: ok. sau đó ... tiếp tục và sử dụng QtWebkit. .)
akira

Hoặc bạn có thể cài đặt Linux như VM (VirtualBox hay như vậy) và thực hiện chuyển đổi có ...
icyrock.com

0

Bạn cũng có thể sử dụng dòng lệnh mở của Office cho Html-> PDF:

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


@Dave, Với OO (OpenOffice), giải pháp sẽ là: 1. Sử dụng một số công cụ để tạo các tệp HTML có tô sáng cú pháp. 2. Chuyển đổi HTML sang PDF bằng OO. Vì cả hai thao tác này đều có thể được thực hiện từ dòng lệnh, nên dễ dàng tự động hóa quy trình cho N số tệp.
Shamit Verma

OpenOffice thực sự không phải là một giải pháp. Nó chậm, lỗi, có một lượng lớn chi phí (ví dụ, Java) và mất nhiều thời gian để cài đặt hơn wkhtmltoimage. Ngoài ra, giải pháp của bạn là lý thuyết. Nếu bạn tạo một tác tập tin batch để chính xác tái tạo kết quả src2png.batnhư được đưa ra trong câu trả lời đúng (với hình ảnh nền trong suốt) và cải HTML trong thời gian ít hơn so với sử dụng wkhtmltoimagetrong khi được một giải pháp hoàn toàn tự động, tôi khuyến khích bạn gửi kết quả của bạn như một sự thay thế . Ngoài ra, lợi thế của việc thay thế wkhtmltoimagebằng OpenOffice là gì?
Dave Jarvis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.