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

Danh sách đối tượng o bao gồm từ điển đối tượng pyPdf.pdf.Destination (bookmark), trong đó có nhiều tài sản, nhưng tôi không thể tìm thấy bất kỳ số trang giới thiệu về điều đó bookmarkLàm thế nào để có được số trang bookmark của

Làm thế nào tôi có thể trở lại số trang, giả sử o[1] dấu trang?


Ví dụ o[1].page.idnum số lợi nhuận xấp xỉ lớn hơn số trang được tham chiếu trong tài liệu PDF, mà tôi cho rằng tài liệu tham khảo một số đối tượng nhỏ hơn sau đó trang 3 lần, như chạy .page.idnum trên toàn bộ đề cương tài liệu PDF trả về mảng các số đó là thậm chí không tuyến tính tương quan với "thực" khu số trang trong tài liệu PDF và đó là khoảng nhiều bởi ~ 3


cập nhật: câu hỏi này là tương tự như thế này: split a pdf based on outline mặc dù tôi không hiểu những gì tác giả đã tự mình trả lời ở đó. Dường như quá phức tạp để tôi có thể sử dụng được

+0

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

Trả lời

7

Khi @theta chỉ ra "split a pdf based on outline" có mã cần thiết để trích xuất số trang. Nếu bạn cảm thấy điều này phức tạp, tôi đã sao chép một phần của mã để ánh xạ các id trang tới các số trang và biến nó thành một hàm. Dưới đây là một ví dụ làm việc đó in số trang của bookmark 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 

lẽ quá muộn cho @theta nhưng có thể giúp đỡ người khác :) btw bài viết đầu tiên của tôi trên stackoverflow rất xin lỗi nếu tôi không làm theo định dạng thông thường

để mở rộng này thêm: Nếu bạn đang tìm kiếm để có được vị trí chính xác trên trang cho một bookmark này sẽ làm cho công việc của bạn dễ dàng hơn:

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 

Lưu ý: Dấu trang của tôi là số phần (ví dụ: 1.1 Giới thiệu) và tôi đang ánh xạ thông tin dấu trang đến số phần. Nếu bookmark của bạn khác sửa đổi này là một phần của mã này: [? Làm thế nào tôi có thể trích xuất các TOC với PyPDF2]

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

Không bao giờ quá muộn :) Cảm ơn kịch bản mà tôi đã kiểm tra và thấy rằng nó hoạt động như mong đợi. – theta

+0

Không sao cả, tôi nên cảm ơn liên kết của bạn đến bài đăng khác;). Tôi đã mở rộng giải pháp để trích xuất vị trí của dấu trang trên trang. – vjayky

+0

Đối tượng 'NumberObject' không có thuộc tính 'idnum', bất kỳ lý do gì khiến tôi nhận được điều này? Tôi đang sử dụng bộ ví dụ đầu tiên của bạn và tôi gặp lỗi trên "pg_num = pg_id_num_map [o [0] .page.idnum] + 1" Tôi đang sử dụng PyPDF2 –

Các vấn đề liên quan