【问题标题】:GhostScript generated PDF shows hidden textGhostScript 生成的 PDF 显示隐藏文本
【发布时间】:2017-07-20 21:01:55
【问题描述】:

我有一些 postscript 文件通过在其顶部显示白色文本来隐藏文本。

这是一个非常简单的例子来说明这个问题:

%!

/Times-Roman findfont
20 scalefont
setfont

newpath
0 setgray
72 72 moveto
(Hello, world!) show   % Show some text
72 72 moveto
1 setgray
(Hello, world!) show   % Hide some text

showpage

如果我将此文件直接发送到打印机,则不会打印隐藏文本。

但是,当我使用 GhostScript(9.21 版)将此 PS 转换为 PDF 时,我仍然可以看到一点文本的轮廓。这是我使用的命令:

gswin32.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=C:\temp\output.pdf test.ps

我也尝试将颜色设置为 CMYK,但没有帮助。

如何配置 GhostScript 以生成 PDF 而不显示此“隐藏”文本?

亲切的问候, 马丁·科恩

【问题讨论】:

    标签: ghostscript


    【解决方案1】:

    很明显,文本并没有隐藏,它被白色透支了。

    我可以看到三种可能的可能性,但看不到你的所作所为,我无法确定哪种情况正在发生。

    1) 显然,PDF 消费者必须将黑白灰色规格转换为“其他”,通常是 RGB,但也可能是 CMYK,具体取决于您是在屏幕上查看 PDF 文件还是打印它。如果您看到整个纯文本,但隐隐约约,那就是正在发生的事情。

    2) PDF 使用者可能无法精确匹配两组文本。如果您看到文本的部分轮廓,那就是正在发生的事情。

    3) 或者(这是偷偷摸摸的一点)您的查看器可能使用了某种抗锯齿。如果黑色底层文本是抗锯齿的,但白色不是,那么你会看到一种“光晕”。文本的整个轮廓都将可见,可能为浅灰色,但内部为白色。

    我拿了你的示例文件,并通过当前 HEAD 版本的 Ghostscript 运行它,写入未压缩的 PDF 文件,生成的页面内容为:

    5 0 obj
    <</Length 6 0 R>>
    stream
    q 0.1 0 0 0.1 0 0 cm
    /R7 gs
    0 g
    q
    10 0 0 10 0 0 cm BT
    /R8 20 Tf
    1 0 0 1 72 72 Tm
    (Hello, world!)Tj
    ET
    Q
    1 g
    q
    10 0 0 10 0 0 cm BT
    /R8 20 Tf
    1 0 0 1 72 72 Tm
    (Hello, world!)Tj
    ET
    Q
    Q
    endstream
    endobj
    

    如您所见,这保持了文本的纯黑色和纯白色规范(ExtGState 只是将叠印模式设置为 1)并将每段文本定位在完全相同的位置。

    我的猜测是您的查看器正在使用抗锯齿来绘制黑色文本,而不是白色文本。 FWIW Adob​​e Acrobat 不会为我显示此行为。

    【讨论】:

    • 感谢您的精彩解释! :-) 在 Adob​​e Acrobat Reader 中更改“平滑文本”渲染选项后,不再显示黑色字体......但这说明这种隐藏某些文本的“白色字体”黑客不是一个非常可靠的解决方案因为它取决于 pdf 查看器的设置。您对我们如何以更好的方式做到这一点有什么建议吗?
    • 使用文本渲染模式 3 ?您确实意识到您所做的任何涉及文本的事情都会被像我这样可以解码文件的人立即击败?它还使文本可在 PDF 查看器中搜索,并且复制/粘贴将起作用,因此只需“全选”即可让用户查看和复制它。也许您可以解释为什么您希望文本不可见但仍然存在?
    • 在我们的 postscript 文件中,我们有一些逻辑来检查最后一页的最后一行文本之后是否总是有一定数量的空白空间(以确保有足够的空间放置签名它)。因此,在打印最后一行之后,我们检查是否有足够的可用空间,如果没有,我们通过使文本不可见来“恢复”打印最后一页,然后在该页面上使用更少的文本重试,并添加一个额外的页面和其余的文本。也许有更好的解决方案......?这是我们 ps 文件的简化示例:gist.github.com/anonymous/2a01c51c41f513ed4ab88b4c3dc1b063
    • 实际上,正确的方法是检查所需文本的大小,并查看它是否在在绘制文本之前为签名留出足够的空间。您可以通过以下方式轻松确定文本的大小:“(..text to show..) true charpath flattenpath pathbbox”您只对 y 方向感兴趣,因此您可以执行“sub 3 1 roll pop pop” " 在 y 方向上留下文本的大小。如果剩余空间小于该文本,则开始一个新页面然后绘制它,否则就绘制它并继续。
    • 感谢 Ken,我设法确定了文本的大小而不显示它 :-) 所以无需再次使其“不可见”...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多