如何修复PDF文件并嵌入缺失的字体

19
我使用pdftk来修复一些受损的PDF文件中的问题,但我遇到了另一个问题,pdftk无法解决(或者至少我不知道该如何解决)。
我有一些基于TrueType字体的文本PDF文件,但这些字体在PDF创建过程中没有被嵌入。现在我想将所需的字体嵌入到现有文件中。
是否有像pdftk一样的命令行工具,可以通过提供TTF文件路径来嵌入丢失的字体?
3个回答

33

您可以使用 Ghostscript 来嵌入缺失的字体。执行以下命令:

您可以像这样运行命令:

gs                                             \
  -o file-with-embedded-fonts.pdf              \
  -sDEVICE=pdfwrite                            \
  -dEmbedAllFonts=true                         \
  -sFONTPATH="/path/to/ttf;/other/path/to/ttf" \
   input-without-embedded-fonts.pdf

另见此答案:


3
在win32上,如果您已安装ghostScript,则命令可能如下所示:gswin32c -sFONTPATH=C:\Windows\Fonts -o output-pdf-with-embedded-fonts.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress input-pdf-where-some-fonts-are-not-embedded.pdf(在系统上找到exe文件,如果需要,可以将其添加到PATH环境变量中)。 - fstang
1
@Qtax:我认为不需要--当嵌入字体时,Ghostscript应该默认设置为这个。 - Kurt Pfeifle
@KurtPfeifle 你说得对! 删除那个注释(和这个注释),并添加一个注释,让人们知道已经进行了字体子集化。 - Qtax
1
当嵌入字体时,gs 默认进行字体子集化(即仅嵌入 PDF 中所使用的字体字形)。可以使用-dSubsetFonts=false禁用此功能。 - Qtax
1
这会破坏带有表单的PDF文件。有人知道保留表单的gs标志吗? - Fuhrmanator
1
@Fuhrmanator:FOSS软件和PDF表格——在书籍《FOSS中缺失或糟糕的重要功能列表》中是一个很长的章节。 - Kurt Pfeifle

7

我在Ubuntu 14.04上也遇到了同样的问题,并找到了以下解决方案:

  • 安装Acrobat Reader
  • 将“打印到文件”输出为后缀名为“foo.ps”的PostScript文件,然后点击“高级选项” -> “以图像方式打印”
  • 然后在控制台中使用ps2pdf foo.ps foo.pdf,结果是一个带有嵌入字体和原始内容的文件

中间的PostScript文件比输入文件大得多(650KB),但生成的PDF文件的大小适中(82KB)。

我不知道为什么会这样,即:

  • 为什么“以图像方式打印到文件”似乎会创建一个图像,同时保留字体信息,
  • 为什么ps2pdf可以恢复此字体信息,并且
  • 为什么生成的PDF文件中存在字体,因为它应该只是一个图像,对吗?

但结果是一个带有所有字体嵌入的PDF文件,而且大小与原始文件相似。


1
只需将其打印到ps文件中,而不是保存为图像,就可以让我成功了。有些人会抱怨pdf-> ps-> pdf转换并不是最好的方法,但是您的发帖实际上拯救了我的博士论文。详情请见(http://tex.stackexchange.com/questions/10391/how-to-embed-fonts-at-compile-time-with-pdflatex)。 - Backlin
我喜欢你的方法,但在我的情况下进行了更改。我不想使用Acrobat,所以我只是用evince(标准Gnome PDF阅读器)打印到文件,选择Post Script(不需要图像选项),然后再次使用ps2pdf将结果pdf转换。那样做很有效,我不需要像其他答案(https://dev59.com/Rmcs5IYBdhLWcg3wcDeZ#13131101)中所述那样搜索字体路径。 - white_gecko
1
直接在受损的PDF上使用ps2pdf修复字体对我很有效:ps2pdf foo.pdf foo_fixed.pdf - t-bltg

2

如@t-bltg在评论中提到的那样,Ghostscript现在带有一个ps2pdf命令,可以自动嵌入缺失的字体。

ps2pdf -sFONTPATH="." in.pdf out.pdf

That should be all you need.

Troubleshooting

  • The above command presumes the necessary .ttf or .otf file is in the current working directory ("."). If it is not, you can change . to directory where the font file lives. For example:

    ps2pdf -sFONTPATH="~/.local/share/fonts/" input.pdf output.pdf
    

    (Note, you must specify a directory, not a font file.)

  • Make sure that the fontname the PDF is looking for is the same as the name embedded in the font file. For example, if the PDF wants a font named "Fantasy Bold", but the font file defines a font named "Fantasy" or "Fantasy Bold Neue LT Pro", this method will not work.

奖励:14种字体系列

即使没有指定FONTPATH,Ghostscript也知道14种标准的Postscript Level 2字体系列,包括它们的旧名称。例如,现代系统有时无法正确地呈现“New Century Schlbk”,因为它们期望的是“New Century Schoolbook”。一个简单的ps2pdf in.pdf out.pdf就可以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接