ghostscript保存PDF输入的字体

时间:2016-06-16 23:00:01

标签: pdf fonts pdf-generation ghostscript

我的ghostscript命令是这样的:

gs \
    -dBATCH -dNOPAUSE \
    -sDEVICE=pdfwrite \
    -dColorConversionStrategy=/LeaveColorUnchanged \
    -dDownsampleMonoImages=false \
    -dDownsampleGrayImages=false \
    -dDownsampleColorImages=false \
    -dAutoFilterColorImages=false \
    -dAutoFilterGrayImages=false \
    -dColorImageFilter=/FlateEncode \
    -dGrayImageFilter=/FlateEncode \
    -sOutputFile=./merge.pdf \
    -f ./page_*.pdf

大多数命令都与图像有关。

执行后,我发现字体看起来不如输入文件清晰 字体之间的区别如下:

输入文件(之一)的字体:

$ pdffonts page_3.pdf 
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
NachlieliCLM-Bold                    Type 1            Builtin          yes no  yes     62  0
NachlieliCLM-Bold                    Type 1            Custom           yes no  yes     65  0
Courier10PitchBT-Bold                Type 1            Builtin          yes no  yes     70  0
EAAAAA+LiberationSerif               TrueType          WinAnsi          yes yes yes     27  0
NachlieliCLM-Light                   Type 1            Builtin          yes no  yes     75  0
NachlieliCLM-Light                   Type 1            Custom           yes no  yes     78  0
HAAAAA+LiberationSans-Bold           TrueType          WinAnsi          yes yes yes     42  0
IAAAAA+DejaVuSans                    TrueType          WinAnsi          yes yes yes     47  0
JAAAAA+LMMono9-Regular               Type 1            Builtin          yes yes yes     52  0
KAAAAA+LMMonoProp10-Regular          Type 1            Builtin          yes yes yes     37  0
Courier10PitchBT-Roman               Type 1            Builtin          yes no  yes     83  0
MAAAAA+LiberationSerif-Bold          TrueType          WinAnsi          yes yes yes     57  0
NAAAAA+LiberationSerif-Italic        TrueType          WinAnsi          yes yes yes     32  0

输出文件的字体:

$ pdffonts merge.pdf 
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
LQRJGW+LiberationSerif-Bold          TrueType          WinAnsi          yes yes yes     54  0
ZAZOKA+NachlieliCLM-Light            Type 1C           Custom           yes yes yes     42  0
XFXEQZ+LiberationSerif-Italic        TrueType          WinAnsi          yes yes yes     56  0
KBCNYY+LiberationSans-Bold           TrueType          WinAnsi          yes yes yes     44  0
PPEMTT+DejaVuSans                    TrueType          WinAnsi          yes yes yes     46  0
FUVLBK+NachlieliCLM-Bold             Type 1C           Custom           yes yes yes     36  0
OQFKGW+LMMono9-Regular               Type 1C           Custom           yes yes no      48  0
ZFATCB+LMMonoProp10-Regular          Type 1C           Custom           yes yes no      50  0
WIGEDL+Courier10PitchBT-Bold         Type 1C           WinAnsi          yes yes no      38  0
AFLCKO+Courier10PitchBT-Roman        Type 1C           WinAnsi          yes yes no      52  0
QNUNTR+LiberationSerif               TrueType          WinAnsi          yes yes yes     40  0
BLSWAW+DejaVuSansMono                TrueType          WinAnsi          yes yes yes     97  0
HQDKJN+LiberationSerif               TrueType          WinAnsi          yes yes yes     99  0
SCAKLE+LiberationSerif-Italic        TrueType          WinAnsi          yes yes yes    101  0
AGALJA+NachlieliCLM-Bold             Type 1C           Custom           yes yes yes     91  0
PPEMTT+DejaVuSans                    TrueType          WinAnsi          yes yes yes    103  0
TLVEAY+LiberationSans-Bold           TrueType          WinAnsi          yes yes yes     93  0
GLOKSW+NachlieliCLM-Light            Type 1C           Custom           yes yes yes     95  0

PARTIALLY唯一有效的方法是执行以下操作:

gs \
    -dBATCH -dNOPAUSE \
    -sDEVICE=pdfwrite \
    -dCompressFonts=true \
    -dSubsetFonts=true \
    -dEmbedAllFonts=false \
    -sOutputFile=./merge.pdf \
    -f ./page_*.pdf

$ pdffonts merge.pdf 
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
LQRJGW+LiberationSerif-Bold          TrueType          WinAnsi          yes yes yes     54  0
NachlieliCLM-Light                   Type 1            Custom           no  no  yes     42  0
XFXEQZ+LiberationSerif-Italic        TrueType          WinAnsi          yes yes yes     56  0
KBCNYY+LiberationSans-Bold           TrueType          WinAnsi          yes yes yes     44  0
PPEMTT+DejaVuSans                    TrueType          WinAnsi          yes yes yes     46  0
NachlieliCLM-Bold                    Type 1            Custom           no  no  yes     36  0
EVJWAP+LMMono9-Regular               Type 1C           Custom           yes yes no      48  0
LAKFSN+LMMonoProp10-Regular          Type 1C           Custom           yes yes no      50  0
Courier10PitchBT-Bold                Type 1            WinAnsi          no  no  no      38  0
Courier10PitchBT-Roman               Type 1            WinAnsi          no  no  no      52  0
QNUNTR+LiberationSerif               TrueType          WinAnsi          yes yes yes     40  0
BLSWAW+DejaVuSansMono                TrueType          WinAnsi          yes yes yes     97  0
HQDKJN+LiberationSerif               TrueType          WinAnsi          yes yes yes     99  0
SCAKLE+LiberationSerif-Italic        TrueType          WinAnsi          yes yes yes    101  0
NachlieliCLM-Bold                    Type 1            Custom           no  no  yes     91  0
PPEMTT+DejaVuSans                    TrueType          WinAnsi          yes yes yes    103  0
TLVEAY+LiberationSans-Bold           TrueType          WinAnsi          yes yes yes     93  0
NachlieliCLM-Light                   Type 1            Custom           no  no  yes     95  0

在最后一种情况下 - 字体LMMono9不会改变,但字体NachlieliCLM更清晰(可能是因为它没有嵌入......)。 正如您所看到的 - 某些字体未嵌入 - 这很糟糕。 输出PDF用于打印和共享,因此字体需要嵌入并具有高质量。

顺便说一句,我知道标志必须如此:

-dCompressFonts=true \
-dSubsetFonts=false \
-dEmbedAllFonts=true \

但是这些旗帜的字体仍然不清晰。

我已经阅读了许多SO线程和文档,但未能找到解决方案 我怀疑我需要输出字体属于Type 1类型,而不是类型Type 1C,但不确定。

实施例

附加了两个文件:input.pdfoutput.pdf 它们之间只有以下文字有区别:

  • “标题在这里(标题2)” - 字体为Courier 10 Pitch
  • 子弹“First”直至并包括“Sixth” - 字体为LM Mono 9
    (请注意,子弹中其余的句子都没有问题 - 它没有改变。这意味着只有像“第一”这样的单词数字才会改变。)
  • 最后/最低(希伯来语)句子 - 字体为Nachlieli CLM

不同之处在于输出文件中的文字更粗糙。 (输入更清晰)。为了看到差异,将两个PDF文档并排放置,每个文档的缩放比例为100%。使用Ubuntu的默认Document ViewerOkular时,差异很明显。 文本的其余部分是相同的 确实输入的PDF文件是使用LibreOffice 4.2创建的 输出文件是使用以下命令创建的:

gs \
    -dBATCH -dNOPAUSE \
    -sDEVICE=pdfwrite \
    -dColorConversionStrategy=/LeaveColorUnchanged \
    -dDownsampleMonoImages=false \
    -dDownsampleGrayImages=false \
    -dDownsampleColorImages=false \
    -dAutoFilterColorImages=false \
    -dAutoFilterGrayImages=false \
    -dColorImageFilter=/FlateEncode \
    -dGrayImageFilter=/FlateEncode \
    -sOutputFile=./output.pdf \
    -f ./input.pdf

我正在使用GPL Ghostscript 9.10和Ubuntu 14.04。

Screenshot显示输入(前GS)和输出(后GS)之间的差异。使用软件Document Viewer 3.10(或Evince)。

1 个答案:

答案 0 :(得分:1)

没有字体格式不是问题。类型1C只是CFF格式,它(或多或少)是类型1字体的更紧凑的表示。

您不知道您使用的操作系统,也不知道Ghostscript的版本。

如果没有例子,就无法告诉你任何事情。请将输入文件发布到我们可以查看的地方,然后我们可以帮助您。

转换为1C类型是一件简单的事情,不会影响字体的清晰度'因为两者都是矢量形式。您不会从pdfwrite中获取类型1字体,所有类型1字体都将转换为CFF(类型1C)。

NachlieliCLM未嵌入的原因是设置了EmbedAllFonts = false,而非子集并使用默认编码。需要嵌入子集输入字体,因为它几乎总是使用自定义编码,因此您无法简单地使用原始字体。

怀疑,但在没有看到输入的情况下无法证明您的问题是由于某些PDF生成应用程序使用的命名约定不佳造成的。该子集不是唯一的,导致名称冲突。 LibreOffice是这里的罪魁祸首。

最近认为该问题得到了解决(我们现在另外使用PDF对象编号和字体名称),但由于我不知道您使用的是什么版本的Ghostscript,我无法说明是否&# 39;可能是问题所在。然而,这通常会导致不正确的字符,而不是“锐度”的损失。这很可能是由渲染图像引起的。

正如我所说,发布一个(小)示例输入文件以及从Ghostscript和pdfwrite获得的结果,可能会说更多。