2014-10-08 3 views
1

У меня есть куча форм PDF, созданных с помощью Adobe formscentral - все они отформатированы одинаково, и я хочу извлечь данные в полях в файл CSV. Я (получаю) немного знакомый с python и попробовал несколько библиотек, чтобы извлечь текст через теги XML. Я дошел до того, что я вышел из своей глубины :(pdf форма для csv python или аналогичная

Мне удалось прочитать PDF-файл с помощью «pdfquery» и/или «beautifulsoup», но не может найти простой учебник в любом месте чтобы помочь разобрать pdf-файл в формате csv/excel.Я искал SO и не могу найти ничего общего. Дерево XML, которое мне удалось извлечь, дает мне теги для имен полей (см. ниже), но не уверен, как действовать дальше. кто-нибудь имел никакого опыта такого рода операции или в состоянии указать мне в направлении каких-либо учебных пособий.

Любая помощь с благодарностью получил!

Благодаря

Marty

<pdfxml ModDate="D:20140414114502+03'00'" CreationDate="D:20140407143830-04'00'" Producer="Adobe FormsCentral 889953 S" Creator="Adobe FormsCentral 738134"> 
    <LTPage bbox="[0, 0, 595.27, 841.89]" height="841.89" pageid="1" rotate="0" width="595.27" x0="0" x1="595.27" y0="0" y1="841.89" page_index="0" page_label=""> 
    <LTRect bbox="[0.0, 0.0, 595.27, 841.89]" height="841.89" linewidth="0" pts="[[0.0, 0.0], [595.27, 0.0], [595.27, 841.89], [0.0, 841.89]]" width="595.27" x0="0.0" x1="595.27" y0="0.0" y1="841.89"> 
     <LTTextLineHorizontal bbox="[34.015, 732.217, 133.831, 745.798]" height="13.582" width="99.816" word_margin="0.1" x0="34.015" x1="133.831" y0="732.217" y1="745.798"><LTTextBoxHorizontal bbox="[34.015, 732.217, 133.831, 745.798]" height="13.582" index="1" width="99.816" x0="34.015" x1="133.831" y0="732.217" y1="745.798">Name of organisation: </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextLineHorizontal bbox="[34.015, 707.554, 128.739, 721.135]" height="13.582" width="94.724" word_margin="0.1" x0="34.015" x1="128.739" y0="707.554" y1="721.135"><LTTextBoxHorizontal bbox="[34.015, 707.554, 128.739, 721.135]" height="13.582" index="2" width="94.724" x0="34.015" x1="128.739" y0="707.554" y1="721.135">Type of organisation: </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 631.024, 136.667, 657.37]" height="26.347" index="3" width="102.642" x0="34.025" x1="136.667" y0="631.024" y1="657.37"><LTTextLineHorizontal bbox="[34.025, 643.789, 136.667, 657.37]" height="13.582" width="102.642" word_margin="0.1" x0="34.025" x1="136.667" y0="643.789" y1="657.37">Number of employees/ </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 631.024, 112.269, 645.166]" height="14.143" width="78.244" word_margin="0.1" x0="34.025" x1="112.269" y0="631.024" y1="645.166">members (male): </LTTextLineHorizontal></LTTextBoxHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 581.871, 136.667, 620.462]" height="38.592" index="4" width="102.642" x0="34.025" x1="136.667" y0="581.871" y1="620.462"><LTTextLineHorizontal bbox="[34.025, 606.881, 136.667, 620.462]" height="13.582" width="102.642" word_margin="0.1" x0="34.025" x1="136.667" y0="606.881" y1="620.462">Number of employees/ </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 594.116, 134.963, 608.259]" height="14.143" width="100.938" word_margin="0.1" x0="34.025" x1="134.963" y0="594.116" y1="608.259">members aged 18-35 </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 581.871, 64.076, 596.014]" height="14.143" width="30.051" word_margin="0.1" x0="34.025" x1="64.076" y0="581.871" y1="596.014">(male) </LTTextLineHorizontal></LTTextBoxHorizontal> 
     <LTTextLineHorizontal bbox="[34.025, 557.728, 112.861, 571.31]" height="13.582" width="78.836" word_margin="0.1" x0="34.025" x1="112.861" y0="557.728" y1="571.31"><LTTextBoxHorizontal bbox="[34.025, 557.728, 112.861, 571.31]" height="13.582" index="5" width="78.836" x0="34.025" x1="112.861" y0="557.728" y1="571.31">Location/Address </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 494.974, 138.371, 533.045]" height="38.071" index="6" width="104.346" x0="34.025" x1="138.371" y0="494.974" y1="533.045"><LTTextLineHorizontal bbox="[34.025, 519.463, 99.821, 533.045]" height="13.582" width="65.795" word_margin="0.1" x0="34.025" x1="99.821" y0="519.463" y1="533.045">Type of waste </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 507.218, 138.371, 520.8]" height="13.582" width="104.346" word_margin="0.1" x0="34.025" x1="138.371" y0="507.218" y1="520.8">management activities </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 494.974, 85.066, 508.555]" height="13.582" width="51.04" word_margin="0.1" x0="34.025" x1="85.066" y0="494.974" y1="508.555">carried out: </LTTextLineHorizontal></LTTextBoxHorizontal> 

ответ

0

Я предпочитаю использовать lxml package, как это имеет очень удобную объективизацию модуль, который делает разбор XML довольно тривиально.

Вот пример, который показывает несколько способов извлечения данных из XML:

from lxml import objectify 

#---------------------------------------------------------------------- 
def parser(xml): 
    """""" 
    root = objectify.fromstring(xml) 
    print root.LTPage.LTRect.attrib 
    for item in root.LTPage.LTRect.getchildren(): 
     print item.tag 
     print item.text 
     print item.attrib 
     print item.attrib["bbox"] 

if __name__ == "__main__": 
    xml = """<pdfxml ModDate="D:20140414114502+03'00'" CreationDate="D:20140407143830-04'00'" Producer="Adobe FormsCentral 889953 S" Creator="Adobe FormsCentral 738134"> 
    <LTPage bbox="[0, 0, 595.27, 841.89]" height="841.89" pageid="1" rotate="0" width="595.27" x0="0" x1="595.27" y0="0" y1="841.89" page_index="0" page_label=""> 
    <LTRect bbox="[0.0, 0.0, 595.27, 841.89]" height="841.89" linewidth="0" pts="[[0.0, 0.0], [595.27, 0.0], [595.27, 841.89], [0.0, 841.89]]" width="595.27" x0="0.0" x1="595.27" y0="0.0" y1="841.89"> 
     <LTTextLineHorizontal bbox="[34.015, 732.217, 133.831, 745.798]" height="13.582" width="99.816" word_margin="0.1" x0="34.015" x1="133.831" y0="732.217" y1="745.798"><LTTextBoxHorizontal bbox="[34.015, 732.217, 133.831, 745.798]" height="13.582" index="1" width="99.816" x0="34.015" x1="133.831" y0="732.217" y1="745.798">Name of organisation: </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextLineHorizontal bbox="[34.015, 707.554, 128.739, 721.135]" height="13.582" width="94.724" word_margin="0.1" x0="34.015" x1="128.739" y0="707.554" y1="721.135"><LTTextBoxHorizontal bbox="[34.015, 707.554, 128.739, 721.135]" height="13.582" index="2" width="94.724" x0="34.015" x1="128.739" y0="707.554" y1="721.135">Type of organisation: </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 631.024, 136.667, 657.37]" height="26.347" index="3" width="102.642" x0="34.025" x1="136.667" y0="631.024" y1="657.37"><LTTextLineHorizontal bbox="[34.025, 643.789, 136.667, 657.37]" height="13.582" width="102.642" word_margin="0.1" x0="34.025" x1="136.667" y0="643.789" y1="657.37">Number of employees/ </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 631.024, 112.269, 645.166]" height="14.143" width="78.244" word_margin="0.1" x0="34.025" x1="112.269" y0="631.024" y1="645.166">members (male): </LTTextLineHorizontal></LTTextBoxHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 581.871, 136.667, 620.462]" height="38.592" index="4" width="102.642" x0="34.025" x1="136.667" y0="581.871" y1="620.462"><LTTextLineHorizontal bbox="[34.025, 606.881, 136.667, 620.462]" height="13.582" width="102.642" word_margin="0.1" x0="34.025" x1="136.667" y0="606.881" y1="620.462">Number of employees/ </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 594.116, 134.963, 608.259]" height="14.143" width="100.938" word_margin="0.1" x0="34.025" x1="134.963" y0="594.116" y1="608.259">members aged 18-35 </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 581.871, 64.076, 596.014]" height="14.143" width="30.051" word_margin="0.1" x0="34.025" x1="64.076" y0="581.871" y1="596.014">(male) </LTTextLineHorizontal></LTTextBoxHorizontal> 
     <LTTextLineHorizontal bbox="[34.025, 557.728, 112.861, 571.31]" height="13.582" width="78.836" word_margin="0.1" x0="34.025" x1="112.861" y0="557.728" y1="571.31"><LTTextBoxHorizontal bbox="[34.025, 557.728, 112.861, 571.31]" height="13.582" index="5" width="78.836" x0="34.025" x1="112.861" y0="557.728" y1="571.31">Location/Address </LTTextBoxHorizontal></LTTextLineHorizontal> 
     <LTTextBoxHorizontal bbox="[34.025, 494.974, 138.371, 533.045]" height="38.071" index="6" width="104.346" x0="34.025" x1="138.371" y0="494.974" y1="533.045"><LTTextLineHorizontal bbox="[34.025, 519.463, 99.821, 533.045]" height="13.582" width="65.795" word_margin="0.1" x0="34.025" x1="99.821" y0="519.463" y1="533.045">Type of waste </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 507.218, 138.371, 520.8]" height="13.582" width="104.346" word_margin="0.1" x0="34.025" x1="138.371" y0="507.218" y1="520.8">management activities </LTTextLineHorizontal><LTTextLineHorizontal bbox="[34.025, 494.974, 85.066, 508.555]" height="13.582" width="51.04" word_margin="0.1" x0="34.025" x1="85.066" y0="494.974" y1="508.555">carried out: </LTTextLineHorizontal></LTTextBoxHorizontal> 
    </LTRect> 
    </LTPage> 
    </pdfxml> 
     """ 
    parser(xml) 

Обратите внимание, что я изменил XML, чтобы иметь соответствующие тег концовки. Вы можете также найти этот учебник полезным:

Смежные вопросы