加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何获取书签的页码

发布时间:2020-12-16 22:59:18 所属栏目:Python 来源:网络整理
导读:from pyPdf import PdfFileReaderf = open('document.pdf','rb')p = PdfFileReader(f)o = p.getOutlines() 列表对象o由字典对象pyPdf.pdf.Destination(书签)组成,它有许多属性,但我找不到该书签的任何引用页码 如何返回页码,让我们说o [1]书签? 例如o [1] .
from pyPdf import PdfFileReader
f = open('document.pdf','rb')
p = PdfFileReader(f)
o = p.getOutlines()

列表对象o由字典对象pyPdf.pdf.Destination(书签)组成,它有许多属性,但我找不到该书签的任何引用页码

如何返回页码,让我们说o [1]书签?

例如o [1] .page.idnum返回数字大约是PDF文档中引用页面数量的3倍,我假设引用一些小于页面的对象,因为在整个PDF文档大纲上运行.page.idnum返回数组与PDF文档中的“真实”页码目的地甚至不是线性相关的数字,它大约是~3的倍数

更新:这个问题与此相同:split a pdf based on outline虽然我不明白作者在那里的自我答案中做了什么.对我来说似乎太复杂了

解决方法

正如@theta指出的那样,“ split a pdf based on outline”具有提取页码所需的代码.如果您觉得这很复杂,我会复制部分代码,将页面ID映射到页码并使其成为一个函数.这是打印书签o [0]的页码的工作示例:
from pyPdf import PdfFileReader
def _setup_page_id_to_num(pdf,pages=None,_result=None,_num_pages=None):
    if _result is None:
        _result = {}
    if pages is None:
        _num_pages = []
        pages = pdf.trailer["/Root"].getObject()["/Pages"].getObject()
    t = pages["/Type"]
    if t == "/Pages":
        for page in pages["/Kids"]:
            _result[page.idnum] = len(_num_pages)
            _setup_page_id_to_num(pdf,page.getObject(),_result,_num_pages)
    elif t == "/Page":
        _num_pages.append(1)
    return _result
# main
f = open('document.pdf','rb')
p = PdfFileReader(f)
# map page ids to page numbers
pg_id_num_map = _setup_page_id_to_num(p)
o = p.getOutlines()
pg_num = pg_id_num_map[o[0].page.idnum] + 1
print pg_num

@theta可能为时已晚,但可能会帮助其他人:)顺便说一下我在stackoverflow上发表的第一篇文章,请原谅我,如果我没有遵循通常的格式

进一步扩展:
如果您希望在页面上获取书签的确切位置,这将使您的工作更轻松:

from pyPdf import PdfFileReader
import pyPdf
def _setup_page_id_to_num(pdf,_num_pages)
    elif t == "/Page":
        _num_pages.append(1)
    return _result
def outlines_pg_zoom_info(outlines,pg_id_num_map,result=None):
    if result is None:
        result = dict()
    if type(outlines) == list:
        for outline in outlines:
            result = outlines_pg_zoom_info(outline,result)
    elif type(outlines) == pyPdf.pdf.Destination:
        title = outlines['/Title']
        result[title.split()[0]] = dict(title=outlines['/Title'],top=outlines['/Top'],
        left=outlines['/Left'],page=(pg_id_num_map[outlines.page.idnum]+1))
    return result

# main
pdf_name = 'document.pdf'
f = open(pdf_name,'rb')
pdf = PdfFileReader(f)
# map page ids to page numbers
pg_id_num_map = _setup_page_id_to_num(pdf)
outlines = pdf.getOutlines()
bookmarks_info = outlines_pg_zoom_info(outlines,pg_id_num_map)
print bookmarks_info

注意:我的书签是章节编号(例如:1.1简介),我将书签信息映射到章节编号.如果您的书签不同,请修改以下代码:

elif type(outlines) == pyPdf.pdf.Destination:
        title = outlines['/Title']
        result[title.split()[0]] = dict(title=outlines['/Title'],page=(pg_id_num_map[outlines.page.idnum]+1))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读