Table of Contents
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::
- ps2pdf.bat is invoked. It gets three arguments: %1, %2 and %3. Specifically:
%1 = “-sPAPERSIZE=a4”
%2 = in.ps
%3 = out.pdf - The text -dCompatibilityLevel#1.4 is written to a text file called _.at which resides in the same directory as your working directory.
- If the third argument, %3, is not empty, append the first argument, %1, to the file _.at
- Shift all arguments out one further, repeat previous step above until only last two arguments are left.
- 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