当前情景:
我正在尝试根据普通的 PDF 文档生成正确且一致的 PDF/A,经过几个小时的调查,我们决定使用 Ghostscript 功能。这个业务需求是为我正在从事的一个更大的 C# 项目设置的,但首先我开始在 Windows 上下文中使用Ghostscript 命令进行一些测试,另一方面创建了一个使用 Ghostscript .NET 的隔离控制台应用程序,以测试此功能的可行性。
我们在第一次测试中集中精力使用PFD/A-1B格式,并利用VeraPDF和PDF-Tools来检查生成文件的一致性。
以下测试已使用几个不同的 PDF 文件完成,其中一些是我们的项目应用程序实际生成的文件。为简单起见,如果有人想检查,我提供了一个简单的 PDF(只有几行文本),它已经以相同的方式使用和测试,并且重现了相同的行为。
Ghostscript 命令测试
执行
使用 GhostScript v 9.52,我尝试了以下命令:
gswin32c.exe -dNOSAFER -dPDFA=1 -sColorConversionStrategy=RGB -sDEVICE=pdfwrite -dPDFACompatibilityPolicy=1 -dNOPAUSE -dBATCH -o result.pdf "C:\GS_PDFA\PDFA_def.ps" WriterPDF.pdf
*注意:即使我读到不推荐使用-dNOSAFER参数,如果没有它,我也无法为/invalidfileaccess错误生成 PDF。我怀疑访问权限是原因,正如在 Stackoverflow 上搜索的那样(GhostScript: Error: /invalidfileaccess in --file--),但仍然没有找到任何适合我的解决方案。
还尝试了以下命令,但错误相同(将所需的 ICC 配置文件与 .ps 模板文件位于同一文件中):
gswin32c.exe --permit-file-read=c:/GS_PDFA/srgb.icc -dPDFA=1 -sColorConversionStrategy=RGB -sDEVICE=pdfwrite -dPDFACompatibilityPolicy=1 -dNOPAUSE -dBATCH -o result2.pdf C:/GS_PDFA/PDFA_def_FULL.ps WriterPDF.pdf
对于 PDFA 配置文件,我尝试在 Ghostscript 安装目录中的/lib上提供默认 PDFA_def.ps模板。之后,尝试使用 PDFA_def.ps 模板文件,更新行:
/ICCProfile (C:/GS_PDFA/srgb.icc)
和
/OutputConditionIdentifier (sRGB)
结果和验证
结果:下载命令行生成的 PDF
VeraPDF 说:
PDF 文件符合验证配置文件要求
PDF 工具 说:
该文档确实符合 PDF/A-1b 标准。
此外,当使用 Adobe Reader DC 打开时,一致性选项卡显示所选格式 (PFD/A-1B) 的所有详细信息,但不显示OutputIntent ,甚至 PDFA_def.ps模板被设置为参数,并且 sRGB ICC 配置文件显示在里面模板文件。 Adobe 一致性状态丢失 OutputIntend 捕获
Ghostscript .NET 控制台应用程序:
执行
我尝试根据 Ghostscript 测试期间使用的相同参数编写代码:
string outputFile = @"C:\temp\output.pdf";
string inputFile = @"C:\temp\WriterPDF.pdf";
GhostscriptPipedOutput gsPipedOutput = new GhostscriptPipedOutput();
// pipe handle format: %handle%hexvalue
string outputPipeHandle = "%handle%" + int.Parse(gsPipedOutput.ClientHandle).ToString("X2");
using (GhostscriptProcessor processor = new GhostscriptProcessor())
{
List<string> switches = new List<string>();
switches.Add("-empty");
switches.Add("-dPDFA=1");
switches.Add("-sColorConversionStrategy=RGB");
switches.Add("-dPDFACompatibilityPolicy=1");
switches.Add("-dBATCH");
switches.Add("-dNOPAUSE");
switches.Add("-sDEVICE=pdfwrite");
switches.Add("-o" + outputPipeHandle);
//switches.Add("c:/GS_PDFA/PDFA_def.ps");
switches.Add(inputFile);
try
{
processor.StartProcessing(switches.ToArray(), null);
byte[] rawDocumentData = gsPipedOutput.Data;
File.WriteAllBytes(outputFile, rawDocumentData);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
finally
{
gsPipedOutput.Dispose();
gsPipedOutput = null;
}
}
*注意:请注意,这次没有使用 -dNOSAFER 参数。如果包含,结果是相同的,没有附加信息或详细错误。如果包含注释行(switches.Add("c:/GS_PDFA/PDFA_def.ps");),则应用程序会引发错误:
调用“gsapi_init_with_args”时发生错误:-100
我试图防止错误使用模板文件的另一个位置,但没有成功。还在顶部添加了代码行:switches.Add("-Ic:/GS_PDFA/"); 但同样的错误。
结果和验证
VeraPDF 说:
如果未设置 PDFA_def.ps 模板文件,则生成的文件不会通过验证检查。
PDF 文件不符合验证配置文件要求
PDF 工具 说:
该文档确实符合 PDF/A-1b 标准。
此外,当使用 Adobe Reader DC 打开时,一致性选项卡会显示所选格式 (PFD/A-1B) 的所有详细信息,现在OutputIntent 存在,但详细信息不完整,因为未显示 Identifier 和 Info 值。Adobe 一致性状态 OutputIntend 不完整捕获
问题
- 根据 Ghostscript 命令,有没有办法使用正确的 ICC 信息生成 PDF/A?对于我所看到的,没有一个结果真的令人满意,那么我应该怎么做才能成功地将这些信息嵌入到 PDF/A 生成的文件中?
- 猜测 Ghostscript 命令可以实现包含正确 ICC 配置文件的符合 PDF/A 文件的技巧,并且由于我们计划使用 Ghostscript .NET,我如何将 PDF/A 模板文件作为参数包含在 C# 代码中?
提前非常感谢。
[编辑]
我无法使用 --permit-file-read 更改权限。我通常在 C:\GS_PDFA 中有 ps 和 icc 文件,但在 GS 本地安装文件夹中尝试使用它们,但总是出现相同的错误:
错误:/invalidfileaccess in --file-- 操作数堆栈:--nostringval-- --nostringval-- (C:/GS_PDFA/srgb.icc) (r) 执行堆栈:%interp_exit .runexec2 --nostringval-- nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1990 1 3 %oparray_pop 1989 1 3 %oparray_pop 1977 1 3 %oparray_pop 1833 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- 字典堆栈:--dict:741/1123(ro)(G)-- --dict:0/20(G)-- --dict:76/200(L)-- 当前分配模式是本地 最后操作系统错误:权限被拒绝 当前文件位置是 2118
使用 Ghostscript .NET 对控制台应用程序进行了大量测试,甚至将 PDFA_def.ps 和 srgb.icc 文件放在解决方案文件夹中,同样的错误。尝试在 C:\GS_PDFA 中找到主要的 GS 安装文件,包括 ICC 配置文件 (srgb.icc),打开命令提示符并再次使用 Ghostscript 命令进行测试,但均不成功。
以下是我尝试过的一些命令示例:
--permit-file-read=c:/GS_PDFA/srgb.icc
--permit-file-read="c:/GS_PDFA/srgb.icc"
--permit-file-read="c:/GS_PDFA/srgb.icc"
--permit-file-read=srgb.icc
--permit-file-read="c:\GS_PDFA\srgb.icc"
--permit-file-read="/srgb.icc"
--permit-file-read=/srgb.icc
--permit-file-read="\srgb.icc"
--permit-file-read=\srgb.icc
--permit-file-read=c:/GS_PDFA/
--permit-file-read="c:/GS_PDFA/"
--permit-file-read=c:\GS_PDFA\
--permit-file-read=c:/GS_PDFA/****.icc
--permit-file-read=c:/GS_PDFA/*.icc
--permit-file-read=c:/GS_PDFA/*
我尝试移动文件、更改位置、文件夹等。我尝试更改文件夹安装,即使使用 Ghostscriptx64 也是如此...安装时我错过了什么吗?
请问,有人有可以帮助我的windows工作示例吗?