2011-11-30 74 views
5
from pyPdf import PdfFileReader 
f = open('document.pdf', 'rb') 
p = PdfFileReader(f) 
o = p.getOutlines() 

List對象o包括字典的對象pyPdf.pdf.Destination(書籤),其中有許多屬性,但我找不到任何引用的頁面數量書籤如何獲得書籤的頁面數

我怎樣才能返回頁數,比方說o[1]書籤?


例如o[1].page.idnum大約比PDF文檔中引用頁碼,我以爲引用較小的一些對象,然後一頁中的3次,作爲整個PDF文檔大綱運行.page.idnum回數返回數字的排列是甚至不是線性PDF文檔中的「真實」的頁面數量的目的地相關,它是由〜3


更新大約多:這個問題是一樣的:split a pdf based on outline雖然我不明白他自做了什麼作家在那裏回答。似乎對我來說太複雜了

+0

見(https://stackoverflow.com/q/48157194/562769) –

回答

7

由於@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但可能幫助別人:)順便說一句我的計算器上的第一篇文章所以原諒我,如果我沒有按照通常格式

爲了進一步擴展這個: 如果你正在尋找讓頁面上的確切位置的書籤,這將讓你的工作更輕鬆:

from pyPdf import PdfFileReader 
import pyPdf 
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 
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, pg_id_num_map, 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簡介),我將書籤信息映射到章節號。如果您的書籤是不同的修改這部分代碼:[?我怎樣才能提取與PyPDF2的TOC]

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)) 
+0

永遠不會太晚:)感謝我測試的腳本,並發現它按預期工作。 – theta

+0

沒問題,我應該感謝你的鏈接到其他職位;)。我將解決方案擴展到了頁面上提取書籤的位置。 – vjayky

+0

'NumberObject'對象沒有屬性'idnum',任何我得到這個結果的原因?我正在使用你的第一個例子集,我得到的錯誤 「pg_num = pg_id_num_map [o [0] .page.idnum] + 1」我正在使用PyPDF2 –