【问题标题】:Change a PDF's 0.00pt Lines to a Larger Size将 PDF 的 0.00pt 行更改为更大的尺寸
【发布时间】:2020-03-27 20:23:08
【问题描述】:

this PDF 中,倒数第二页上的绘图显然使用了 0.00pt 线宽。这使得它们在屏幕上几乎不可读,并且在打印时完全不可见。

有没有一种相对轻松的方法可以将这些“无宽度”线条更改为具有一些宽度?有很多小细节,因此转换为图像将无法保留足够的细节,除非使用古怪的分辨率......然后“无宽度”问题再次出现。

我安装了GhostScript,运行pdf2ps in.pdf med.ps,然后运行ps2pdf med.ps out.pdf,线宽完全相同。接下来,我在文本编辑器中打开med.ps,希望我可以制作一个python 脚本“查找并替换”这些零线宽,但我在文件中看不到“0 w”之类的东西。也许它是在某个地方的宏中定义的,但我没有看到它。

这个想法来自Change the width of all lines in a PDF programmaticallyThicken line weights when printing PDF

【问题讨论】:

  • 我能够通过将页面导入Inkscape,打开对象,通过隐藏对象组找到相关部分,shift-ctrl-F 来更正细线(显然是 0.035pt)填充设置,然后描边样式选项卡 --> 0.2mm。但这只能输出到一个单独的文件,并且是一页。

标签: pdf line render ghostscript postscript


【解决方案1】:

最好的办法是使用工具解压 PDF 文件(例如,使用 MuPDF;mutool -d <in.pdf> <out.pdf> 或使用 Ghostscript gs -sDEVICE=pdfwrite -o out.pdf -dCompressPages=false in.pdf)然后使用文本编辑器或某种脚本工具(如 sed)来查找“0 w" 并替换为 '其他东西'。

与 PostScript 不同,PDF 不是一种编程语言,因此您可以在 PDF 文件中可靠地搜索类似这样的运算符用法,但正如上面的初学者 6789 所说,尝试在 PostScript 文件中执行相同操作非常困难。

如果你想压缩 finak 文件,你可以使用类似gs -sDEVICE=pdfwrite -o final.pdf in.pdf 的东西通过 Ghostscript 的 pdfwrite 设备运行编辑后的文件。

您绝对不应该使用 Ghostscript 的 ps2write 设备来生成 PostScript; PostScript 成像模型与 PDF 不完全兼容,任何不能在 PostScript 中表示的 PDF 结构(例如任何类型的透明度)都将被渲染为图像。真的,不要这样做。

【讨论】:

  • 我注意到 ps2write 稍微改变了输出 PDF,所以完全相信它可能会严重失败。你的解压想法很好......我解压了原始文件,找不到“0 w”,但使用 VS Code 和未经审查的 .PDF 插件确实找到了“0.146648 w”和“0.148345 w”。然而,从代码中更改这些“黑色”所有图表标题,我认为这可能是由于二进制数据的损坏。很快就会尝试使用 python(真正的二进制解析)方法。
  • 这不是细线,真正的细线在任何设备上都是一个像素宽(无论分辨率如何),并且定义为“0 w”。当然,在低分辨率设备上仍然很难看到细线。恐怕在这种情况下很难找到解决方案;线宽虽然很小,但可能非常可变。将其更改为更大的数字可能会导致令人惊讶的粗线,我建议慢慢增加数字(尝试加倍开始)。
【解决方案2】:

如果使用了许多不同的权重并且您只想更改 0.0 宽度的线条,这可能会出现问题。如果它们都是 0.0,那么将它放在页面的前面可能会起作用,除非后记在系统字典中查找命令:

/setlinewidth {pop} def

我的 ghostscript 的默认线宽是 1.0,所以应该自动使用它而不是 0.0 线宽。

pdf2ps 通常有很多 pdf 样式的字典,因此查找用于 setlinewidth 的代码可能会令人困惑。 setlinewidth 必须在某个地方。有些人喜欢看后记。

Pdf 文件并不是真的要被编辑,所以我使用这些选项来使阅读最终的 pdf 更容易: -dCompressPages=false -dCompressStreams=false 以防万一有一些有用的信息可以在 pdf 中查看。

编辑:根据用于创建原始后记的代码,可能会有这样的标签:

dup/LW//knownget exec{
setlinewidth
}if

/w/setlinewidth load def

所以像这个简单的例子一样,可以有 LW 或 w 用于 setlinewidth。大多数都没有这么简单。

EDIT2:这里有一些很好的信息: How to change the width of lines in a PDF/PostScript file

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 2017-08-14
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多