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

Lista oggetto o costituito da dizionario oggetti pyPdf.pdf.Destination (segnalibri), che ha molte proprietà, ma non riesco a trovare un numero qualsiasi pagina di riferimento di tale segnalibroCome ottenere il numero di pagina del segnalibro

Come posso tornare numero di pagine, diciamo o[1] segnalibro?


Per esempio o[1].page.idnum numero di rientro che è circa 3 volte più grande di numero di pagina si fa riferimento nel documento PDF, che presumo riferimenti qualche oggetto più piccolo, allora la pagina, come in esecuzione .page.idnum su tutto il contorno documento PDF restituisce serie di numeri che è nemmeno linearmente correlata con destinazioni "reali" numero di pagina nel documento PDF ed è grosso modo multiplo da ~ 3


Aggiornamento: questa domanda è uguale a questo: split a pdf based on outline anche se non capisco ciò che l'autore ha fatto nel suo sé rispondi lì. Sembra troppo complicato per me essere utilizzabile

+0

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

risposta

7

Come sottolineato da @theta "split a pdf based on outline" è necessario il codice per estrarre i numeri di pagina. Se ritieni che questo sia complicato, ho copiato parte del codice che mappa gli ID delle pagine in numeri di pagina e ne ha fatto una funzione. Ecco un esempio di lavoro che consente di stampare il numero di pagina di segnalibro 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 

probabilmente troppo tardi per @theta ma potrebbe aiutare gli altri :) btw il mio primo post su StackOverflow così mi scusi se non ho seguito il consueto formato

per estendere ulteriormente questo: Se stai cercando di ottenere la posizione esatta sulla pagina per un segnalibro questo renderà il vostro lavoro più facile:

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 

Nota: I miei segnalibri sono numeri di sezione (es: 1.1 Introduzione) e sto mappando le informazioni sui segnalibri sul numero di sezione. Se i segnalibri sono diverse modificare questo parte del codice: [? Come posso estrarre il TOC con 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

Non troppo tardi :) Grazie per la sceneggiatura che ho testato e ho scoperto che funziona come previsto. – theta

+0

Nessun problema, dovrei ringraziare il tuo per il collegamento all'altro post;). Ho esteso la soluzione per estrarre anche la posizione del segnalibro sulla pagina. – vjayky

+0

L'oggetto 'NumberObject' non ha attributo 'idnum', nessun motivo per cui sto ottenendo questo? Sto usando il tuo primo esempio e sto ricevendo l'errore su "pg_num = pg_id_num_map [o [0] .page.idnum] + 1" Sto usando PyPDF2 –