简而言之,我正在处理一个有问题的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)

    我们还可以使用imagemagickdisplay观察同一文档中的页面(请注意,显然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错误-并产生如下结果:

    ...很明显,现在正确显示了evinceimagemagick,显示了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/

    10-14 21:07
    查看更多