【问题标题】:GhostScript creating extra page when font errors occur发生字体错误时 GhostScript 创建额外页面
【发布时间】:2019-04-09 19:47:13
【问题描述】:

我有一个过程需要将多个 postscript 和 pdf 文件写入由 word interop VB 代码生成的单个 postscript 文件,并将继续由 word interop VB 代码修改。每次调用 ghostscript 都会产生一个额外的空白页。我正在使用 GhostScript 9.27。

由于这里有多种技术和因素,我将其范围缩小:可以通过将 postscript 文件转换为 postscript,然后通过命令行转换为 pdf 来证明问题。直接从 postscript 到 pdf 不会发生此问题。这是一个示例和错误示例。

C:\>"C:\Program Files (x86)\gs\gs9.27\bin\gswin32c.exe" -dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile=C:\testfont.ps C:\smallexample.ps
C:\>"C:\Program Files (x86)\gs\gs9.27\bin\gswin32c.exe" -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=C:\testfont.pdf C:\testfont.ps

Can't find (or can't open) font file %rom%Resource/Font/TimesNewRomanPSMT.
Can't find (or can't open) font file TimesNewRomanPSMT.
Can't find (or can't open) font file %rom%Resource/Font/TimesNewRomanPSMT.
Can't find (or can't open) font file TimesNewRomanPSMT.
Querying operating system for font files...
Didn't find this font on the system!
Substituting font Times-Roman for TimesNewRomanPSMT.

我开始假设字体错误是导致额外页面的原因(如果只是为了排除这种情况,我知道这不确定)。由于我的 ps->pdf 测试没有出现这个问题,而我的 ps->ps->pdf 确实出现了这个问题,我认为 ghostscript 没有将原始 postscript 文件中的字体数据写入它正在创建的文件中。我正在寻找一种在生成的 postscript 文件中保留/重新创建它的方法。或者,如果这不可能,我需要一种方法来告诉 ghostscript 如何使用这些字体。我没有成功尝试按照此处的 GS 文档中所述包含它们:https://www.ghostscript.com/doc/current/Use.htm#CIDFontSubstitution

感谢任何帮助。

【问题讨论】:

    标签: pdf ghostscript postscript


    【解决方案1】:

    我已经做出了这个答案,即使我知道它没有回答这个问题,因为它不适合作为评论。

    我认为您认为缺少字体导致您的问题的假设是有缺陷的。许多 PDF 文件没有嵌入它们需要的所有字体,我见过很多这样的例子,它们不会发出额外的页面。

    您对自己在做什么的描述并不完全清楚。您描述了两个过程,一个从 PostScript 到 PDF,一个从 PostScript 到 PostScript(为什么?)然后到 PDF。

    您还没有描述为什么要将 PostScript 处理成 PostScript 文件。

    特别是您没有提供示例文件来查看。否则,就无法判断您的体验是否正确。

    例如;您完全有可能将 /Duplex 设置为 true 并且文件中有奇数页。这将导致发出一个额外的空白页(非常正确),因为双面打印需要偶数页。

    您链接到的文档用于 CIDFont 替换,它与字体替换无关,CIDFonts 和字体在 PDF 和(更特别是)PostScript 中是不同的东西。但老实说,我怀疑这是你的问题。

    我建议您将(至少)“smallexample.ps”公开并在此处发布 URL,这样我们至少可以按照您正在执行的相同步骤进行操作。这样我们就可以告诉你发生了什么。解释你为什么这样做也会很有用,我通常强烈建议你不要做这样的额外步骤;每个步骤都有以某种方式影响输出的风险。

    【讨论】:

      【解决方案2】:

      感谢您的回复。由于评论长度限制,我也将其作为答案发布:

      我认为你是正确的,我对字体的假设是错误的。我在第二个ps文件中找到了多余的页面,直到第二次转换才遇到字体错误。

      我有一个使用 VB MSWord 互操作库将多个文档打印到单个 ps 文件的过程,该过程使用由 ghostscript 和 redmon 设置的虚拟打印机。我也在添加混合pdf文件的功能。它可以工作,但会产生额外的页面。为了缩小问题的实际位置,我通过命令行尝试了更简单的测试用例来识别问题。当 ghostscript 将 ps 转换为 ps 时,我只会得到额外的页面(无论是否还有 pdf)。将 ps 转换为 pdf 我没有得到额外的页面。有趣的是,我可以通过将 ps 转换为 pdf 然后将两个 pdf 都转换回 ps 来解决这个问题。这是一个较慢的,但不应该是必要的,所以我想识别并解决额外的页面问题。我无法共享该特定文件。我会看看我是否可以创建一个我可以分享的示例,该示例也显示了该问题。同时,我可以确认源ps文件是六页,双面设置如下。在生成的 ps 文件中存在带有额外页面的双工定义。我可以在源 ps 中检查其他一些常见的罪魁祸首吗?谢谢。

      featurebegin{
      %%BeginFeature: *DuplexUnit NotInstalled
      
      %%EndFeature
      }featurecleanup
      
      featurebegin{
      %%BeginFeature: *Duplex None
      
          <</Duplex false /Tumble false>> setpagedevice
      %%EndFeature
      }featurecleanup
      

      【讨论】:

      • Duplex 是假的,所以不是这样,我无法立即想到其他任何事情,虽然 BeginPage 或 EndPage 过程可以做到这一点,但这种情况很少见。
      • 我仍然不清楚您为什么将 PostScript 作为输入并生成 PostScript 作为输出。您知道 Ghostscript 可以在命令行上混合和匹配输入类型吗?因此 gswin32c .....file1.ps file2.pdf file3.ps 等无需将任何内容转换为 PostScript 即可工作。如果您想以 PostScript 文件结尾,只需设置 DEVICE=ps2write。
      • 是的,gswin32c .....file1.ps file2.pdf file3.ps 是我实际在做的,并且表现出额外的页面问题。 gswin32c .....file1.ps 示例只是展示问题的简化。根据 gsview,我的原始 ps 是从多个文档创建的,并且有额外的 %%trailer 和 %%eof。忽略所有 dsc 是正确查看它们的唯一方法。也许 ghostscript 如何中断导致额外页面?
      • 不,cmets 被忽略(% 是 PostScript 中的注释字符)。顺便一提。您可以编辑自己的问题,以避免发布包含更多详细信息的答案。
      • 源 ps 的某些内容是 ps2write 设备读取为额外的空白页(不正确,因为 pdfwrite 没有?)。我更改了与打印原始 ps 的 ghostscript 相关的打印机端口,以使用 ps2write 和指定的文件(是 mswinpr2 和虚拟打印机)并看到了额外的页面。使用 ghostpdf.ini 创建打印机,而不是使用我一直使用的 HP 4550 PS 驱动程序解决了我的问题。
      猜你喜欢
      • 2017-07-31
      • 2013-09-13
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2022-07-17
      • 2012-06-26
      • 1970-01-01
      相关资源
      最近更新 更多