通过将 PDF 中的所有字体字形转换为轮廓形状来替换它们

Posted

技术标签:

【中文标题】通过将 PDF 中的所有字体字形转换为轮廓形状来替换它们【英文标题】:Replace all font glyphs in a PDF by converting them to outline shapes 【发布时间】:2015-05-02 01:47:20 【问题描述】:

我正在寻找一种方法来'outline' PDF 文件中的所有文本/字体,即将它们转换为曲线。

我宁愿这样做,而不必将 PDF 转换为 PostScript 并返回。另外,我想使用可以从命令行自动化的免费轻量级跨平台工具,例如 Ghostscript 或 MuPDF。

【问题讨论】:

LaTeXiT 可以做到这一点,我相信它使用 GhostScript(不确定)。我试图挖掘源代码并找到它是如何做到的,但没有成功。 Ghostscript 可以 做到这一点,现在,但它以前不能轻易做到(你必须通过 PostScript)。我在下面添加了信息作为答案。 【参考方案1】:

commit 为 Ghostscript pdfwrite 和 ps2write 设备添加了一个新开关 -dNoOutputFonts,这将生成 PDF 文件(或 PostScript,取决于所选设备),其中所有字形都已创建为矢量,而不是文本.

您至少需要 9.15 版的 Ghostscript 才能获得此功能。请注意,PDF 文件几乎肯定会更大,并且复制/粘贴/搜索(显然)不起作用。

【讨论】:

是的,我测试过,我发现尺寸变大的原因不仅仅是将字体转换为轮廓形状/矢量/曲线。例如,我有一个 PDF,其中嵌入了一个水罩图像,并且在每一页上都被引用/间接使用。在 ghostscript 之后,我发现输出 PDF 包含使用 itext-rups-7.1.11.jar 的每一页上的重复图像。 ``` 页数: ... 第 3 124 0 R => 图像流 第 4 171 0 R => 图像流 ... XRef: ... 124 => 图像流 171 => 图像流 ... ``` 上面的评论似乎与原始问题或答案没有任何关系。萨姆,如果您有问题,请开始一个新问题。对于其他读者,Ghostscript 的 pdfwrite 设备(默认情况下)将对所有图像进行哈希处理,并且仅在它们相同时使用一个。当然 samm 没有提供输入文件、命令行、输出文件,甚至没有提供关于 Ghostscript 的操作系统或版本的信息,这使得无法调查或评论。 嗯,它似乎与将文本转换为没有嵌入字体的曲线关系不大。如果有人关心大小,我只是想添加一个关于输出 PDF 文件更大大小的注释。我通过`gs -o book.vectored.pdf -dNoOutputFonts -sDEVICE=pdfwrite book.optimized.pdf`在Windows 10上使用了gs v9.52,并且pdf有300多页。我对 book.vectored.pdf 使用了与 book.optimized.pdf 相同的优化算法,我可以将大小减少 10 MB。【参考方案2】:

是的,你可以使用 Ghostscript 来实现你想要的。

我。对于高达 9.14 的 Ghostscript 版本

你需要经过2个步骤:

    将 PDF 转换为 PostScript 文件,但使用一个相对未知的参数的副作用:它称为 -dNOCACHE。这会将所有使用的字体转换为轮廓形状:

    gs -o somepdf.ps -dNOCACHE -sDEVICE=pswrite somepdf.pdf
    

    将 PS 转换回 PDF(并且,可能会再次删除中间 PS):

    gs -o somepdf-with-outlines.pdf -sDEVICE=pdfwrite somepdf.ps
    
    rm somepdf.ps
    

这种方法长期不可靠,因为 Ghostscript 开发人员表示,-dNOCACHE 可能不会出现在未来的版本中。

注意:生成的 PDF 很可能会比原始 PDF 大。另外,如果没有额外的命令行参数,原始 PDF 中的所有图像也可能会根据 Ghostscript 内置默认值进行处理。这可能会导致不必要的副作用。可以通过添加更多命令行参数来避免这些副作用。


二。 Ghostscript 9.15 或更高版本

Ghostscript 9.15 版(2014 年 9 月发布)支持新的命令行参数:

 -dNoOutputFonts

这将导致输出设备 pdfwriteps2writeeps2write“将字形“扁平化”为“基本”标记操作(而不是将字体写入输出)”

这意味着:可以避免针对 9.15 之前的 GS 版本描述的两个步骤。只需一条命令即可达到预期的效果:

 gs -o file-with-outlines.pdf -dNoOutputFonts -sDEVICE=pdfwrite file.pdf

注意: 与第一部分中已经提到的相同的警告是正确的。如果您的 PDF 包含图像,那么简单的方法可能会引入不需要的副作用上面的命令行。为了避免这些,您需要添加更具体的参数。

【讨论】:

嘿,Kurt,实际上我已经创建了一个带有图像、标题和表情符号的相册 pdf。我需要打印 pdf。将任何相簿 pdf 转换为“可打印”pdf 格式的理想方法是什么。在 ghostscript 中使用哪些选项?你能指导我或指出一些资源吗?提前非常感谢。实际上,我尝试通过您在此答案中提到的命令来概述我的相册 pdf 中的字体.. 它工作正常。但由于此 pdf 包含图像、表情符号、文本.. 不确定是确切的命令吗?或者从长远来看,我需要使用一些额外的选项......? @Kurt,很好的答案,你真的应该将链接添加到你的另一个答案,关于如何保持光栅图像分辨率:superuser.com/a/373740/207447 -dNoOutputFonts 添加related document reference。但请注意,使用默认设置,Ghostscript 创建的新输出 PDF 不一定更“智能”(整体更小,从臃肿的输入 PDF 得到更好优化的文件)。另见How to remove duplicate objects in PDF using ghostscript?【参考方案3】:

三。 Ghostscript 版本 9.54.0 (Windows 10)

我找到了一种方法,可以在 Ghostscript 首次安装和正确配置后,将所有字体完美地保留为矢量,没有任何视觉错误,并且只需两个打印步骤。

(注意!您必须将 Ghostscript bin-/ 和 lib-folder 添加到您的 Windows PATH 中才能让 Ghostscript 执行任何操作) Instructions here

    使用 Acrobat Reader 并使用 Microsoft PS 类驱动程序 将包含基于矢量的字体或其他矢量元素的 PDF 文件打印到 YourFile.prn 文件。 (要安装此驱动程序 - 控制面板 - 设备 - 打印机和扫描仪 - 添加打印机或扫描仪 - 让第一个 Windows 查找连接的打印机一段时间,当它停止时选择一个选项 -我想要的打印机未列出 - 添加本地打印机或手动设置的网络打印机 - 下一步 - 使用现有端口:> 文件:(打印到文件) - 下一步 - Microsoft:Microsoft PS 类驱动程序 - 下一步)

    打开命令提示符,导航到YourFile.prn文件所在的文件夹并输入:"C:\Program Files\gs\gs9.54.0\bin\gswin64c.exe" -dNOPAUSE -dNOCACHE -dBATCH -sDEVICE=eps2write -sOutputFile=YourFile.eps YourFile.prn

如果您经常需要这样做,您还可以创建包含以下内容的 prn2eps.bat 文件:

"C:\Program Files\gs\gs9.54.0\bin\gswin64c.exe" -dNOPAUSE -dNOCACHE -dBATCH -sDEVICE=eps2write -sOutputFile=%1.eps %1.prn

要使用该 bat 文件,您只需键入:prn2eps YourFile(注意!bat 文件和 Yourfile.prn 必须在同一目录下)

由于某种原因,最新的 Ghostscript ps2epsi 功能在 Windows 10 中不起作用,而 Adob​​e 制作了 PDF:s,例如当我在非 Adob​​e 设计软件中将某些字体字符作为 PDF:s 导入时,它们出现轻微但一致的错误。多年来,我发现当矢量必须从一个软件保存到另一个软件时,EPS 文件格式是最可靠的格式之一。多次使用另一个打印机驱动程序将 PDF 再次打印为 PDF 可能就足够了,或者使用 Ghostscript 更改单个文件格式,但并非总是如此。

【讨论】:

解决方案“II”形式接受的答案确实在 Ghostscript 9.54 中像以前一样工作(我经常使用它)。其他答案不依赖于 GSView。我不确定您的回答试图解决什么问题。 我确实尝试过该解决方案,但由于某些原因,某些特定字体仍然存在一些错误(一些变形的字符,好像缺少某些顶点或控制向量),仅在首次打印时才修复PS 与 Windows 10 自己的驱动程序,然后将其转换为 EPS。几十年来我一直在使用 Ghostscript 来修复矢量文件转换中的各种奇怪的视觉错误,它是一个很棒的工具! Gsview 只是让它超级容易使用,因为它有一个图形用户界面,但它不再可用。 如果您(在答案本身内)解释您的解决方案要解决的问题,将对读者有所帮助。

以上是关于通过将 PDF 中的所有字体字形转换为轮廓形状来替换它们的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将字体转换为轮廓的情况下将 cairo-pdf 转换为 eps

导出 PDF 图形,形状轮廓和填充区域不分离

CFF(紧凑字体格式)库与撤消子程序化?

如何替换或修改嵌入在 PDF 文件中的字体或字形?

coreldraw的所有工具的详细作用?

OpenCV 将任意轮廓的形状转换为矩形