2011-09-30 11 views
8

Vorrei scrivere un piccolo script (che verrà eseguito su un server Linux senza testa) che legge un PDF, evidenzia il testo che corrisponde a qualsiasi cosa in una serie di stringhe che passo, quindi salva il PDF modificato. Immagino che finirò per usare qualcosa come lo python bindings to poppler ma sfortunatamente c'è una documentazione prossima a zero e ho un'esperienza prossima a zero in python.leggere, evidenziare, salvare PDF a livello di programmazione

Se qualcuno potesse indicarmi un tutorial, un esempio o qualche documentazione utile per iniziare, sarebbe molto apprezzato!

+0

Questo in genere non è al 100% a prova di stupido, come qualsiasi compilatore PDF - anche un vecchio e fidato uno come pdftex potrebbe disegnare inlines pdf ogni luogo che ... Sei sicuro che i file PDF possono essere letto in questo modo? – Gleno

+0

Il modo in cui lo vedo, la funzione "trova" in Evince (o nella maggior parte degli altri lettori PDF, in pratica) fa sostanzialmente quello che voglio: mette in evidenza il testo abbinato, in pratica qualsiasi PDF. Se può rendere tale evidenziazione sullo schermo, perché non renderlo in un file? – Jake

+0

È solo un po 'complicato, perché il PDF in genere non fornisce il flusso del testo. È più simile a un'immagine: il testo può apparire ovunque. Spesso sembra buono per il lettore, ma è internamente un casino. Per arguzia - spesso la giustificazione del testo si ottiene rompendo il testo e posizionando semplicemente la linea in modo che appaia giustificata. Ad ogni modo, quando Evince evidenzia qualcosa che è intelligente, il tuo PDF è ben educato o sei fortunato perché quella particolare stringa risiede come un'entità continua nel PDF. Comunque, dai un'occhiata a http://itextpdf.com/ è la migliore libreria gratuita là fuori. – Gleno

risposta

3

Hai provato a guardare PDFMiner? Sembra che faccia quello che vuoi.

+3

Da quello che ho raccolto, PDFMiner è finalizzato all'estrazione di testo in PDF-> fine delle cose; non sembra che possa evidenziare e rendere il PDF modificato in un file. – Jake

0

PDFlib ha binding Python e supporta queste operazioni. Avrai bisogno di PDI se si desidera aprire un PDF. http://www.pdflib.com/products/pdflib-family/pdflib-pdi/ e TET.

Sfortunatamente, è un prodotto commerciale. Ho usato questa libreria in produzione in passato e funziona benissimo. I binding sono molto funzionali e non così Python. Ho visto alcuni tentativi di renderli più Pythonic: https://github.com/alexhayes/pythonic-pdflib Si vorrà usare: open_pdi_document().

Sembra che si vuole fare l'evidenziazione della ricerca di qualche tipo:

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

0

Sì, è possibile con una combinazione di pdfminer (pip install pdfminer.six) e PyPDF2.

Innanzitutto, trovare le coordinate (ad esempio this). Poi evidenziarlo:

#!/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() 
Problemi correlati