Python + pdfminer + Mysql解析pdf文件的目录结构并保存数据库

直接来点干货

介绍一下大致的实现过程

  • 上传带有目录结构的pdf文件
  • 对目录结构进行解析
  • 解析结果保存到数据库

以下就是具体的实现过程

  • 封装一个类代码如下
class PdfNode(object):
    def __init__(self, name, parent, level, page, top, pk=None):
        self.children = []
        self.name = name
        self.parent = None
        self.top = top
        self.level = level
        self.page = page
        if pk==None:
            self.pk = uuid.uuid4()
        else:
            self.pk = pk

    class Stack:
        def __init__(self):
            self.items = []

        def push(self, o):
            self.items.append(o)

        def pop(self):
            if len(self.items)==0:
                return
            del self.items[-1]

        def top(self):
            if len(self.items)==0:
                return None
            return self.items[-1]


    @classmethod
    def get_outlines(cls,file,password=None):
        stack = PdfNode.Stack()
        rootNode = PdfNode('', None, 0, 1, 0)
        parent = rootNode
        stack.push(parent)
        fp = open(file, 'rb')
        parser = PDFParser(fp)
        # 获取文档大纲
        document = PDFDocument(parser, password)
        # print(document.catalog)
        # 获取文档轮廓
        outlines = document.get_outlines()
        # 获取objid所对应的页码数
        pages = dict((page.pageid, pageno) for (pageno, page) in enumerate(PDFPage.create_pages(document)))
        for (level, title, dest, se, a) in outlines:
            pageno = pages[dest[0].objid]
            top = dest[3]
            page = pageno
            parent = stack.top()
            while parent.level >= level:
                stack.pop()
                parent = stack.top()
            new_node = PdfNode(title, parent, level, page, top)
            stack.push(new_node)
            parent.children.append(new_node)
        # for c in rootNode.children:
        #     print(c.name)
        return rootNode
  • 数据的结构以及功能函数
class FileOutlineUser(MP_Node):
    id = models.UUIDField(primary_key=True,editable=False)
    name = models.CharField('名称',max_length=50)
    isrequirement = models.NullBooleanField('是否是需求向',null=True)
    reason = models.CharField('需求基线的原因',max_length=300,null=True)
    top = models.FloatField('距离页面顶端的距离(单位像素)',null=True)
    page = models.IntegerField('所在页码',null=True)
    requirement_id = models.OneToOneField(RequirementUser,db_column='requirement_id', null=True,on_delete=models.CASCADE)
    def __unicode__(self):
        return '文件轮廓名称: %s' % self.name

    @classmethod
    def insert_dbchildren(cls,parentNode, dbNode):
        for node in parentNode.children:
            newdbNode = dbNode.add_child(id=node.pk, name=node.name, top=node.top, page=node.page)
            newdbNode.save()
            if len(node.children) > 0:
                cls.insert_dbchildren(node, newdbNode)

    @classmethod
    def insert_dbroot(cls, root_node, name,id):
        db_root_node = cls.add_root(pk=root_node.pk, name=name, top=1, page=1,requirement_id_id=id)
        db_root_node.save()
        cls.insert_dbchildren(root_node, db_root_node)

    class Meta:
        db_table = 'FileOutlineUser'
        verbose_name = '文件轮廓信息'
        verbose_name_plural = '文件轮廓信息表'
  • 调用方式
file =  PdfNode.get_outlines("文件路径")
FileOutlineUser.insert_dbroot(file, '', requirementuser.requirement_id)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G东当

您对我的肯定,是我努力的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值