Converting A PDF To PNG


Answer :

You can use one commandline with two commands (gs, convert) connected through a pipe, if the first command can write its output to stdout, and if the second one can read its input from stdin.




  1. Luckily, gs can write to stdout (... -o %stdout ...).

  2. Luckily, convert can read from stdin (convert -background transparent - output.png).



Problem solved:




  • GS used for alpha channel handling a special image,

  • convert used for creating transparent background,

  • pipe used to avoid writing out a temp file on disk.



Complete solution:



gs -sDEVICE=pngalpha       \
-o %stdout \
-r144 cover.pdf \
| \
convert \
-background transparent \
- \
cover.png





Update



If you want to have a separate PNG per PDF page, you can use the %d syntax:



gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf


This will create PNG files named page-000.png, page-001.png, ... (Note that the %d-counting is zero-based -- file-000.png corresponds to page 1 of the PDF, 001 to page 2...



Or, if you want to keep your transparent background, for a 100-page PDF, do



for i in {1..100}; do        \
\
gs -sDEVICE=pngalpha \
-dFirstPage="${i}" \
-dLastPage="${i}" \
-o %stdout \
-r144 input.pdf \
| \
convert \
-background transparent \
- \
page-${i}.png ; \
\
done


Out of all the available alternatives I found Inkscape to produce the most accurate results when converting PDFs to PNG. Especially when the source file had transparent layers, Inkscape succeeded where Imagemagick and other tools failed.



This is the command I use:



inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"


And here it is implemented in a script:



#!/bin/bash

while [ $# -gt 0 ]; do

pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift

done

echo "All jobs done. Exiting."


To convert pdf to image files use following commands:



For PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf



For JPG gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf



If you have multiple pages add to name %03d gs -o a%03d.jpg a.pdf



What each option means:




  • sDEVICE={jpeg,pngalpha,png16m...} - filetype

  • -o - output file (%stdout to stdout)

  • -dTextAlphaBits=4 - font antialiasing.

  • -r300 - 300 dpi



Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable