# How to create a correct (grayscale) PDF/X-3 file using Ghostscript

I’m trying to convert arbitrary PDF files (a magazine created with pdfLaTeX, containing some photos, but also some graphics such as webcomics) to valid PDF/X-3 using Ghostscript and I want the result to be in grayscale/monochrome. I don’t know a lot about ICC color profiles and I don’t really care about color management in any case, so if this easier without ICC profiles, then I don’t mind. I’m willing to let the printer do their thing with my file – I don’t need absolute color fidelity (especially since we’re talking about grayscale here).

I’ve been trying to get it to work using the Ghostscript documentation, section “Creating a PDF/X-3 document”. Based on that, my attempt looks like this:

``````gs                                   \
-dSAFER -sDEVICE=pdfwrite          \
-dEmbedAllFonts                    \
-sProcessColorModel=DeviceGray     \
-sColorConversionStrategy=Gray     \
-dPDFX -dPDFACompatibilityPolicy=1 \
-o 'output.pdf' -f 'my_pdfx_def.ps' 'input.pdf'
``````

Where `my_pdfx_def.ps` contains the following, based on the template that comes with Ghostscript:

``````%!

systemdict /ProcessColorModel known {
systemdict /ProcessColorModel get dup /DeviceGray ne exch /DeviceCMYK ne and
} {
true
} ifelse
{ (ERROR: ProcessColorModel must be /DeviceGray or /DeviceCMYK.)=
/ProcessColorModel cvx /rangecheck signalerror
} if

[ /GTS_PDFXVersion (PDF/X-3:2002) % Must be so (the standard requires).
/Trapped /False                 % Must be so (Ghostscript doesn't provide other).
/DOCINFO pdfmark

% Define an ICC profile:

currentdict /ICCProfile known {
[/_objdef {icc_PDFX} /type /stream /OBJ pdfmark
[{icc_PDFX} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {4} ifelse >> /PUT pdfmark
[{icc_PDFX} ICCProfile (r) file /PUT pdfmark
} if

% Define the output intent dictionary:

[/_objdef {OutputIntent_PDFX} /type /dict /OBJ pdfmark
[{OutputIntent_PDFX} <<
/Type /OutputIntent              % Must be so (the standard requires).
/S /GTS_PDFX                     % Must be so (the standard requires).
/OutputCondition (Commercial and specialty printing) % Customize
/Info (none)                     % Customize
/OutputConditionIdentifier (CGATS TR001)      % Customize
/RegistryName (http://www.color.org)   % Must be so (the standard requires).
currentdict /ICCProfile known {
/DestOutputProfile {icc_PDFX}  % Must be so (see above).
} if
>> /PUT pdfmark
[{Catalog} <</OutputIntents [ {OutputIntent_PDFX} ]>> /PUT pdfmark
``````

This does run and produces a file that superficially seems OK in my PDF viewer. However, I’m not sure that this is actually enough (producing a valid/sensible PDF/X-3 document) considering the long list of things I’m supposed to do according to Ghostscript’s documentation. In particular, it says

To create a PDF/X-3 document from a Postscript or a PDF file, you should :

[…]

• Specify a PDF/X definition file before running the input document. It provides additional information to be included into the output document. A sample PDF/X definition file may be found in `gs/lib/PDFX_def.ps`.
• If a registered printing condition is applicable, specify its identifier in the PDF/X definition file. Otherwise provide an ICC profile and specify it in the PDF/X definition file as explained below.

I tried adapting the file `PDFX_def.ps` it mentions (see above), but I don’t know what an `OutputCondition` is or what I’m supposed to put for that. Unfortunately, this is barely documented in the Ghostscript docs. I tried setting an `.icc` file in my customized version, but couldn’t get Ghostscript to find that file – no matter what, I always got “`Error: /invalidfileaccess in --file--`”. And which color profile would I be using, anyway?

• Provide a `DefaultRGB` resource file in the ColorSpace resource category. Either define it in the PDF/X definition file, or provide a definition of `gs/Resource/ColorSpace/DefaultRGB`. `gs/Resource/ColorSpace/DefaultRGB` is usually distributed with Ghostscript, its content may not necessarily satisfy your needs, see below.

Needless to say, it doesn’t specify how to do this. But in any case, do I even need this considering I want grayscale?

• Specify, using `-sOutputICCProfile`, an ICC profile which represents the color space (either CMYK or Gray) of the final file. This is the same ICC profile used in the PDF/X definition file as the ICCProfile. Even if you are using a standard `OutputCondition` and do not need to specify an ICCProfile, you must still set `OutputICCProfile` with an appropriate ICC profile in order for proper color conversion.

Well, I didn’t specify `-sOutputICCProfile` and that didn’t seem to do any harm. Should I still? (Again, where am I supposed to pull the ICC profile out from?)