@theta'nın işaret ettiği gibi "split a pdf based on outline" sayfa numaralarını ayıklamak için gereken kodu içerir. Bunun karmaşık olduğunu düşünüyorsanız, sayfa kimliklerini sayfa numaralarıyla eşleyen kodun bir kısmını kopyaladım ve bir işlev haline getirdim. Çok geç @theta için muhtemelen
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
ama diğerleri ben takip etmedi eğer öyleyse afedersiniz stackoverflow btw benim ilk yazı :) yardımcı olabilir: İşte o [0] iminin sayfa numarasını yazdırır bir çalışma örneğidir Her zamanki biçimi
ayrıca bu uzatmak için: Bu işinizi kolaylaştıracak bir yer imi için sayfadaki tam yerini almak isteyen varsa:
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
Not: Yer imlerim bölüm numaralarıdır (ör: 1.1 Giriş) ve yer imi bilgilerini bölüm numarasına eşleştiriyorum. imlerinizi farklı ise bu kod parçasını değiştirin: [? Ben PyPDF2 ile TOC ayıklamak nasıl]
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) –