แปลง HTML เป็นรูปภาพ


22

พื้นหลัง

Batch แปลงไฟล์ต้นฉบับที่เน้นไวยากรณ์ (C, SQL, Java, PHP, batch, bash) เป็นภาพความละเอียดสูง (600dpi) เหมาะสำหรับ eBook และหนังสือที่พิมพ์

แนวทางแก้ไขล้มเหลว

จำนวนครั้งที่พยายาม:

  • OpenOfficeหรือLibreOffice - ต้องนำซอร์สโค้ดไปยังเอกสารอีกครั้งทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ต้นฉบับ (นั่นคือการแก้ปัญหาไม่สามารถอัตโนมัติได้อย่างง่ายดายสำหรับหลายร้อยหรือหลายพันของไฟล์ที่มา)
  • enscript ไม่สามารถเปลี่ยนสีได้อย่างง่ายดายทำให้เอาต์พุตไม่สมบูรณ์ไม่ครอบคลุม
  • LyX / LaTeX แสดงผลเอาต์พุตไม่ถูกต้อง
  • gvim เป็น HTML - HTMLDOC เป็น PostScript - GhostScript เป็น PNG HTMLDOC จะละเว้นfontแท็ก
  • gvim เป็น HTML - html2ps - GhostScript เป็น PNG สี RGB html2psจะไม่ได้รับการยอมรับจาก
  • Firefox เป็น PostScript - GhostScript เป็น PNG อ้อมค้อมอย่างน่ารังเกียจ
  • gvim เป็น HTML - OmniFormat เป็นอะไรก็ได้ รุ่นฟรีไม่เหมาะสำหรับการประมวลผลชุด; ป๊อปอัปโฆษณาจำนวนมาก
  • pygments ไม่สามารถเปลี่ยนความละเอียดของภาพได้อย่างง่ายดาย ไม่มีชุดรูปแบบสีของ gvim

ทางออกที่ใกล้ที่สุด

วิธีแก้ปัญหาที่เกือบจะได้ผลคือ:

  • gvim เป็น HTML - wkhtmltopdf เป็น PDF จะต้องมีการประมวลผลภายหลังด้วย ImageMagick ( wkhtmltoimageไม่สามารถตั้งค่าความละเอียดของภาพความกว้างของหน้ากระดาษเท่านั้น)

ความต้องการ

  • Windows และ Linux แต่เป็นที่ยอมรับ
  • ฟรีหรือ OSS
  • บรรทัดคำสั่งเท่านั้น (เหมาะสำหรับการประมวลผลแบทช์)
  • เปลี่ยนชุดรูปแบบสีได้อย่างง่ายดาย
  • สนับสนุน: PHP, แบทช์, ทุบตี, Java, JavaScript, R, C และ SQL

คำถาม

มีวิธีอื่นใดในการแปลงซอร์สโค้ดที่เน้นไวยากรณ์เป็นภาพความละเอียดสูง (600dpi)?

ขอขอบคุณ!


@Dave Jarvis: ทำไมwkhtmltoimageและตั้งค่าความกว้างของหน้าไม่เพียงพอหรือไม่ ไม่สามารถระบุความสูงได้เนื่องจากถูกกำหนดโดยเนื้อหาของเนื้อหา html imho width คือทั้งหมดที่คุณต้องการจริง ๆ คุณสามารถคำนวณความกว้างที่ต้องการตามจำนวนพิกเซลต่อนิ้วที่คุณต้องการ
akira

@Dave Jarvis: ดีแค่บอกฉันว่าคุณต้องการปกปิดนิ้วเท่าไหร่และฉันจะบอกคุณว่าต้องใช้พิกเซลมากแค่ไหน 'ตัดแต่ง' ผลลัพธ์ด้วยการแปลงในภายหลังเป็นความคิดที่ดี แต่ก็ทำลายความคิดของ 'dpi' บ้าง คุณมักจะเริ่มต้นด้วย "ฉันต้องการเติมเต็มพื้นที่ x นิ้วนี้และฉันต้องการมันเต็มไปด้วยจุด z ต่อนิ้ว" .. และตามสูตรที่คุณขอพิกเซล
กิระ

@akira: ความกว้างขึ้นอยู่กับจำนวนคอลัมน์ที่ซอร์สโค้ดใช้ บางครั้งความกว้างจะเป็น 75 ตัวอักษร บางครั้งมันจะเป็น 40 ตัวอักษร ดังนั้น 75 ตัวอักษรควรใช้เวลาประมาณ 5.5 นิ้วและ 40 ตัวอักษรควรมากกว่าครึ่งหนึ่ง ค่า 5.5 ขึ้นอยู่กับระยะขอบของหนังสือซึ่งอาจมีการเปลี่ยนแปลง (หนึ่งหรือสองครั้ง) นี่คือการคำนวณที่ต้องทำโดยอัตโนมัติไม่เช่นนั้นวิธีการแก้ปัญหาจะไม่สามารถทำงานแบบอัตโนมัติซึ่งเอาชนะจุดประสงค์ทั้งหมด
Dave Jarvis

@ Dave Jarvis: ใช่ฉันเข้าใจปัญหาของคุณ คุณโชคดีที่มีการแปลงว่าผลลัพธ์ของ webkit ในกรณีของคุณสามารถปรับขนาดได้และทำให้คุณสามารถ 'ปรับขนาด' ไฟล์ pdf ได้ในภายหลัง เพื่อแก้ปัญหาแบบบูรณาการที่ฉันสงสัยว่าหนึ่งจะต้องบางชนิดของการซูมระดับสูงและความกว้างของ 'เบราว์เซอร์ส
อากิระ

btw รูปแบบเอกสารที่คุณใช้ในการสร้าง ebook หรือหนังสือที่พิมพ์ (ลาเท็กซ์, xsl-fo .. ฯลฯ ) คืออะไร
Akira

คำตอบ:


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 อักขระส่งผลให้รูปภาพกว้างเท่าที่จำเป็นเพื่อคงบรรทัดทั้งเส้น

การติดตั้ง

ติดตั้งคอมโพเนนต์ลงในตำแหน่งต่อไปนี้:

  • gvim -C:\Program Files\Vim
  • มอเรีย -C:\Program Files\Vim\vim73\colors
  • wkhtmltoimage -C:\Program Files\wkhtml
  • ImageMagick -C:\Program Files\ImageMagick
  • Gawk and Sed -C:\Program Files\GnuWin32

หมายเหตุ: ImageMagick มีโปรแกรมที่เรียกว่าconvert.exeซึ่งไม่สามารถแทนที่convertคำสั่งWindows ด้วยเหตุนี้เส้นทางแบบเต็มจะ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

อ่าน manpage ของwkhtmltoimage:

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

ถ้านั่นไม่ได้ช่วย: การแฮ็ควิธีแก้ปัญหาอย่างง่ายด้วย Qt และ (รวมอยู่ด้วย) Webkit นั้นค่อนข้างตรงไปตรงมา


นั่นเป็นข้อผิดพลาดของเอกสาร แต่น่าเสียดายที่ dpiตัวเลือกที่ไม่สามารถใช้ได้กับ Windows รุ่น
Dave Jarvis

@Dave Jarvis: ตกลง จากนั้น ... ไปต่อและใช้ 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
Shamit Verma

OpenOffice ไม่ใช่ทางออก มันช้ารถมีจำนวนมากมายของค่าใช้จ่าย (เช่น Java) wkhtmltoimageและใช้เวลานานกว่าที่จะติดตั้ง นอกจากนี้วิธีการแก้ปัญหาของคุณเป็นเชิงทฤษฎี หากคุณสร้างไฟล์แบทช์ที่ทำงานซึ่งจะทำซ้ำผลลัพธ์src2png.batตามที่ระบุในคำตอบที่ถูกต้อง (พร้อมภาพพื้นหลังโปร่งใส) และแปลง HTML ในเวลาน้อยกว่าการใช้wkhtmltoimageในขณะที่เป็นโซลูชันอัตโนมัติอย่างสมบูรณ์ฉันขอแนะนำให้คุณโพสต์ผลลัพธ์ของคุณ . นอกจากนี้ข้อดีของการแทนที่wkhtmltoimageด้วย OpenOffice คืออะไร
เดฟจาร์วิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.