How to convert a PDF to PNG with ImageMagick "convert" or Ghostscript?

ghostscript, image, imagemagick, pdf, png

Solution

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.

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

- 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

Problem

I'm trying to convert a PDF to a PNG image (at least the cover of one). I'm successfully extracting the first page of the PDF with pdftk. I'm using imagemagick to do the conversion: ``` convert cover.pdf cover.png ``` This works, but unfortunately the cover.png comes through incorrectly rendered (some of the alpha object in the PDF aren't rendered properly). I know ImageMagick uses GhostScript to do the conversion and if I do it directly with gs I can get the desired results, but I'd rather use the convert library as it has other tools I'd like to leverage. This command in GhostScript accomplishes the desired image: ``` gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf ``` I'm wondering is there any way to pass arguments through convert to GhostScript or am I stuck with calling GhostScript directly?

Original source

Related problems