2011-09-30 18 views
8

Me gustaría escribir un pequeño script (que se ejecutará en un servidor Linux sin cabeza) que lea un PDF, resalte texto que coincida con cualquier cosa en una matriz de cadenas que pase, luego guarda el PDF modificado. Imagino que terminaré usando algo como el python bindings to poppler pero desafortunadamente hay documentación al lado de cero y tengo casi cero experiencia en python.leer, resaltar, guardar PDF programáticamente

Si alguien pudiera indicarme un tutorial, un ejemplo o alguna documentación útil para comenzar, ¡sería muy apreciado!

+0

Esto generalmente no es 100% a prueba de tontos, como cualquier compilador PDF - incluso un viejo y fiel uno como pdftex podría dibujar inlines pdf cada cual su lugar ... ¿Estás seguro de que sus archivos PDF se ser leído de tal manera? – Gleno

+0

La forma en que lo veo, la función 'buscar' en Evince (o en la mayoría de los otros lectores de PDF, para el caso) básicamente hace lo que quiero: resalta el texto combinado, básicamente en cualquier PDF. Si puede mostrar tal resalte en la pantalla, ¿por qué no renderizarlo en un archivo? – Jake

+0

Es un poco complicado, porque PDF generalmente no proporciona flujo de texto. Es más como una imagen: el texto puede aparecer en cualquier lugar. A menudo, se ve bien para el lector, pero internamente es un desastre. A saber: a menudo la justificación del texto se logra al dividir el texto y simplemente colocar líneas para que parezca justificado. De todos modos, cuando Evince resalta algo, o bien está siendo inteligente, su PDF se comporta bien o simplemente tiene suerte porque esa cadena en particular reside como una entidad continua en el PDF. De todos modos, eche un vistazo a http://itextpdf.com/ y es la mejor biblioteca gratuita que hay. – Gleno

Respuesta

3

¿Has probado mirar PDFMiner? Parece que hace lo que quieres.

+3

Según lo que veo, PDFMiner está dirigido hacia el final de la extracción de texto PDF->; no parece que pueda resaltar y renderizar el PDF alterado a un archivo. – Jake

0

PDFlib tiene enlaces Python y admite estas operaciones. Lo deseará con PDI si desea abrir un PDF. http://www.pdflib.com/products/pdflib-family/pdflib-pdi/ y TET.

Lamentablemente, es un producto comercial. He usado esta biblioteca en producción en el pasado y funciona muy bien. Los enlaces son muy funcionales y no tan Python. He visto algunos intentos para hacerlos más Pythonic: https://github.com/alexhayes/pythonic-pdflib Te conviene usar: open_pdi_document().

Parece que usted querrá hacer resaltado busca de algún tipo:

http://www.pdflib.com/tet-cookbook/tet-and-pdflib/highlight-search-terms/

0

Sí, es posible con una combinación de pdfminer (pip install pdfminer.six) y PyPDF2.

Primero, busque las coordenadas (por ejemplo, como this). Entonces resaltarlo:

#!/usr/bin/env python 

"""Create sample highlight in a PDF file.""" 

from PyPDF2 import PdfFileWriter, PdfFileReader 

from PyPDF2.generic import (
    DictionaryObject, 
    NumberObject, 
    FloatObject, 
    NameObject, 
    TextStringObject, 
    ArrayObject 
) 


def create_highlight(x1, y1, x2, y2, meta, color=[0, 1, 0]): 
    """ 
    Create a highlight for a PDF. 

    Parameters 
    ---------- 
    x1, y1 : float 
     bottom left corner 
    x2, y2 : float 
     top right corner 
    meta : dict 
     keys are "author" and "contents" 
    color : iterable 
     Three elements, (r,g,b) 
    """ 
    new_highlight = DictionaryObject() 

    new_highlight.update({ 
     NameObject("/F"): NumberObject(4), 
     NameObject("/Type"): NameObject("/Annot"), 
     NameObject("/Subtype"): NameObject("/Highlight"), 

     NameObject("/T"): TextStringObject(meta["author"]), 
     NameObject("/Contents"): TextStringObject(meta["contents"]), 

     NameObject("/C"): ArrayObject([FloatObject(c) for c in color]), 
     NameObject("/Rect"): ArrayObject([ 
      FloatObject(x1), 
      FloatObject(y1), 
      FloatObject(x2), 
      FloatObject(y2) 
     ]), 
     NameObject("/QuadPoints"): ArrayObject([ 
      FloatObject(x1), 
      FloatObject(y2), 
      FloatObject(x2), 
      FloatObject(y2), 
      FloatObject(x1), 
      FloatObject(y1), 
      FloatObject(x2), 
      FloatObject(y1) 
     ]), 
    }) 

    return new_highlight 


def add_highlight_to_page(highlight, page, output): 
    """ 
    Add a highlight to a PDF page. 

    Parameters 
    ---------- 
    highlight : Highlight object 
    page : PDF page object 
    output : PdfFileWriter object 
    """ 
    highlight_ref = output._addObject(highlight) 

    if "/Annots" in page: 
     page[NameObject("/Annots")].append(highlight_ref) 
    else: 
     page[NameObject("/Annots")] = ArrayObject([highlight_ref]) 


def main(): 
    pdf_input = PdfFileReader(open("samples/test3.pdf", "rb")) 
    pdf_output = PdfFileWriter() 

    page1 = pdf_input.getPage(0) 

    highlight = create_highlight(89.9206, 573.1283, 376.849, 591.3563, { 
     "author": "John Doe", 
     "contents": "Lorem ipsum" 
    }) 

    add_highlight_to_page(highlight, page1, pdf_output) 

    pdf_output.addPage(page1) 

    output_stream = open("output.pdf", "wb") 
    pdf_output.write(output_stream) 


if __name__ == '__main__': 
    main() 
Cuestiones relacionadas