[gs-devel] Converting PDF to PS keeping native resolution
ken.sharp at artifex.com
Fri Apr 17 01:10:15 PDT 2009
At 22:01 16/04/2009 -0400, you wrote:
>using gs directly). However, the PDF contains a low-resolution bitmap,
>and I would like the bitmap to keep the same resolution in the PS
>file. However, it seems that the default behaviour is for pdf2ps/gs to
>rasterize the bitmap to a specific resolution.
Actually the 'bitmap' is converted into a series of rectangular fills, one
rectangle per pixel.
In fact the PDF file not only contains an image, the image has a soft mask
as well, so this file involves transparency and is therefore considerably
more complex than you might think. The soft mask seems pointless, since it
appears to have all the values at 255.
See later regarding transparency.
>Is there any way to prevent this from happening? I want to be able to
>convert files which may have bitmaps of varying resolution to start
>with, so I am looking for a way to simply conserve the original
>resolution when converting to a PS file.
This is the way that pswrite works. Do you specifically need level 1
PostScript or DSC-compliant PostScript output ? If so then I'm afraid this
is the only way to go.
However, if you can accept non-DSC level 2 output, you could use the
ps2write device instead of the pswrite device. This is based on the
pdfwrite device and does a *much* better job of preserving the details of
the input. Pswrite often degenerates into lower level primitives, ps2write
does this much less often.
Currently (expanding the commands in pdf2ps) your command line looks more
or less like this:
gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pswrite -q -sOutputFile=$2 $1
If you instead use:
gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=ps2write -q -sOutputFile=$2 $1
The file comes out at 686Kb and contains image data.
Specific to this file
Please note that, like the pswrite data, this output involves transparency
'flattening', that is conversion of transparent areas to an image, because
PostScript does not support transparency. This image is created at the
specified output resolution, it is important that you make sure this is
high enough for reasonable output on your printer if you intend to print
the PostScript. (use the -r switch to set the resolution).
Ghostscript has no choice in this, it cannot preserve the transparency
because there is no provision for it in the PostScript imaging model. It
does the best it can by converting the transparent area into an image, and
embedding that, which is adequate for printing provided you ensure a decent
resolution is selected during the conversion process.
This is why the output, at ~700Kb for me, is so much larger than the
original. Rather than containing the original low resolution image, and low
resolution soft mask, both stretched to cover the requisite area, the
combination has been converted to a much larger bitmap at a higher
The original format of the data is lost though, and unrecoverable, so you
should only do this if you do not intend further conversion, for example
back to PDF.
I'm afraid your goal of preserving the original image is not possible with
this file, when converting to PostScript.
More information about the gs-devel