2016-07-13 7 views
1

Ich brauche einige PDF-Dateien zu analysieren und extrahieren Daten aus ihnenOCR - PDF zu HTML - Abrufen von Daten aus Elementen

Ich benutze pdftohtml das PDF zu konvertieren

pdftohtml -s -i 001.pdf 

in HTML Z.B. Ich muss die Menge 60,00 unter der Überschrift im HTML-Dokument erhalten. Ich kann einige reguläre Ausdrücke tun, um zu finden, aber wie bekomme ich das nächste Element entweder unter dem Element oder auf der rechten Seite des Elements?

Gibt es ein schnelles Tool oder etwas, um die Datenextraktion bequemer zu machen, oder muss ich die Positionen relativ zu jedem der Elemente berechnen?

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

Wie genau dieses Problem zu C++ verwandt ist? –

+0

Eine Lösung in C++ oder PHP vielleicht – clarkk

+2

Ok, also fischen Sie gerade und es ist nicht wirklich ein C++ _oder_ PHP-Problem. Ich habs. –

Antwort

0

Hier ist ein Code, der das nächste Element finden, es ist in JS und Sie werden den ganzen Block in den Code einfügen müssen Sie oben gepostet.

Auf der einen Seite kann PHP die Elemente finden, wenn ein Dokumentfragment gegeben wird - auf der anderen Seite gibt es keine getComputedStyle Funktion, um die Dinge so viel einfacher zu machen. Ich vermute, dass Sie den HTML-Code selbst analysieren müssen, um die Position jedes Elements zu ermitteln.

Dieser Code hebt nur das Element hervor, dessen obere linke Seite der oberen linken Ecke des Zielelements am nächsten ist. Dies wird in vielen, vielen Fällen fehlschlagen - Sie können es so verbessern und modifizieren, wie es Ihren Anforderungen entspricht.

Erwartete Ausgabe:

enter image description here

Code:

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