2011-09-30 61 views
8

我想編寫一個讀取PDF的小腳本(它將在無頭Linux服務器上運行),突出顯示與我傳遞的字符串數組中的任何內容相匹配的文本,然後保存修改後的PDF。我想我最終會使用類似python bindings to poppler的東西,但不幸的是,接近零的文檔,我有python旁邊的零經驗。閱讀,突出顯示,以編程方式保存PDF

如果有人能指點我一個教程,例子或一些有用的文檔,讓我開始它將不勝感激!

+0

這通常不是100%防呆,因爲任何PDF編譯器 - 即使是老可信賴的人喜歡Pdftex提供可能借鑑PDF內聯每哪個地方...你確定你的PDF可以以這種方式閱讀? – Gleno

+0

我看到它的方式,在Evince(或大多數其他PDF閱讀器)中的'find'函數基本上是我想要的 - 它突出顯示匹配的文本,基本上在任何PDF中。如果它可以在屏幕上呈現這種突出顯示,爲什麼不把它呈現給文件? – Jake

+0

這只是一個有點棘手,因爲PDF通常不提供文本流。它更像一個圖像 - 文本可以出現在任何地方。通常它對讀者來說看起來很不錯,但內部是一團糟。換句話說 - 通常情況下,文本理由是通過分解文本並將內聯放在內部以使其看起來合理。無論如何,當Evince強調它要麼很聰明時,你的PDF表現得很好,或者你很幸運,因爲那個特定的字符串作爲PDF中的一個連續實體存在。無論如何,看看http://itextpdf.com/這是最好的免費圖書館。 – Gleno

回答

3

您是否試過在PDFMiner?這聽起來像是你想要的。

+3

從我收集的,PDFMiner是針對PDF->文本提取結束的事情;它看起來並不像它可以突出顯示並將更改後的PDF渲染到文件中。 – Jake

0

PDFlib具有Python綁定並支持這些操作。如果您想打開PDF,您將需要PDI。 http://www.pdflib.com/products/pdflib-family/pdflib-pdi/和TET。

不幸的是,它是一種商業產品。過去我在製作過程中使用過這個庫,效果很好。綁定功能非常強大,而不是Python。我已經看到一些嘗試使它們變得更加Pythonic:https://github.com/alexhayes/pythonic-pdflib您將要使用:open_pdi_document()。

這聽起來像你會希望做一些搜索高亮:

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

0

是的,這是可能的pdfminer(pip install pdfminer.six)和PyPDF2的組合。

首先找到座標(例如像this)。然後突出顯示:

#!/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() 
相關問題