简而言之,我正在处理一个有问题的PDF,其中:
evince
这样在文档查看器中完全呈现; ghostscript
可以完全呈现相同的PDF。 因此,不管
ghostscript
用什么填充空格(可能是后备字形,还是访问字体的其他方法),我都希望能够使用ghostscript
生成(“提取”)输出PDF,其中除了添加字体信息外,几乎没有任何改变,因此evince
可以以与ghostscript
相同的方式呈现相同的文档。我的问题是-这是否可能做到?如果是这样,那么实现这样的目标将是什么命令行?
预先感谢您的任何回答,
干杯!
细节:
我实际上是在较旧的Ubuntu 10.04上,并且可能遇到-不是bug-而是
evince
(缺少poppler-data
软件包)的安装问题,如Bug #386008 “Some fonts fail to display due to “Unknown font tag...” : Bugs : “poppler” package : Ubuntu中所述。但是,这正是我要处理的内容,因此我将使用该帖子所附的
fontspec.pdf
(“PDF triggering the bug.”,//v.)来演示此问题。evince
首先,我以
evince
打开此pdf的第3页;和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'
...
渲染看起来像这样:
...很明显,缺少某些字体形状。
Adobe
acroread
只是关于Adobe的Linux版Acrobat Reader表现的注释;以下命令行:
$ ./Adobe/Reader9/bin/acroread /a "page=3" fontspec.pdf
...不会对终端产生任何输出(有关
/a
开关的更多信息,请参见Man page acroread)-程序显示字体绝对没有问题。另外,尽管我希望避免往返于后记-但是,请注意
acroread
本身可用于将PDF转换为后记:$ ./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 ./
同样,以上命令行将不产生任何输出到终端;之所以存在
-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
...
...,而且,所有文本似乎都在后记中弯曲成曲线了-因此,现在无法再通过
evince
选择.ps文件中的文本了(请注意,无法在acroread
中打开.ps文件)。但是,您可以再次将此.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
...现在
pstopdf
输出中的文本可以在evince
中选择,所有字体都在那里,并且evince
不再提示了。但是,正如我所指出的,我希望避免完全往返于Postscript文件。display
(来自imagemagick
)我们还可以使用
imagemagick
的display
观察同一文档中的页面(请注意,显然image panning from the commandline using 'display'仍然不可用,因此我在下面使用了-crop
来调整视口(viewport)):$ 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.
...会产生一些
ghostscrip
ish错误-并产生如下结果:...很明显,现在正确显示了
evince
的imagemagick
,显示了display
无法呈现的丢失字体。ghostscript
最后,我们可以use ghostscript as x11 viewer本身-观察相同的页面,相同的文档:
$ 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
...并显示以下结果:
结论:
ghostscript
(显然是扩展名imagemagick
)似乎可以找到丢失的字体(或至少替换它),并用该字体呈现页面-即使evince
在同一文档中失败了。因此,我只想从
ghostscript
导出PDF版本,该版本仅嵌入缺少的字体,而没有其他处理。所以我尝试这样:$ 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.
...但是它不起作用-输出文件
mypg3out.pdf
遭受了与前面提到的evince
完全相同的问题。注意:虽然我想避免后记往返,但是
gs
命令行的一个很好的示例是从pdf到ps并带有字体嵌入的代码在这里:(#277826) pdf - How to make GhostScript PS2PDF stop subsetting fonts;但是从.pdf到.pdf的同一命令行开关似乎对上述问题没有任何影响。 最佳答案
OK点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文件,其中嵌入了缺少的字体。我无法确定这是否对您有用,因为我的evince副本可以很好地呈现原始文件。
以后添加
检查原始的PDF文件,我发现那里的字体确实是嵌入的(正如我期望的那样,因为它们是子集)。因此,实际上,正如您在上面的回答中说的那样,问题不在于字体嵌入,而在于CIDFonts的使用。
我的回答对您无济于事,因为pdfwrite仍会在输出中产生CIDFont。基本上,这是您的版本或evance安装中的缺陷。
“重新映射”字符的问题在于,字体限制为256个字形,而CIDFont实际上没有限制。因此,无法将CIDFont放入字体中。唯一的方法是创建多个字体,每个字体都包含原始字体的一部分,然后根据需要在它们之间切换。慢而笨拙。
如果您使用ps2write设备转换为PostScript,则它将为您完成此操作,但是您冒着很大的风险,即在此过程中会将矢量字形数据转换为位图,无法很好地缩放比例。
从根本上讲,您无法真正使用Ghostscript或实际上我所知道的任何其他工具来实现自己想要的功能(将1个CIDFont转换为N个常规字体)。尽管从技术上讲它是可行的,但没有实际意义,因为所有PDF使用者都应该能够处理CIDFonts。如果他们不能这样做,那么这是PDF使用者中的一个错误。
关于pdf - 使用Ghostscript处理(重新映射)PDF中的丢失/有问题的(CID/CJK)字体?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11093051/