sda*_*aau 7 pdf fonts ghostscript
简而言之,我正在处理一个有问题的PDF,其中:
evince由于缺少字体信息,无法在文档查看器中完全呈现;ghostscript可以完全呈现相同的PDF.因此 - 无论ghostscript填写空白的用途(可能是后备字形,或访问字体的不同方法) - 我希望能够ghostscript用来生成("提取")输出PDF,其中几乎除了添加的字体信息之外,什么都不会改变,因此evince可以以相同的方式呈现相同的文档ghostscript.
因此,我的问题是 - 这是否可行; 如果是这样,那么命令行会是什么样的呢?
非常感谢任何答案,
干杯!
我实际上是在一个较旧的Ubuntu 10.04,我可能正在经历 - 不是一个错误 - 但安装问题evince(缺少poppler-data包),如Bug#386008中所述"由于"未知的字体标记,某些字体无法显示. ..:"Bugs:"poppler"包:Ubuntu.
但是,这正是我想要处理的内容,因此我将使用fontspec.pdf附加到该帖子(" PDF触发错误. ",//v.)来演示问题.
evince首先,我打开这个pdf的第3页evince; 并evince抱怨:
$ evince --page-label=3 fontspec.pdf
Error: Missing language pack for 'Adobe-Japan1' mapping
Error: Unknown font tag 'F5.1'
Error (7597): No font in show
Error: Unknown font tag 'F5.1'
Error (7630): No font in show
Error: Unknown font tag 'F5.1'
Error (7660): No font in show
Error: Unknown font tag 'F5.1'
...
Run Code Online (Sandbox Code Playgroud)
渲染如下所示:

......很明显,缺少某些字体形状.
acroread关于Adobe的Acrobat Reader for Linux如何表现的说明; 以下命令行:
$ ./Adobe/Reader9/bin/acroread /a "page=3" fontspec.pdf
Run Code Online (Sandbox Code Playgroud)
...不会向终端生成任何输出(有关/a切换的更多信息,请参阅手册页acroread) - 程序显示字体绝对没有问题.
此外,虽然我想避免往返附录 - 但请注意,acroread它本身可用于将PDF转换为postscript:
$ ./Adobe/Reader9/bin/acroread -v
9.5.1
$ ./Adobe/Reader9/bin/acroread -toPostScript \
-rotateAndCenter -choosePaperByPDFPageSize \
-start 3 -end 3 \
-level3 -transQuality 5 \
-optimizeForSpeed -saveVM \
fontspec.pdf ./
Run Code Online (Sandbox Code Playgroud)
同样,上面的命令行将不会向终端生成输出; -optimizeForSpeed -saveVM是因为显然他们处理字体; 最后一个参数./是输出目录(自动调用输出文件fontspec.ps).
现在,evince 可以在fontspec.ps输出中显示以前丢失的字体- 但是再次抱怨:
$ evince fontspec.ps
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
...
Run Code Online (Sandbox Code Playgroud)
...此外,所有文本似乎都被扁平化为postscript中的曲线 - 所以现在无法再选择.ps文件中的文本evince了(请注意.ps文件无法打开acroread).但是,可以将此.ps再次转换为.pdf:
$ pstopdf fontspec.ps # note, `pstopdf` has no output filename option;
# it will automatically choose 'fontspec.pdf',
# and overwrite previous 'fontspec.pdf' in
# the same directory
Run Code Online (Sandbox Code Playgroud)
...现在pstopdf可以选择输出中的文本evince,所有字体都在那里,并且evince不再抱怨了.但是,正如我所指出的,我想完全避免往返postscript文件.
display(来自imagemagick)我们还可以使用imagemagicks 观察同一文档中的页面display(请注意,使用'display'从命令行进行的图像平移显然仍然无法使用,因此我在-crop下面使用它来调整视口):
$ display -density 150 -crop 740x450+280+200 fontspec.pdf[2]
**** Warning: considering '0000000000 00000 n' as a free entry.
...
**** This file had errors that were repaired or ignored.
**** The file was produced by:
**** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
**** Please notify the author of the software that produced this
**** file that it does not conform to Adobe's published PDF
**** specification.
Run Code Online (Sandbox Code Playgroud)
...产生一些ghostscripish错误 - 并产生如下结果:

...显而易见的是evince,现在在这里显示了无法渲染的丢失字体,正确地显示了imagemagicks display.
ghostscript最后,我们可以使用ghostscript作为x11查看器本身 - 观察同一页面,同一文档:
$ gs -sDevice=x11 -g740x450 -r150x150 -dFirstPage=3 \
-c '<</PageOffset [-120 520]>> setpagedevice' \
-f fontspec.pdf
GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 74.
Page 3
>>showpage, press <return> to continue<<
^C
Run Code Online (Sandbox Code Playgroud)
...以及此输出的结果:

总而言之:( ghostscript并且显然是通过扩展imagemagick),似乎可以找到丢失的字体(或者至少是它的一些替代品),并使用该字体呈现页面 - 即使evince对于同一文档失败也是如此.
因此,我只想从中导出一个PDF版本ghostscript,只会嵌入缺少的字体,而不会进行其他处理; 所以我试试这个:
$ gs -dBATCH -dNOPAUSE -dSAFER \
-dEmbedAllFonts -dSubsetFonts=true -dMaxSubsetPct=99 \
-dAutoFilterMonoImages=false \
-dAutoFilterGrayImages=false \
-dAutoFilterColorImages=false \
-dDownsampleColorImages=false \
-dDownsampleGrayImages=false \
-dDownsampleMonoImages=false \
-sDEVICE=pdfwrite \
-dFirstPage=3 -dLastPage=3 \
-sOutputFile=mypg3out.pdf -f fontspec.pdf
GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 3.
Page 3
**** This file had errors that were repaired or ignored.
**** The file was produced by:
**** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
**** Please notify the author of the software that produced this
**** file that it does not conform to Adobe's published PDF
**** specification.
Run Code Online (Sandbox Code Playgroud)
...但它不起作用 - 输出文件mypg3out.pdf遇到与evince前面提到的完全相同的问题.
注意:虽然我想避免postcript往返,但是gs从pdf到ps并使用字体嵌入的命令行的一个很好的例子是:(#277826)pdf - 如何使GhostScript PS2PDF停止对字体进行子集化 ; 但是同样的命令行切换.pdf到.pdf似乎对上述问题没有任何影响.
好的点1;您不能使用 Ghostscript 和 pdfwrite 创建 PDF 文件“无需任何额外处理”。
pdfwrite 和 Ghostscript 的工作方式是完全解释传入的数据(PostScript、PDF、XPS、PCL 等),创建一系列图形基元,并将其传递到 pdfwrite 设备。然后 pdfwrite 设备将它们重新组合成一个全新的 PDF 文件。
因此不可能将 PDF 文件作为输入并对其进行操作,它总是会创建一个新文件。
现在,我建议您首先将 9.02 Ghostscript 升级到 9.05。缺失的 CIDFonts 在 9.05 中得到了更好的处理(并将在今年晚些时候的 9.06 中得到进一步改进)。(您缺少的字体“Osaka Mono”实际上是 CIDFont,而不是常规字体)
使用当前最先进的 Ghostscript 代码为我生成一个 PDF 文件,其中嵌入了缺失的字体。我无法判断这是否适合您,因为我的证据副本可以很好地呈现原始文件。
稍后添加
检查原始 PDF 文件,我发现其中的字体确实是嵌入的(正如我所期望的,因为它们是子集)。所以事实上正如您在上面自己的回答中所说,问题不是字体嵌入,而是 CIDFonts 的使用。
我在这里的回答不会对您有帮助,因为 pdfwrite 仍会在输出中生成 CIDFont。基本上,这是您的版本或证据安装中的缺陷。
“重新映射”字符的问题在于字体仅限于 256 个字形,而 CIDFont 实际上没有限制。所以没有办法将CIDFont放入Font中。执行此操作的唯一方法是创建多个字体,每个字体都包含原始字体的一部分,然后根据需要在它们之间切换。缓慢而笨重。
如果您使用 ps2write 设备转换为 PostScript,那么它会为您完成此操作,但您面临很大的风险,在此过程中它将把矢量字形数据转换为位图,而位图无法很好地缩放。
从根本上来说,使用 Ghostscript,或者事实上使用我所知道的任何其他工具,你无法真正实现你想要做的事情(将 1 个 CIDFont 转换为 N 个常规字体)。虽然它在技术上是可行的,但没有任何实际意义,因为所有 PDF 使用者都应该能够处理 CIDFonts。如果他们不能,那么它是 PDF 用户的一个错误。
| 归档时间: |
|
| 查看次数: |
7869 次 |
| 最近记录: |