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

objeto Lista o consiste Diccionario objetos pyPdf.pdf.Destination (marcadores), que tiene muchas propiedades, pero no puedo encontrar ningún número de página de referencia de ese marcadorCómo obtener el número de la página de marcador

¿Cómo puedo volver número de página de, digamos o[1] marcador?


Por ejemplo o[1].page.idnum número de devolución que es aproximadamente 3 veces más grande que el número de página que se hace referencia en el documento PDF, que supongo referencias algún objeto más pequeño que la página, como correr .page.idnum sobre todo esquema del documento PDF devuelve conjunto de números que es ni siquiera linealmente correlacionada con destinos de número de página "reales" en el documento PDF y es más o menos múltiple por ~ 3


actualización: esta pregunta es igual a esto: split a pdf based on outline aunque yo no entiendo lo que el autor hizo en su auto responde allí. Me parece demasiado complicado para ser utilizable

+0

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

Respuesta

7

Como @theta señaló "split a pdf based on outline" tiene el código requerido para extraer los números de página. Si sientes que esto es complicado, copié parte del código que mapea los identificadores de página a los números de página y lo convertí en una función. Aquí está un ejemplo de trabajo que imprime el número de página de marcador 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 

probablemente demasiado tarde para @theta pero podría ayudar a los demás :) BTW mi primer post en stackoverflow por lo discúlpame si no seguía la formato habitual

para extender esto más: Si usted está buscando para obtener la ubicación exacta en la página de un marcador que esto hará más fácil su trabajo:

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: Mis marcadores son números de sección (por ejemplo, 1.1 Introducción) y estoy mapeando la información del marcador en el número de sección. Si los marcadores son diferentes modificar esta parte del código: [? ¿Cómo puedo extraer el 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

Nunca es demasiado tarde :) Gracias por el guión que probé y encontré que funciona como se esperaba. – theta

+0

No hay problema, debería agradecerle por el enlace a la otra publicación;). Amplié la solución para extraer también la ubicación del marcador en la página. – vjayky

+0

Objeto 'NumberObject' no tiene atributo 'idnum', ¿por qué estoy obteniendo esto? Estoy usando tu primer conjunto de ejemplos y obtengo el error en "pg_num = pg_id_num_map [o [0] .page.idnum] + 1" Estoy usando PyPDF2 –

Cuestiones relacionadas