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))
See (https://stackoverflow.com/q/48157194/562769) –