OCR - PDF到HTML - 从元素中获取数据

时间:2016-07-13 18:59:19

标签: php html pdf ocr

我需要分析一些PDF文件并从中提取数据

我使用pdftohtml将PDF转换为HTML

pdftohtml -s -i 001.pdf

E.g。我需要在HTML文档的标题60,00下获得Fragt金额。我可以使用一些正则表达式来查找Fragt但是如何在Fragt元素下或元素右侧获取最近的元素?

是否有快速工具或其他方法可以更方便地进行数据提取,还是需要计算相对于每个元素的位置?

HTML

<!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&#160;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">&#160;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">&#160;118,00</p>
<p style="position:absolute;top:489px;left:508px;white-space:nowrap" class="ft15">&#160;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">&#160;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">&#160;118,00</p>
<p style="position:absolute;top:509px;left:508px;white-space:nowrap" class="ft15">&#160;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">&#160;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">&#160;118,00</p>
<p style="position:absolute;top:529px;left:508px;white-space:nowrap" class="ft15">&#160;1,00</p>
<p style="position:absolute;top:1014px;left:350px;white-space:nowrap" class="ft16">OBS !&#160;Vi holder ferielukket i uge 28-29-30</p>
<p style="position:absolute;top:1104px;left:785px;white-space:nowrap" class="ft12"><b>&#160;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">&#160;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">&#160;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&#160;</b></p>
<p style="position:absolute;top:1131px;left:539px;white-space:nowrap" class="ft12"><b>Betales senest den .:&#160;</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&#160;</b></p>
<p style="position:absolute;top:1104px;left:287px;white-space:nowrap" class="ft16">&#160;60,00</p>
<p style="position:absolute;top:1104px;left:511px;white-space:nowrap" class="ft16">&#160;650,00</p>
</div>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

这里有一些代码可以找到最接近的元素,它在JS中,你需要将整个块粘贴到上面发布的代码中。

一方面,如果给出一个文档片段,php可以找到元素 - 另一方面,没有getComputedStyle函数可以让事情变得如此简单。我怀疑你自己需要解析HTML才能获得每个元素的位置。

此代码仅突出显示其左上角最接近目标元素左上角的元素。在许多情况下,这将失败 - 您可以以适合您需要的方式改进和修改它。

预期输出:

enter image description here

<强>代码:

<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>