Преобразование оглавления PDF в XML - PullRequest
0 голосов
/ 08 ноября 2018

Я учусь кодировать на python. Для начала я приступил к упражнению, чтобы преобразовать ток PDF в XML.Упражнение оказалось сложнее, чем я себе представлял.Вот мой код:

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pathlib import Path
from xml.etree.ElementTree import Element, SubElement
from xml.etree import ElementTree
from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="  ")

pdfDoc = Path(r'<path of the pdf document>')
fp = open(pdfDoc, 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)

outlines = doc.get_outlines()
docLevel = 0
previouslevel = 0
docLevelList = dict()
prevCh = ""
xDoc = Element("root")
for (level, title, dest, a, se) in outlines:
    if title == "Contents":
        pass
    else:
        currCh = title.split(" ",1)[0]

        if len(docLevelList) == 0 and  level == 1:
            docLevelList["ch_"+currCh] = "root"
            previouslevel = level
            prevCh = currCh
            child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
            child.text = title.split(" ",1)[1]

        elif len(docLevelList) != 0 and level == 1 and level < previouslevel:
            docLevelList["ch_"+currCh] = "root"
            previouslevel = level
            prevCh = currCh
            child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
            child.text = title.split(" ",1)[1]

        elif len(docLevelList) != 0 and level == 1 and int(currCh) == int (prevCh) + 1:
            docLevelList["ch_"+currCh] = "root"
            previouslevel = level
            prevCh = currCh
            child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
            child.text = title.split(" ",1)[1]
            #print(docLevelList, previouslevel, prevCh)

        elif len(docLevelList) != 0 and level > previouslevel and prevCh in currCh:
            docLevelList["ch_"+currCh] = "ch_"+prevCh
            previouslevel = level
            prevCh = currCh
            child = SubElement(docLevelList.get(sorted(docLevelList.keys())[-1]), sorted(docLevelList.keys())[-1])
            child.text = title.split(" ",1)[1]

        elif len(docLevelList) != 0 and level == previouslevel and int(prevCh[-1]) + 1 == int(currCh[-1]):
            docLevelList["ch_"+currCh] = docLevelList.get("ch_"+prevCh)
            #docLevelList["ch_"+currCh] = list(docLevelList.keys())[list(docLevelList.values()).index("ch_"+prevCh)]
            previouslevel = level
            prevCh = currCh
            child = SubElement(docLevelList.get(sorted(docLevelList.keys())[-1]), sorted(docLevelList.keys())[-1])
            child.text = title.split(" ",1)[1]

print (prettify(xDoc))

Бит docLevelList.get (sorted (docLevelList.keys ()) [- 1]) в вызове SubElement создает ошибку TypeError.

Из сообщения об ошибке я узнал, что родитель должен быть элементом элемента, но у меня закончились идеи.Помогите!!!Кроме того, любые другие предложения по улучшению приветствуются.Пожалуйста, извините за жалкий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...