我不知道有任何现成的开源软件可以满足您的要求。
通过编写自己的 shell 脚本(或其他程序)只能解决其中的一部分问题。
检测图像的分辨率。
运行pdfimages -list some.pdf
以输出 PDF 中包含的图像列表以及它们的尺寸......看似。但并不明显的是:这些尺寸是原始图像的尺寸(嵌入在 PDF 中)。这可能是 720x720 像素。但是,如果渲染到页面的 10x10 平方英寸,则此图像在页面上的 DPI 为 72。如果在 1x1 英寸的正方形上渲染,它将是 720 DPI。PDF 中的两种“渲染”类型都可以从同一个嵌入的原始图像中进行,而当前“图形状态”的上下文决定了应用哪种类型。因此,要确定页面上显示的图像的实际 DPI,需要一些额外的 PDF 解析......
在任何情况下,您都可以告诉 Ghostscript 将图像重新采样到 300 dpi,并为此使用“阈值”。(Ghostscript 永远不会对图像进行“上采样”,只会对超出阈值的图像进行下采样。上采样几乎没有任何意义——它只会放大文件大小而不会带来更高质量的回报。)
使用 ICC 配置文件将颜色转换为色彩空间 CMYK。
最新版本的Ghostscript 可以做到这一点。另请参阅描述其对 ICC 的支持的最新 Ghostscript 文档。
嵌入未嵌入的字体。
运行(并评估结果)pdffonts some.pdf
将显示哪些字体未嵌入。
Ghostscript 可以嵌入未嵌入的字体。
因此,一个可以满足您大部分要求的 Ghostscript 命令是:
gs \
-o cmyk.pdf \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=CMYK \
-sProcessColorModel=DeviceCMYK \
-sOutputICCProfile=/path/to/your.icc \
-sColorImageDownsampleThreshold=2 \
-sColorImageDownsampleType=Bicubic \
-sColorImageResolution=300 \
-sGrayImageDownsampleThreshold=2 \
-sGrayImageDownsampleType=Bicubic \
-sGrayImageResolution=300 \
-sMonoImageDownsampleThreshold=2 \
-sMonoImageDownsampleType=Bicubic \
-sMonoImageResolution=1200 \
-dSubsetFonts=true \
-dEmbedAllFonts=true \
-sCannotEmbedFontPolicy=Error \
-c ".setpdfwrite<</NeverEmbed[ ]>> setdistillerparams" \
-f some.pdf
此命令将对分辨率高于两倍所需分辨率 ( *ImageDownSampleThreshold=2
) 的所有图像进行下采样。它还将所有这些设置应用于任何输入文件(除非某些特殊的 PDF 预检软件会根据特殊属性的“检查”结果应用选择性“修复”)。
最后,我看不出是什么让您认为您必须花费 2,000 到 6,000 美元,以防您不得不求助于封闭源代码的商业预检软件。(我在这个领域最喜欢的是非常强大的callas pdfToolbox6(它甚至有一个在 Linux 上作为 CLI 运行的版本)——它的基本版本需要 500 欧元。)