我希望从PDF中提取纯文本,并通过一个命名实体识别函数来运行它,该函数将显示文本和字符串位置。
我正在考虑使用pdfminer从我的PDF中提取文本。我想知道是否有可能将字符串位置的坐标转换回页面坐标。例如,如果提取的文本是“Hello”,那么如何获得“World”的页面坐标(给定其字符串位置5:11 )
谢谢!
发布于 2022-06-18 02:12:12
如何逆转PDF字的位置并不容易,所以让我们使用一个基本的例子

%PDF-1.4
1 0 obj <</Type /Catalog /Pages 2 0 R>>
endobj
2 0 obj <</Type /Pages /Kids [3 0 R] /Count 1>>
endobj
3 0 obj<</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 500 800] /Contents 6 0 R>>
endobj
4 0 obj<</Font <</F1 5 0 R>>>>
endobj
5 0 obj<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>
endobj
6 0 obj
<</Length 44>>
stream
BT /F1 24 Tf 175 720 Td (Hello World!)Tj ET
endstream
endobj
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000056 00000 n
0000000111 00000 n
0000000212 00000 n
0000000250 00000 n
0000000317 00000 n
trailer <</Size 7/Root 1 0 R>>
startxref
406
%%EOF在这里,很明显,Helvetica字符串位于x=175 y=720 (即一个默认页面的顶部附近),但是页面有800个单位高,而不是一个更自然的842 pt,所以第一个问题是,协调是什么意思?投影/转换起什么作用?
因此,我们可以很容易地说,x值的世界!通常是正面的从左边的边缘,但来源可能是右上角的媒体,因此世界!在x和y中都是负的。
对于日常PDF页面,我们使用默认的文本原点作为裁剪框或媒体框的左下角,除非我们看到另有说明。同样,对于图像,它们的起源通常是从左上角计算的,但这可能超出了它们的作物边界。库将帮助您提供相关的值,幸运的话,这些值被简化为一个共同的来源和规模,并且由于转换而几乎没有冲突。
在这种情况下,我们可以期待世界的左下角!X= 236 &y= 80 (800-720)。
但是,一个简单的HTML转换可能会将两个单词放在一起使用top:94px;left:263px。
<body bgcolor="#A0A0A0" vlink="blue" link="blue">
<div id="page1-div" style="position:relative;width:750px;height:1200px;">
<img width="750" height="1200" src="hello001.png" alt="background image"/>
<p style="position:absolute;top:94px;left:263px;white-space:nowrap" class="ft00">Hello World!</p>
</div>
</body>

如果您需要精确的文本位置,那么打印机组件跟踪将给出最准确的打印出答案。
多工具跟踪hello.pdf
<fill_text colorspace="DeviceGray" color="0" transform="1 0 0 -1 0 800">
<span font="Helvetica" wmode="0" bidi="0" trm="24 0 0 24">
<g unicode="H" glyph="H" x="175" y="720" adv=".722"/>
<g unicode="e" glyph="e" x="192.328" y="720" adv=".556"/>
<g unicode="l" glyph="l" x="205.672" y="720" adv=".222"/>
<g unicode="l" glyph="l" x="211" y="720" adv=".222"/>
<g unicode="o" glyph="o" x="216.328" y="720" adv=".556"/>
<g unicode=" " glyph="space" x="229.672" y="720" adv=".278"/>
<g unicode="W" glyph="W" x="236.344" y="720" adv=".944"/>
<g unicode="o" glyph="o" x="259" y="720" adv=".556"/>
<g unicode="r" glyph="r" x="272.344" y="720" adv=".333"/>
<g unicode="l" glyph="l" x="280.336" y="720" adv=".222"/>
<g unicode="d" glyph="d" x="285.664" y="720" adv=".556"/>
<g unicode="!" glyph="exclam" x="299.008" y="720" adv=".278"/>
</span>
</fill_text>“世界的W”开始于x="236.344“y=720
我们还可以通过添加每一项预付款来计算World的宽度。
World = 2.611单位的总进给量( 24 = 62.664宽= 22.10647毫米)
或者我们可以通过更简单的减法来完成,因为我们知道了!为299.008 so -236.344也= 62.664。
https://stackoverflow.com/questions/72664472
复制相似问题