pdfclown突出显示不适用于某些pdf文件

时间:2014-06-27 17:33:33

标签: pdfclown

我正在使用pdfclown库来突出显示pdf文件中的一些文本但由于某种原因,当我运行TextHighlightSample时,我得到nullpointerexception错误。

 [java] java.lang.NullPointerException
 [java]     at java.util.Hashtable.hash(Hashtable.java:239)
 [java]     at java.util.Hashtable.put(Hashtable.java:519)
 [java]     at org.pdfclown.documents.contents.fonts.SimpleFont.onLoad(SimpleFont.java:139)
 [java]     at org.pdfclown.documents.contents.fonts.Font.load(Font.java:738)
 [java]     at org.pdfclown.documents.contents.fonts.Font.<init>(Font.java:351)
 [java]     at org.pdfclown.documents.contents.fonts.SimpleFont.<init>(SimpleFont.java:62)
 [java]     at org.pdfclown.documents.contents.fonts.TrueTypeFont.<init>(TrueTypeFont.java:68)
 [java]     at org.pdfclown.documents.contents.fonts.Font.wrap(Font.java:253)
 [java]     at org.pdfclown.documents.contents.FontResources.wrap(FontResources.java:72)
 [java]     at org.pdfclown.documents.contents.FontResources.wrap(FontResources.java:1)
 [java]     at org.pdfclown.documents.contents.ResourceItems.get(ResourceItems.java:119)
 [java]     at org.pdfclown.documents.contents.objects.SetFont.getResource(SetFont.java:119)
 [java]     at org.pdfclown.documents.contents.objects.SetFont.getFont(SetFont.java:83)
 [java]     at org.pdfclown.documents.contents.objects.SetFont.scan(SetFont.java:97)
 [java]     at org.pdfclown.documents.contents.ContentScanner.moveNext(ContentScanner.java:1330)
 [java]     at org.pdfclown.documents.contents.ContentScanner$TextWrapper.extract(ContentScanner.java:811)
 [java]     at org.pdfclown.documents.contents.ContentScanner$TextWrapper.<init>(ContentScanner.java:777)
 [java]     at org.pdfclown.documents.contents.ContentScanner$TextWrapper.<init>(ContentScanner.java:770)
 [java]     at org.pdfclown.documents.contents.ContentScanner$GraphicsObjectWrapper.get(ContentScanner.java:690)
 [java]     at org.pdfclown.documents.contents.ContentScanner$GraphicsObjectWrapper.access$0(ContentScanner.java:682)
 [java]     at org.pdfclown.documents.contents.ContentScanner.getCurrentWrapper(ContentScanner.java:1154)
 [java]     at org.pdfclown.tools.TextExtractor.extract(TextExtractor.java:633)
 [java]     at org.pdfclown.tools.TextExtractor.extract(TextExtractor.java:647)
 [java]     at org.pdfclown.tools.TextExtractor.extract(TextExtractor.java:647)
 [java]     at org.pdfclown.tools.TextExtractor.extract(TextExtractor.java:296)
 [java]     at org.pdfclown.samples.cli.TextHighlightSample.run(TextHighlightSample.java:56)
 [java]     at org.pdfclown.samples.cli.SampleLoader.run(SampleLoader.java:140)
 [java]     at org.pdfclown.samples.cli.SampleLoader.main(SampleLoader.java:56)

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

前台问题

前台问题是SimpleFont.onLoad()中的PdfClown(从字体词典中读取 Widths 到其自己的结构中)假定每个glyphIndexes条目{来自宽度数组中基于 FirstChar 的索引的键的值{1}}:

codes

如果您在此处检查 if(glyphWidthObjects != null) { ByteArray charCode = new ByteArray( new byte[] {(byte)((PdfInteger)getBaseDataObject().get(PdfName.FirstChar)).getIntValue()} ); for(PdfDirectObject glyphWidthObject : glyphWidthObjects) { int glyphWidth = ((PdfNumber<?>)glyphWidthObject).getIntValue(); if(glyphWidth > 0) { Integer code = codes.get(charCode); if(code != null) { glyphWidths.put( glyphIndexes.get(code), //<<<<<<<<<<<<<<<<<<<<<< glyphWidth ); } } charCode.data[0]++; } } ,例如取代

null

通过

        if(code != null)

你将摆脱 if(code != null && glyphIndexes.get(code) != null)

通常所有这些值都有NullPointerException个条目。因此,通常你不会在这里获得glyphIndexes。但PdfClown试图尽可能多地提取使用来自PDF对象和嵌入字体对象的信息的混合,并且在这些信息的协调中似乎仍然存在一些缺点,例如,如果您的文件:

背景问题

为字体构建NullPointerException对象 SourceSansPro-Regular PdfClown

  • TrueTypeFont)尝试读取 ToUnicode 地图,以获取从字符代码到Unicode的映射并将其放入Font.load;不幸的是,该字体没有 ToUnicode 地图;因此,codes仍为codes;
  • (最初由null调用的OpenFontParser中的TrueTypeFont.loadEncoding构造)尝试从嵌入字体文件中读取信息;在其他数据中,它检索了映射32..213 - &gt; 0..44将字符代码映射到字体内字形索引;
  • (仍在SimpleFont.onLoad最初由TrueTypeFont.loadEncoding调用)将字体对象的SimpleFont.onLoad成员设置为该地图;如果现在已有glyphIndexes映射,则此处将使用此映射将映射更改为映射Unicode - &gt; 0..44;但codescodes(见上文),因此null保持不变;
  • (仍在glyphIndexes最初由TrueTypeFont.loadEncoding调用),因为还没有SimpleFont.onLoad映射,它会根据PDF中的 MacRomanEncoding 条目创建一个字体词典;
  • (仍在codes最初由TrueTypeFont.loadEncoding调用)如果还没有SimpleFont.onLoad,则会从当前glyphIndexes映射和宽度中派生出一个数组;但我们已经有一个,所以它仍然是原样;
  • codes)最后它尝试将PDF字体词典的 Widths 数组的内容放入其SimpleFont.onLoad地图中。代码(见上文)假设glyphWidths是Unicode代码的映射,因此首先使用glyphIndexes进行翻译。不幸的是,codes这里不是来自Unicode代码,而是来自字符代码。因此发生上述失败。

PdfClown 0.1.3中的字体提取需要清理。它试图利用来自PDF对象和嵌入字体的信息(这是一个好主意)但是对于某些情况,例如在这里拍摄自己的脚。

但它毕竟还是早期的0.x版本,所以有些问题是可以预期的......