HTML'yi resme dönüştür


22

Arka fon

Toplu çeşitli sözdizimi vurgulanmış kaynak dosyaları (C, SQL, Java, PHP, toplu iş, bash) bir eBook ve basılı kitap için uygun, yüksek çözünürlüklü görüntülere (600dpi) dönüştürür.

Başarısız Çözümler

Şimdiye kadar bir dizi girişim:

  • OpenOffice veya LibreOffice - Kaynak dosya her değiştiğinde kaynak kodu belgeye yeniden almanız gerekir . (Yani, çözüm yüzlerce veya binlerce kaynak dosya için kolayca otomatikleştirilemez.)
  • enscript. Kolayca renkleri değiştiremez, kusurlu bir şekilde çıktı vermez, kapsamlı değildir.
  • LyX / LaTeX. Kusursuz bir şekilde çıktı verir.
  • HTML'ye gvim - PostScript için HTMLDOC - PNScript için GhostScript. HTMLDOC fontetiketleri yok sayar .
  • HTML'ye gvim - html2ps - PNG için GhostScript. RGB renkleri tarafından tanınmıyor html2ps.
  • Firefox'tan PostScript'e - GhostScript'ten PNG'ye. Obnoxiously dolambaçlı.
  • HTML'ye gvim - Her şeye OmniFormat. Toplu işleme için uygun olmayan ücretsiz sürüm; birçok reklam pop-up'ı.
  • pygments. Görüntü çözünürlüğü kolayca değiştirilemez; gvim'in renk şemaları yelpazesine sahip değil.

En Yakın Çözüm

Neredeyse işe yarayan çözüm:

  • HTML'ye gvim - wkhtmltopdf ile PDF arası. ImageMagick ile son işlem gerektirecektir ( wkhtmltoimage görüntü çözünürlüğünü ayarlayamaz, sadece sayfa genişliğini).

Gereksinimler

  • Windows ve Linux, ya da kabul edilebilir.
  • Ücretsiz veya OSS
  • Yalnızca komut satırı (toplu işleme için uygun)
  • Renk düzenini kolayca değiştirin
  • Destek: PHP, toplu iş, bash, Java, JavaScript, R, C ve SQL

Soru

Sözdizimi vurgulanmış kaynak kodunu yüksek çözünürlüklü (600dpi) bir resme dönüştürmenin başka yolları var mı?

Teşekkür ederim!


@Dave Jarvis: neden wkhtmltoimageve sayfanın genişliğini ayarlamak yeterli değil? html sayfalarının içeriği tarafından belirlendiğinden yükseklik belirtilemez. imho width gerçekte ihtiyacınız olan tek şey, istediğiniz genişliği inç başına istediğiniz piksel sayısına göre hesaplayabilirsiniz.
akira

@Dave Jarvis: peki, ne kadar mırçayı kaplamak istediğinizi söyleyin ve size ne kadar piksele ihtiyacınız olduğunu söyleyeyim. Daha sonra dönüştürerek sonucu 'kırpmak' güzel bir fikir ancak 'dpi' fikrini bir şekilde yok ediyor. her zaman "bu x inç boşluğunu doldurmam gerekiyor ve inç başına z noktalarıyla doldurulmasını istiyorum" ile başlarsınız ve bu formüle dayanarak pikselleri istersiniz.
akira

@ akira: Genişlik kaynak kodun kullandığı sütun sayısına bağlıdır. Bazen genişlik 75 karakter olur. Bazen 40 karakter olur. Bu yüzden 75 karakter yaklaşık 5.5 inç sürmeli ve 40 karakter bunun yarısından biraz fazla olmalıdır. 5.5 değeri, değişime tabi (bir veya iki kez) kitabın kenar boşluklarına bağlıdır. Bu, bu arada otomatik olarak yapılması gereken bir hesaplamadır, aksi halde çözüm otomatik olarak yapılamaz, bu da tüm amacı yener.
Dave Jarvis,

@Dave Jarvis: evet, probleminizi anlıyorum. Webkit çıktısının sizin durumunuzda gerçekten ölçeklenebilir olduğunu ve böylece pdf'yi 'yeniden boyutlandırabildiğiniz' için çok şanslısınız. Entegre bir çözüm için, bir tür yakınlaştırma seviyesine ve 'tarayıcının' genişliğine ihtiyaç duyacağından şüpheleniyorum
akira

btw, e-kitabı veya basılı kitabı (lateks, xsl-fo .. vb.) oluşturmak için kullandığınız belge formatı nedir?
akira 21:10

Yanıtlar:


9

yazılım gereksinimleri

Aşağıdaki yazılım paketleri hem Windows hem de Linux sistemleri için mevcuttur ve eksiksiz bir çalışma çözümü için gereklidir:

  • gvim - Sözdizimi vurgulu kaynak kodunu HTML'ye dışa aktarmak için kullanılır.
  • moria - Sözdizimi vurgulama için renk şeması.
  • wkhtmltoimage - HTML belgelerini PNG dosyalarına dönüştürmek için kullanılır.
  • gawk ve sed - Metin işleme araçları.
  • ImageMagick - PNG'yi kırpmak ve kenarlık eklemek için kullanılır.

Genel adımlar

Çözüm nasıl çalışıyor:

  1. Kaynak kodunu, renk sıçraması ekleyebilecek bir düzenleyiciye yükleyin.
  2. Kaynak kodu bir HTML belgesi olarak dışa aktarın (gömülü FONTetiketlerle).
  3. Arkaplan özniteliğini HTML belgesinden soyun (saydamlığa izin vermek için).
  4. HTML belgesini bir PNG dosyasına dönüştürün.
  5. PNG sınırını kesin.
  6. Resmin çevresine küçük, 25 piksel kenarlık ekleyin.
  7. Geçici dosyaları silin.

Komut uzunluğu 80 karakterin altındaki satırları içeren kaynak dosyalar için aynı genişlikte görüntüler oluşturur. Çizgileri 80 karakterden uzun olan kaynak dosyalar, tüm çizgiyi korumak için görüntülerin gerektiği kadar geniş olmasına neden olur.

Kurulum

Bileşenleri aşağıdaki konumlara takın:

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

Not: ImageMagick, convert.exeWindows convertkomutunun yerini alamayan bir programa sahiptir . Bu nedenle convert.exe, toplu iş dosyasında (ImageMagick eklenmesi yerine) tam yolun kodlanmış olması gerekir PATH.

Ortam Değişkenleri

PATH ortam değişkenini şu şekilde ayarlayın :

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

Toplu iş dosyası

Kullanarak çalıştırın:

src2png.bat src2png.bat

src2png.batAşağıdaki içerikleri kopyalayarak adlı bir toplu iş dosyası oluşturun :

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

İyileştirmeler ve optimizasyonlar memnuniyetle karşılanır.

Not: wkhtmltoimage'in en son sürümü , arka plan rengini geçersiz kılmayı düzgün şekilde ele alır. Dolayısıyla, arkaplan renkleri için CSS'yi çıkarmak için hat teoride artık gerekli değildir.


3

sayfasını okuyarak wkhtmltoimage:

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

bu işe yaramazsa: Qt ve (dahil) Webkit ile basit bir çözümü bir araya getirmek oldukça basittir.


Bu maalesef bir dokümantasyon hatası. Bu dpiseçenek Windows sürümünde mevcut değildir.
Dave Jarvis,

@Dave Jarvis: tamam. sonra ... devam et ve QtWebkit'i kullan. .)
akira

Yoksa ... VM (VirtualBox veya) olarak Linux kurmak ve orada dönüşüm yapabilir
icyrock.com

0

Open Office'i Html-> PDF dönüştürme formu komut satırı için de kullanabilirsiniz:

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


@Dave, OO (OpenOffice) ile çözüm şöyle olacaktır: 1. Sözdizimi vurgusu olan HTML dosyaları oluşturmak için bazı araçlar kullanın. 2. HTML'yi OO ile PDF'ye dönüştürün. Her iki işlem de komut satırından yapılabildiğinden, N dosya sayısı için işlemi otomatikleştirmek kolay olmalıdır.
Shamit Verma

OpenOffice gerçekten bir çözüm değil. Yavaş, adamcağız, çok fazla miktarda ek yükü (yani, Java) var ve yüklemesi daha uzun sürüyor wkhtmltoimage. Ayrıca, çözümünüz teoriktir. Eğer bir oluşturursanız çalışan tam sonuçlarını iyi üretmesi toplu dosyasını src2png.batkullanarak daha kısa sürede (saydam arka plan resimleri ile) doğru cevap verildiği şekilde ve dönüşürse HTML wkhtmltoimagetam otomatik çözüm olurken, ben alternatif olarak sonuçlarınızı göndermek için teşvik . Ayrıca, wkhtmltoimageOpenOffice ile değiştirmenin avantajı ne olurdu ?
Dave Jarvis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.