User Tools

Site Tools


software:troubleshoot:ps2pdf

Troubleshoot ps2pdf

This page investigates why ps2pdf under windows doesn't accept certain command line parameters like:

  • -sPAPERSIZE=a4 (Obviously you should use double quotes: “-sPAPERSIZE=a4”

When trying to convert a ps file to pdf, we should use the following command:

ps2pdf in.ps out.pdf

With the above command the papersize defaults to the system locale setting, which is letter. For a4 papersize we should use:

ps2pdf "-sPAPERSIZE=a4" in.ps out.pdf

Mind the double quotes. Curiously this command doesn't produce an a4 page size.

Because ps2pdf (or specifically ps2pdf.bat) is just a kind of wrapper for gswin32c, trying the following command below directly with gswin32c produces an a4 page:

gswin32c "-sPAPERSIZE=a4" -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -o out.pdf -f in.ps

while:

gswin32c "-sPAPERSIZE=letter" -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -o out.pdf -f in.ps

Produces a letter sized pdf file.

To find out why ps2pdf doesn't work as expected, I try to dissect the procedure.

Windows NT cmd files

In the ghostscript lib directory (C:\Program Files\gs\gs8.56\lib) there are the following related files:

  • ps2pdf.bat
  • ps2pdfxx.bat

See below for their contents.

ps2pdf.bat

@echo off
@rem $Id: ps2pdf.bat 6300 2005-12-28 19:56:24Z giles $

rem Convert PostScript to PDF 1.4 (Acrobat 4-and-later compatible).
rem The default PDF compatibility level may change in the future:
rem use ps2pdf12 or ps2pdf13 if you want a specific level.

rem The current default compatibility level is PDF 1.4.
echo -dCompatibilityLevel#1.4 >_.at
goto bot

rem Pass arguments through a file to avoid overflowing the command line.
:top
echo %1 >>_.at
shift
:bot
if not %3/==/ goto top
call ps2pdfxx %1 %2

ps2pdfxx.bat

@echo off
@rem $Id: ps2pdfxx.bat 6300 2005-12-28 19:56:24Z giles $
rem Internal batch file for calling pdfwrite driver.

rem The files that call this one (ps2pdf*.bat) write the command-line
rem options into _.at, and then pass the last 2 (or fewer) arguments
rem to this file.
 
call gssetgs.bat
echo -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite >_.at2
 
if "%OS%"=="Windows_NT" goto nt

rem	Run ps2pdf on any Microsoft OS.
 
if %1/==/ goto usage
if %2/==/ goto usage

rem Watcom C deletes = signs, so use # instead.
rem We have to include the options twice because -I only takes effect if it
rem appears before other options.
 
:run
echo -sOutputFile#%2 >>_.at2
copy /b /y _.at2+_.at >NUL
echo -c .setpdfwrite -f %1 >>_.at2
%GSC% @_.at @_.at2
goto end
 
:usage
echo Usage: ps2pdf [options...] input.[e]ps output.pdf
goto end

rem	Run ps2pdf on Windows NT.
 
:nt
if not CMDEXTVERSION 1 goto run
if %1/==/ goto ntusage
if %2/==/ goto nooutfile
goto run
 
:ntusage
echo Usage: ps2pdf input.ps [output.pdf]
echo    or: ps2pdf [options...] input.[e]ps output.pdf
goto end
 
:nooutfile
rem We don't know why the circumlocution with _1 is needed....
set _1=%1
set _outf=%_1:.PS=.pdf%
if %_1%==%_outf% goto addsuff
call ps2pdfxx %1 %_outf%
goto postsuff
 
:addsuff
call ps2pdfxx %1 %1%.pdf
 
:postsuff
set _1=
set _outf=
 
:end
rem	Clean up.
if exist _.at erase _.at
if exist _.at2 erase _.at2

Problem found

From the above code, it seems that the windows version of ps2pdf doesn't parse options as written in the manual:

...
The usage for ps2pdf is

    ps2pdf [options] input.[e]ps output.pdf
...

If I use the following command:

ps2pdf "-sPAPERSIZE=a4" in.ps out.pdf

Analyzing this command from the 'windows' point of view::

  1. ps2pdf.bat is invoked. It gets three arguments: %1, %2 and %3. Specifically:
    %1 = “-sPAPERSIZE=a4”
    %2 = in.ps
    %3 = out.pdf
  2. The text -dCompatibilityLevel#1.4 is written to a text file called _.at which resides in the same directory as your working directory.
  3. If the third argument, %3, is not empty, append the first argument, %1, to the file _.at
  4. Shift all arguments out one further, repeat previous step above until only last two arguments are left.
  5. once finished the following command is called:
    ps2pdfxx %1 %2
    with %1: in.ps, %2: out.pdf and all [options] are stored in the file _.at
software/troubleshoot/ps2pdf.txt · Last modified: 2009/10/04 17:44 by admin