Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
itextsharp,为什么GetSingleSpaceWidth()在一个可见的空间时返回0?_Itext - Fatal编程技术网

itextsharp,为什么GetSingleSpaceWidth()在一个可见的空间时返回0?

itextsharp,为什么GetSingleSpaceWidth()在一个可见的空间时返回0?,itext,Itext,大家好 这是一个与itextsharp版本5.5.13.1相关的问题。我正在使用自定义LocationTextExtractionStrategy实现从PDF文档中提取有意义的单词。我正在调用TextRenderInfo的方法GetSingleSpaceWidth,以确定何时 按照SFO链接将两个相邻的字符块连接成一个单词 这种方法通常效果良好。但是,如果您查看随附的文档,“信贷”和“扩展”这两个词给我带来了一些问题。 为什么屏幕截图中显示的所有字符都返回一个零值作为GetSingleSpac

大家好

这是一个与itextsharp版本5.5.13.1相关的问题。我正在使用自定义LocationTextExtractionStrategy实现从PDF文档中提取有意义的单词。我正在调用TextRenderInfo的方法GetSingleSpaceWidth,以确定何时 按照SFO链接将两个相邻的字符块连接成一个单词

这种方法通常效果良好。但是,如果您查看随附的文档,“信贷”和“扩展”这两个词给我带来了一些问题。 为什么屏幕截图中显示的所有字符都返回一个零值作为GetSingleSpaceWidth?这导致了一个问题。我的逻辑返回一个单词“CreditExtended”,而不是两个单独的单词

据我所知,itextsharp5不再受支持。如有任何建议,将不胜感激

示例文档


正如在评论中已经推测的,原因是所讨论的字体不包含规则空格标志符,或者更准确地说,没有将其标志符映射到其ToUnicode映射中的Unicode值U+0020

如果字体有ToUnicode映射,则iText仅使用该映射中的信息。因此,iText无法识别该字体中的空格图示符,因此它无法提供实际的
SingleSpaceWidth
值,而是返回0


所讨论的字体名为F5,并具有此ToUnicode映射:

/CIDInit/ProcSet findresource begin
14听写开始
开始地图
/CIDSystemInfo
>def
/CMapName/Adobe Identity UCS def
/CMapType 2 def
1 BeginDespacerange
endcodespacerange
4贝金布查尔
endbfchar
一开始
endbfrange
13贝金布查尔
endbfchar
五开始
[]
endbfrange
1贝金布查尔
endbfchar
endcmap
CMapName currentdict/CMap定义源pop
结束
结束
如您所见,没有到
的映射


顺便说一句,在这个PDF页面中使用字体非常有趣:

它的主体(大部分)是使用Calibri绘制的,但它使用了两个不同的PDF字体对象,F4,它使用了从字符32到122的WinAnSienceODing,即包括空格字形,和F5,它使用Identity-H,并提供上面引用的ToUnicode地图,不带空格图示符。分别绘制每个无间隙的最大字形序列;如果可以使用F4绘制整个序列,则使用该字体,否则使用F5

因此,
CMI
(Credit
)和
子索引
使用F4绘制,而
我已经
“Credit
Extended”
使用F5绘制

因此,在您的问题字符串
“Credit Extended”
中,我们看到使用F5绘制的两个连续序列。因此,对于
“Credit
t
Extended”
这两个序列,您将得到一个0
单空格宽度

乍一看,这是使用F5的仅有的两个连续序列,因此您只有在那里才有这个问题



因此,对于两个连续字符都带有0
SingleSpaceWidth
,例如使用大约三分之一的字体大小的情况,您应该制定一个回退策略。

本周晚些时候,我将查看您的文件。一个可能的原因是所讨论的字体根本没有空格字形,并且“信用”和“扩展”之间的距离是通过显式移动文本插入点来实现的。感谢您的详细回答。再给我一个建议。如果我使用最新版本的itext(我相信是第7版)阅读同一文档我还需要实现你建议的逻辑吗?我想是的,但我不确定。我必须测试它。