首页 > 解决方案 > 如何在命令行中列出 PDF 页面大小

问题描述

在 Ghostscript 文档中,我没有找到查询 PDF 文档纸张大小的参数。

我在 lib 子目录中读到了一个 pdf_info.ps 文件。

我试过这段代码:

private const string RutaAGhostscript = @"C:\Program Files\gs\gs9.52\bin\gswin64c.exe";

...

Process pTamaños = new Process();
pTamaños.StartInfo.FileName = RutaAGhostscript;
pTamaños.StartInfo.Arguments = " -dNODISPLAY -q -sFile=\"" + RutaSeleccionada + "\" -DumpMediaSizes \"C:\\Program Files\\gs\\gs9.52\\lib\\pdf_info.ps\"";
pTamaños.StartInfo.UseShellExecute = false;
pTamaños.StartInfo.RedirectStandardOutput = true;
pTamaños.Start();
EscribirArchivo(pTamaños.StandardOutput.ReadToEnd(), RutaResultadoTxt2);
pTamaños.WaitForExit();

我在结果文件中得到了这个输出:

Error: /invalidfileaccess in --file--
Operand stack:
   (C:\\Users\\claudio.bogado\\QGMI\\Ruben De Jes\303\272s Martinez - 2020-05 Certificado 16\\Tramo 3\\Certificado 16 Tramo 3.pdf)   (r)
Execution stack:
   %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--   --nostringval--
Dictionary stack:
   --dict:739/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--   --dict:15/128(L)--
Current allocation mode is local
Last OS error: Permission denied
Current file position is 11770

使用我尝试过的 xPDF 工具pdfinfo -box,一些页面大小不同的文件只显示第一页。

我输入错误的文件名吗?

更新:

我尝试使用 kernel32 的 GetShortPathName 来消除空格。错误输出的唯一区别是现在的文件名C:\\Users\\CLAUDI~1.BOG\\QGMI\\RUBEND~1\\TRAMO3~1\\CERTIF~1.PDF

还尝试更改斜杠的反斜杠,不同之处在于现在显示的错误消息C:/Users/CLAUDI~1.BOG/QGMI/RUBEND~1/TRAMO3~1/CERTIF~1.PDF

来自巴拉圭的问候。

克劳迪奥·博加多·蓬帕。

标签: c#ghostscript

解决方案


Ghostscript 的最新版本默认默认为 SAFER 模式,这会阻止 PostScript 程序(如 pdf_info.ps)访问文件系统中的文件。

一般来说,Ghostscript 会尝试从命令行推断何时应该允许文件(例如输入文件名,在上面的 pdf_info.ps 的情况下),但它不知道 -sFile= 应该被允许,因为那部分命令只是在 PostScript 解释器中结束。

因此,要使用 pdf_info.ps,您必须设置-dNOSAFER或添加--permit-file-read=到命令行。-dNOSAFER关闭所有保护,因此您可能不想这样做,--permit-file-read 允许 PostScript 程序仅读取指定的目录。我建议你这样做。

我还建议您从命令行使用通常的 Ghostscript 可执行文件进行试验,并且只有在正确时才移动到您的应用程序。

如果您计划分发此应用程序,请查看许可证文件。


推荐阅读