Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting Source ASCII Files to JPEGs

I publish technical books, in print, PDF, and Kindle/MOBI, with EPUB on the way.

The Kindle does not support monospace fonts, which are kinda useful for source code listings. The only way to do monospace fonts is to convert the text (Java source, HTML, XML, etc.) into JPEG images. More specifically, due to pagination issues, a given input ASCII file needs to be split into slices of ~6 lines each, with each slice turned into a JPEG, so listings can span a screen. This is a royal pain.

My current mechanism to do that involves:

  1. Running expand to set a consistent 2-space tab size, which pipes to...
  2. a2ps, which pipes to...
  3. A small Perl snippet to add a "%%LanguageLevel: 3\n" line, which pipes to...
  4. ImageMagick's convert, to take the (E)PS and make a JPEG out it, with an appropriate background, cropped to 575x148+5+28, etc.

That used to work 100% of the time. It now works 95% of the time. The rest of the time, I get convert: geometry does not contain image errors, which I cannot seem to get rid of, in part because I don't understand what the problem is.

Before this process, I used to use a pretty-print engine (source-highlight) to get HTML out of the source code...but then the only thing I could find to convert the HTML into JPEGs was to automate screen-grabs from an embedded Gecko engine. Reliability stank, which is why I switched to my current mechanism.

So, if you were you, and you needed to turn source listings into JPEG images, in an automated fashion, how would you do it? Bonus points if it offers some sort of pretty-print process (e.g., bolded keywords)!

Or, if you know what typically causes convert: geometry does not contain image, that might help. My current process is ugly, but if I could get it back to 100% reliability, that'd be just fine for now.

Thanks in advance!

like image 451
CommonsWare Avatar asked Jul 25 '09 19:07

CommonsWare


People also ask

How do I change a file type to JPEG?

Go to File > Save as and open the Save as type drop-down menu. You can then select JPEG and PNG, as well as TIFF, GIF, HEIC, and multiple bitmap formats. Save the file to your computer and it will convert.


3 Answers

You might consider html2ps and then imagemagick's convert.

A thought: if your target (Kindle?) supports PNG, use that in preference to JPEG for this text rendering.

like image 196
Will Avatar answered Nov 01 '22 19:11

Will


html2ps is an excellent program -- I used it to produce a 1300-page book once, but it's overkill if you just want plain text -> postscript. Consider enscript instead.

like image 38
Edward Falk Avatar answered Nov 01 '22 19:11

Edward Falk


Because the question of converting HTML to JPG has been answered, I will offer a suggestion on the pretty printer. I've found Pygments to be pretty awesome. It supports different themes and has lexers for pretty much any language out there (they advertise the fact that it even highlights brainfuck). There's a command line tool and it's available on most Linux distros.

like image 1
Felix Avatar answered Nov 01 '22 19:11

Felix