我正在使用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)
有谁知道如何解决这个问题?
答案 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;但codes
为codes
(见上文),因此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版本,所以有些问题是可以预期的......