我需要分析一些PDF文件并从中提取数据
我使用pdftohtml
将PDF转换为HTML
pdftohtml -s -i 001.pdf
E.g。我需要在HTML文档的标题60,00
下获得Fragt
金额。我可以使用一些正则表达式来查找Fragt
但是如何在Fragt
元素下或元素右侧获取最近的元素?
是否有快速工具或其他方法可以更方便地进行数据提取,还是需要计算相对于每个元素的位置?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<title>001-html.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<br/>
<style type="text/css">
<!--
p {margin: 0; padding: 0;} .ft10{font-size:13px;font-family:Times;color:#000000;}
.ft11{font-size:13px;font-family:Times;color:#000000;}
.ft12{font-size:11px;font-family:Times;color:#000000;}
.ft13{font-size:19px;font-family:Times;color:#000000;}
.ft14{font-size:10px;font-family:Times;color:#000000;}
.ft15{font-size:12px;font-family:Times;color:#000000;}
.ft16{font-size:11px;font-family:Times;color:#000000;}
.ft17{font-size:13px;line-height:21px;font-family:Times;color:#000000;}
.ft18{font-size:19px;line-height:27px;font-family:Times;color:#000000;}
.ft19{font-size:11px;line-height:18px;font-family:Times;color:#000000;}
.ft110{font-size:11px;line-height:16px;font-family:Times;color:#000000;}
.ft111{font-size:10px;line-height:15px;font-family:Times;color:#000000;}
.ft112{font-size:11px;line-height:17px;font-family:Times;color:#000000;}
-->
</style>
</head>
<body bgcolor="#A0A0A0" vlink="blue" link="blue">
<div id="page1-div" style="position:relative;width:892px;height:1261px;">
<p style="position:absolute;top:385px;left:609px;white-space:nowrap" class="ft12"><b>Deres ref.:</b></p>
<p style="position:absolute;top:426px;left:69px;white-space:nowrap" class="ft12"><b>Varenr.</b></p>
<p style="position:absolute;top:426px;left:203px;white-space:nowrap" class="ft12"><b>Beskrivelse</b></p>
<p style="position:absolute;top:426px;left:519px;white-space:nowrap" class="ft12"><b>Antal</b></p>
<p style="position:absolute;top:426px;left:572px;white-space:nowrap" class="ft12"><b>Enhed</b></p>
<p style="position:absolute;top:426px;left:662px;white-space:nowrap" class="ft12"><b>A-pris</b></p>
<p style="position:absolute;top:426px;left:719px;white-space:nowrap" class="ft12"><b>%</b></p>
<p style="position:absolute;top:426px;left:797px;white-space:nowrap" class="ft12"><b>Beløb</b></p>
<p style="position:absolute;top:489px;left:68px;white-space:nowrap" class="ft15">tal140</p>
<p style="position:absolute;top:489px;left:203px;white-space:nowrap" class="ft15">Husnummer 1 H. 40 cm.</p>
<p style="position:absolute;top:489px;left:795px;white-space:nowrap" class="ft15"> 236,00</p>
<p style="position:absolute;top:489px;left:570px;white-space:nowrap" class="ft15">Stk.</p>
<p style="position:absolute;top:489px;left:654px;white-space:nowrap" class="ft15"> 118,00</p>
<p style="position:absolute;top:489px;left:508px;white-space:nowrap" class="ft15"> 2,00</p>
<p style="position:absolute;top:509px;left:68px;white-space:nowrap" class="ft15">tal440</p>
<p style="position:absolute;top:509px;left:203px;white-space:nowrap" class="ft15">Husnummer 4 H. 40 cm.</p>
<p style="position:absolute;top:509px;left:795px;white-space:nowrap" class="ft15"> 236,00</p>
<p style="position:absolute;top:509px;left:570px;white-space:nowrap" class="ft15">Stk.</p>
<p style="position:absolute;top:509px;left:654px;white-space:nowrap" class="ft15"> 118,00</p>
<p style="position:absolute;top:509px;left:508px;white-space:nowrap" class="ft15"> 2,00</p>
<p style="position:absolute;top:529px;left:68px;white-space:nowrap" class="ft15">bog</p>
<p style="position:absolute;top:529px;left:203px;white-space:nowrap" class="ft15">Bogstav H. 40 cm.</p>
<p style="position:absolute;top:529px;left:796px;white-space:nowrap" class="ft15"> 118,00</p>
<p style="position:absolute;top:529px;left:570px;white-space:nowrap" class="ft15">Stk.</p>
<p style="position:absolute;top:529px;left:654px;white-space:nowrap" class="ft15"> 118,00</p>
<p style="position:absolute;top:529px;left:508px;white-space:nowrap" class="ft15"> 1,00</p>
<p style="position:absolute;top:1014px;left:350px;white-space:nowrap" class="ft16">OBS ! Vi holder ferielukket i uge 28-29-30</p>
<p style="position:absolute;top:1104px;left:785px;white-space:nowrap" class="ft12"><b> 812,50</b></p>
<p style="position:absolute;top:1131px;left:680px;white-space:nowrap" class="ft12"><b>09-07-2016</b></p>
<p style="position:absolute;top:1104px;left:632px;white-space:nowrap" class="ft16"> 162,50</p>
<p style="position:absolute;top:1131px;left:216px;white-space:nowrap" class="ft12"><b>Netto kontant</b></p>
<p style="position:absolute;top:1104px;left:162px;white-space:nowrap" class="ft16"> 590,00</p>
<p style="position:absolute;top:1086px;left:792px;white-space:nowrap" class="ft12"><b>DKK</b></p>
<p style="position:absolute;top:1131px;left:153px;white-space:nowrap" class="ft12"><b>Betaling </b></p>
<p style="position:absolute;top:1131px;left:539px;white-space:nowrap" class="ft12"><b>Betales senest den .: </b></p>
<p style="position:absolute;top:1086px;left:137px;white-space:nowrap" class="ft12"><b>Netto-beløb</b></p>
<p style="position:absolute;top:1086px;left:276px;white-space:nowrap" class="ft12"><b>Fragt</b></p>
<p style="position:absolute;top:1086px;left:441px;white-space:nowrap" class="ft12"><b>Momspligtigt beløb</b></p>
<p style="position:absolute;top:1086px;left:569px;white-space:nowrap" class="ft12"><b>Momsbeløb 25 %</b></p>
<p style="position:absolute;top:1086px;left:691px;white-space:nowrap" class="ft12"><b>Faktura-total </b></p>
<p style="position:absolute;top:1104px;left:287px;white-space:nowrap" class="ft16"> 60,00</p>
<p style="position:absolute;top:1104px;left:511px;white-space:nowrap" class="ft16"> 650,00</p>
</div>
</body>
</html>
答案 0 :(得分:0)
这里有一些代码可以找到最接近的元素,它在JS中,你需要将整个块粘贴到上面发布的代码中。
一方面,如果给出一个文档片段,php可以找到元素 - 另一方面,没有getComputedStyle
函数可以让事情变得如此简单。我怀疑你自己需要解析HTML才能获得每个元素的位置。
此代码仅突出显示其左上角最接近目标元素左上角的元素。在许多情况下,这将失败 - 您可以以适合您需要的方式改进和修改它。
预期输出:
<强>代码:强>
<script>
function byId(id){return document.getElementById(id)}
function allByTag(tag){return document.getElementsByTagName(tag)}
function replace(haystack, needle, replacement){ return haystack.replace(new RegExp(needle, 'g'), replacement); }
NodeList.prototype.forEach = Array.prototype.forEach;
HTMLCollection.prototype.forEach = Array.prototype.forEach;
addEventListener('load', onDocLoaded);
function onDocLoaded(evt)
{
var options = { elemType: 'p', elemTxt: 'Fragt' };
var tgt = findElement(options);
var tgtPos = getElemTopLeft(tgt);
var elems = allByTag('p');
var minDist=1000000, bestElem;
elems.forEach(
function(elem, index, array)
{
if (elem != tgt)
{
var p2Pos = getElemTopLeft(elem);
if (distBetween(tgtPos, p2Pos) < minDist)
{
minDist = distBetween(tgtPos, p2Pos);
bestElem = elem;
}
}
}
)
bestElem.style.border = "solid 4px red";
}
function getElemTopLeft(elem)
{
var style = window.getComputedStyle(elem);
return { left: parseInt(style["left"]), top: parseInt(style["top"]) };
}
function distBetween(point1, point2)
{
var dX = point2.left - point1.left;
var dY = point2.top - point1.top;
return Math.sqrt( dX*dX + dY*dY );
}
function findElement( options )
{
var elems = allByTag( options.elemType );
var resultIndex = -1;
elems.forEach( function(elem, index, array){if (elem.textContent == options.elemTxt) resultIndex = index;} );
if (resultIndex == -1)
return undefined;
return elems[resultIndex];
}
</script>