C# 从pdf中提取文本信息

C# 从pdf中提取文本信息,c#,pdf,pdfclown,C#,Pdf,Pdfclown,如何提取文本信息,如文本位置坐标、宽度、高度和e.t.c?? 我在'Pdf小丑'库中尝试了这一点,它对于普通文本非常有效,但是对于旋转文本(90/-90度),它将宽度/高度输出为0(零) (90/-90度)文本的缩放因子(scaleX,scaleY)分别显示为(0,0),其中,对于反转文本(180度旋转)为(-1,-1) 我需要旋转文本的信息来突出显示它们(由于宽度值为零,我无法突出显示它们)。请帮帮我。我正在.NET环境下工作 我正在使用的文件: 代码:使用来自pdfclown的样本 输出 (

如何提取文本信息,如文本位置坐标、宽度、高度和e.t.c?? 我在'Pdf小丑'库中尝试了这一点,它对于普通文本非常有效,但是对于旋转文本(90/-90度),它将宽度/高度输出为0(零)

(90/-90度)文本的缩放因子(scaleX,scaleY)分别显示为(0,0),其中,对于反转文本(180度旋转)为(-1,-1)

我需要旋转文本的信息来突出显示它们(由于宽度值为零,我无法突出显示它们)。请帮帮我。我正在.NET环境下工作

我正在使用的文件:

代码:使用来自pdfclown的样本

输出 (用于上述文件中文本的三种不同对齐方式)

文本[x:283,y:104,w:126,h:-23][font size:-24,font sytle:ArialMT]:倒排文本

文本[x:265,y:244,w:0,h:121][font size:0,font-sytle:ArialMT]:垂直文本

Text[x:347,y:131,w:0,h:167][font-size:0,font-sytle:ArialMT]:vertical_-minus90

由于我更熟悉Java而不是.Net,我分析了这个问题,并用PDF小丑/Java创建了第一个解决方案;稍后我将尝试将其移植到.Net。不过,自己做应该不会太难

问题 您提供的示例文件在PDF小丑
TextInfoExtractionSample
中运行时,使问题变得非常清楚

edit9.pdf的屏幕截图:

应用
TextInfoExtractionSample
后的
edit9.pdf
屏幕截图:

正楷 一切看起来都很好

颠倒文本 单个字符框(绿色)看起来正常,但整个字符串“反向_文本”(黑色虚线)的框不包括最外层的字符

垂直文本 单个字符框减少为0x0矩形(在屏幕截图中不可见,但在内容流分析中明显)。整个字符串的框缩小为缺少位长度的字符串基线上的一条线(黑色虚线)

文本之间有一定角度 字符框垂直,与页面边框平行,其基线段位于框内。但是,由于文本成一定角度,字符的上下部分在各自的字符框外,而相邻字符部分在框内

整个字符串的框也与页面平行

简而言之 文本字符和字符串框仅适用于直立文本

来源 这与源代码中的内容相匹配:

  • 按设计用于字符框的Java
    Rectangle2D
    和.Net
    RectangleF
    类用于平行于坐标系轴的矩形,并以这种方式在PDF小丑中使用。因此,它们不能以任意角度正确表示字符的宽度和高度

  • PDF小丑类不包含表示角色旋转的
    角度
    属性

  • 字符框尺寸的计算仅考虑聚合变换矩阵主对角线上的值,即
    ScaleX
    ScaleY
    ,并忽略
    ShearX
    ShearY
    。但是,对于不垂直或不倒置的文本,
    ShearX
    ShearY
    非常重要,而对于垂直文本
    ScaleX
    ScaleY
    则为0

  • 从基线(本机PDF文本定位方式)到字符顶部(PDF小丑文本定位)的转换仅通过改变y坐标完成,因此,仅适用于直立和倒置文本

变通办法 要真正解决这个问题,需要为字符和字符串框使用一个完全不同的类,一个以任意角度对矩形建模的类

一个更快的工作,但是,可以添加一个<代码>角度<代码>成员到<代码> TrcChar 类和ItExtStord和实现,然后在处理这些框时考虑这个角度。这项工作在这里实施

如上所述,解决方案首先是用Java实现的

在爪哇 首先,我们向
TextChar
添加一个角度成员,在
ShowText
操作类中计算框尺寸和角度的正确值,并在
ContentScanner.TextStringWrapper
中正确设置这些值

然后我们向
TextStringWrapper
(通常是
ITextString
)添加一个角度获取程序,它返回字符串的第一个文本字符的角度。我们改进了
TextStringWrapper
方法
getBox
,在确定字符串框时考虑了文本字符的角度

最后,我们将扩展
TextInfoExtractionSample
,以便在绘制框时考虑角度值

我在我的草图中把那个角度命名为α,我把它命名为α。事后看来,θ或角度更合适

文本字符 新成员变量
alpha

private final double alpha;
新的和已更改的构造函数

//
公共文本字符(
字符值,
矩形盒,
文本样式样式,
布尔虚
)
{
这(值、框、0、样式、虚拟);
}
公共文本字符(
字符值,
矩形盒,
双阿尔法,
文本样式样式,
布尔虚
)
{
这个值=值;
this.box=box;
这个α=α;
这个。风格=风格;
this.virtual=virtual;
}
// 
角的吸气剂

public-double-getAlpha(){
返回α;
}
()

显示