2011-09-30 32 views
8

Tôi muốn viết một tập lệnh nhỏ (chạy trên máy chủ Linux không đầu) đọc PDF, đánh dấu văn bản khớp với bất kỳ thứ gì trong một chuỗi các chuỗi mà tôi chuyển, sau đó lưu PDF đã sửa đổi. Tôi tưởng tượng tôi sẽ kết thúc bằng cách sử dụng một cái gì đó giống như python bindings to poppler nhưng tiếc là có bên cạnh không tài liệu và tôi có bên cạnh không kinh nghiệm trong python.đọc, tô sáng, lưu PDF theo lập trình

Nếu bất kỳ ai cũng có thể chỉ cho tôi một hướng dẫn, ví dụ hoặc một số tài liệu hữu ích để tôi bắt đầu, nó sẽ được đánh giá cao!

+0

Điều này thường không phải là 100% chống lừa đảo, như bất kỳ trình biên dịch PDF nào - thậm chí một trình cũ và đáng tin cậy như pdftex có thể vẽ pdf inline ở mọi nơi ... Bạn có chắc chắn rằng các tệp PDF của mình có thể được đọc theo cách như vậy? – Gleno

+0

Cách tôi nhìn thấy nó, chức năng 'tìm' trong Evince (hoặc hầu hết các trình đọc PDF khác, cho rằng vấn đề) về cơ bản những gì tôi muốn - nó làm nổi bật văn bản phù hợp, về cơ bản bất kỳ PDF nào. Nếu nó có thể làm nổi bật như vậy làm nổi bật màn hình, tại sao không hiển thị nó ra một tập tin? – Jake

+0

Nó chỉ là một chút khó khăn, bởi vì PDF thường không cung cấp dòng văn bản. Nó giống như một hình ảnh - văn bản có thể xuất hiện ở bất cứ đâu. Thông thường nó có vẻ tốt cho người đọc, nhưng nội bộ là một mớ hỗn độn. Để wit - thường là văn bản justification đạt được bằng cách phá vỡ văn bản và chỉ cần đặt inlines để nó xuất hiện hợp lý. Dù sao, khi Evince làm nổi bật một cái gì đó hoặc là được thông minh, PDF của bạn là tốt cư xử hoặc bạn chỉ nhận được may mắn vì chuỗi cụ thể cư trú như là một thực thể liên tục trong PDF. Dù sao, có một cái nhìn tại http://itextpdf.com/ đó là thư viện miễn phí tốt nhất hiện có. – Gleno

Trả lời

3

Bạn đã thử xem PDFMiner chưa? Nghe có vẻ như nó làm những gì bạn muốn.

+3

Từ những gì tôi thu thập, PDFMiner là nhằm vào PDF-> văn bản khai thác kết thúc của sự vật; nó không giống như nó có thể làm nổi bật và làm cho PDF bị thay đổi thành một tệp. – Jake

0

PDFlib có gắn kết Python và hỗ trợ các hoạt động này. Bạn sẽ muốn với PDI nếu bạn muốn mở một tệp PDF. http://www.pdflib.com/products/pdflib-family/pdflib-pdi/ và TET.

Thật không may, nó là một sản phẩm thương mại. Tôi đã sử dụng thư viện này trong sản xuất trong quá khứ và nó hoạt động rất tốt. Các ràng buộc rất chức năng và không phải như vậy Python. Tôi đã thấy một số nỗ lực để làm cho chúng thêm Pythonic: https://github.com/alexhayes/pythonic-pdflib Bạn sẽ muốn sử dụng: open_pdi_document().

Có vẻ như bạn sẽ muốn làm nổi bật tìm kiếm của một số loại:

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

0

Vâng, đó là có thể với sự kết hợp của pdfminer (pip install pdfminer.six) và PyPDF2.

Trước tiên, hãy tìm tọa độ (ví dụ như this). Sau đó tô sáng nó:

#!/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() 
Các vấn đề liên quan