使用 Ghostscript 9.19 将任何 PDF 转换为 PDF/A-1b

使用 Ghostscript 9.19 将任何 PDF 转换为 PDF/A-1b

我正在尝试定义一种最新方法,用于将任何 PDF 转换为能够通过的 PDF/A-1b3-高地验证。我想出了这个使用 Ghostscript 的脚本qpdf

#! /bin/bash
# transforms input PDF into an optimized PDF/A-1b
# usage: $0 input.pdf output.pdf

gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dSAFER -sColorConversionStrategy=UseDeviceIndependentColor -dEmbedAllFonts=true -dPrinted=true -dPDFA -sProcessColorModel=DeviceRGB -dPDFACompatibilityPolicy=1 -dDetectDuplicateImages -r150 -sOutputFile=$2 $1  
qpdf --linearize $2 $2.optimized
mv $2.optimized $2

它将任何 PDF 转换为 Web 优化的 PDF/A-1b。

一切都很好,除了 Ghostscript 似乎没有在终端流之前添加缺失的 EOL,这不允许处理后的文档通过验证。这是我得到的验证结果:

Validating file "document.pdf" for conformance level pdfa-1b
  The separator before 'endstream' must be an EOL. (5)
  The document does not conform to the requested standard.
The file format (header, trailer, objects, xref, streams) is corrupted.
Done.

您知道可以添加这些 EOL 分隔符的任何方法或工具吗?

也欢迎将 PDF 转换为 PDF/A-1b 的有效且最新的替代建议。

答案1

我盲目地关注ghostscript,但感谢斯蒂芬,我发现这似乎是由于qpdf.我将通过 GitHub 提交一份清晰的报告。

我们可以单独完成所有工作ghostscript,因为从版本 9.07 开始,它可以使用简单的附加标志对 PDF 进行线性化,据报道这里

我想完成我的答案,不仅提供一种将 PDF 转换为 A-1b 格式的最新方法ghostscript,而且还报告如何使用javaApache PDFBox 库中的预检工具在本地进行验证。

使用 Ghostscript 9.19 将任何 PDF 转换为 PDF/A-1b

gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dSAFER -sColorConversionStrategy=UseDeviceIndependentColor -dEmbedAllFonts=true -dPrinted=true -dPDFA -sProcessColorModel=DeviceRGB -dPDFACompatibilityPolicy=1 -dDetectDuplicateImages -r150 -dFastWebView=true -sOutputFile=output.pdf input.pdf

使用 Java 8 和 Apache PDFBox 预检在本地验证您的 PDF/A-1b

所有信息都在代码注释中。preflight-app从以下位置下载最新版本Apache PDFBox 站点

在撰写本文时,最新版本是 2.0.2。

/**
 * Source:
 * https://pdfbox.apache.org/1.8/cookbook/pdfavalidation.html
 *
 * Compilation:
 * $ javac -cp preflight-app.2.0.2.jar:. Validator.java
 *
 * Usage:
 * $ java -cp preflight-app.2.0.2.jar:. Validator input.pdf
 */

import org.apache.pdfbox.preflight.ValidationResult;
import org.apache.pdfbox.preflight.parser.PreflightParser;
import org.apache.pdfbox.preflight.PreflightDocument;
import org.apache.pdfbox.preflight.exception.SyntaxValidationException;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;

public class Validator {
    public static void main( String[] args ) throws Exception {
        ValidationResult result = null;
        PreflightParser parser = new PreflightParser(args[0]);

        try {
            parser.parse();
            PreflightDocument document = parser.getPreflightDocument();
            document.validate();
            result = document.getResult();
            document.close();
        } catch (SyntaxValidationException e) {
            result = e.getResult();
        }

        if( result.isValid() )
            System.out.println("The file " + args[0] + " is a valid PDF/A-1b file");
        else {
            System.out.println("The file " + args[0] + " is not valid, error(s) :");
            for( ValidationError error : result.getErrorsList() )
                System.out.println(error.getErrorCode() + " : " + error.getDetails());
        }
    }
}

相关内容