Ghostscript:使用'gxps'生成可搜索的PDF

时间:2015-04-12 12:54:10

标签: pdf ghostscript xps

我有一个可搜索的XPS文件,我将其转换为PDF:

gxps -sOutputFile=C:\temp\foo.pdf -sDEVICE=pdfwrite \
     -dNOPAUSE C:\temp\foo.xps

生成的PDF无法搜索。

  • gxps是否有办法生成可搜索的PDF?
  • 如果没有,是否有类似的应用程序可以在命令行上将可搜索的XPS转换为可搜索的PDF?

修改

gxps version: 9.15
Build date: Mon Sep 22 12:35:05 2014

1 个答案:

答案 0 :(得分:1)

我查看了PDF并使用pdffonts快速调查了GXPS用于生成的PDF文件的字体:

 $ pdffonts forSO.pdf

   name                    type         encoding         emb sub uni object ID
   ----------------------- ------------ ---------------- --- --- --- ---------
   RFGWZI+Arial            TrueType     WinAnsi          yes yes yes     11  0

表面上看,它看起来还不错:

  1. 使用的唯一字体是嵌入式(请参阅emb列)。
  2. 字体类型是常见字体(请参阅type列)。
  3. 字体编码是标准编码(请参阅encoding列)。
  4. 该字体似乎有一个伴随/ToUnicode地图(请参阅uni列)。
  5. 然而,仔细观察,/ToUnicode嵌入到PDF中的真实gxps地图似乎非常重要。这是它,从PDF中提取为完整的间接对象,具有未压缩的流:

    41 0 obj
    <<
      /Length 863
    >>
    stream
    /CIDInit /ProcSet findresource begin
    12 dict begin
    begincmap
    /CMapType 2 def
    /CMapName/R41 def
    1 begincodespacerange
    <00><ff>
    endcodespacerange
    42 beginbfrange
    <04><04><0004>
    <05><05><0004>
    <06><06><0006>
    <07><07><0006>
    <08><08><0006>
    <09><09><0006>
    <0a><0a><000a>
    <0b><0b><000a>
    <0c><0c><000c>
    <0d><0d><000c>
    <0e><11><000e>
    <12><12><000c>
    <13><13><000c>
    <14><14><000c>
    <15><15><000c>
    <16><16><0004>
    <17><17><0004>
    <18><18><0004>
    <19><1a><0019>
    <1b><1b><001a>
    <1c><1c><001a>
    <1d><1d><001a>
    <1e><1e><001a>
    <1f><1f><001a>
    <20><20><0044>
    <21><21><001a>
    <22><22><001a>
    <23><23><001a>
    <24><24><0024>
    <25><25><000c>
    <26><26><001d>
    <27><27><0023>
    <28><28><0023>
    <29><29><0028>
    <41><41><0044>
    <44><44><0044>
    <49><49><0044>
    <63><63><0044>
    <69><69><0044>
    <74><74><0044>
    <76><76><0044>
    <79><79><0044>
    endbfrange
    endcmap
    CMapName currentdict /CMap defineresource pop
    end end
    endstream
    endobj
    

    可以看出,/ToUnicode表包含42个键,但这些键只映射到12个不同的字符值:

    • 这12个不同字符值中的一些在此表中多次出现,因此将多个字形反向映射到同一个字符(即使对于单个字符,这似乎也不正确):

           no. of |   char 
      occurrences |   value
      ------------+-----------
               1  |   <000e>
               1  |   <0019>
               1  |   <001d>
               1  |   <0024>
               1  |   <0028>
               2  |   <000a>
               2  |   <0023>
               4  |   <0006>
               5  |   <0004>
               7  |   <000c>
               8  |   <001a>
               9  |   <0044>
      
    • 例如,字符值06会映射到包含数字06070809的字形。

    这看起来并不正确。

    恕我直言,这应该得到 Ghostscript's Bugzilla 的错误报告(但我不确定GXPS组件是否仍在积极维护)。

    更新: 我在这里找到了Ghostscript / GXPS bugzilla数据库的现有条目: