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

pyPdf.pdf.Destination (imlerini) nesneleri almak için, amabirçok özelliğe sahiptir iminin sayfa numarası Liste nesnesi <code>o</code> Sözlük oluşur

nasıl dönebilirsiniz imi hiçbirini yönlendiren sayfa numarasını bulamıyorum nasıl sayfa numarası, diyelim ki o[1] yer imi?


Örneğin bütün PDF belgesi taslağı üzerinde .page.idnum çalışan olarak, yaklaşık bir sayfa sonra bazı nesne küçük referanslar varsayalım PDF belgesinde başvurulan sayfa numarası, yaklaşık 3 katı büyüklüğünde olan o[1].page.idnum dönüş sayıdır sayılar dizisini döndürür hatta doğrusal PDF belgesinde "gerçek" sayfa numarası yerlerinden ile ilişkili ve ~ 3


Update tarafından kabaca birden var: Bu soru, bu aynıdır: anlamıyorum split a pdf based on outline rağmen onun kendine yaptıklarını yazar oraya cevap ver. Kullanılabilir olması için çok karmaşık görünüyor

+0

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

cevap

7

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

Asla çok geç :) Test ettiğim ve beklediğim gibi çalıştığını bulduğum script için teşekkürler. – theta

+0

Sorun değil, diğer gönderiye bağlantı için teşekkür etmeliyim;). Çözümün sayfadaki yer imini de çıkarmak için çözümü uzattım. – vjayky

+0

'NumberObject' nesnesinin 'idnum' özelliği yok, neden bunu alıyorum? İlk örnek kümenizi kullanıyorum ve numaralı hatayı alıyorum "pg_num = pg_id_num_map [o [0] .sayfa.idnum] + 1" PyPDF2 kullanıyorum –

İlgili konular