2011-09-30 2 views
8

私は、PDFを読み込んで、パスした文字列の配列に一致するテキストをハイライト表示する小さなスクリプト(ヘッドレスLinuxサーバで動作する)を書いて、変更されたPDF私はpython bindings to popplerのようなものを使ってしまうだろうと思っていますが、残念ながらゼロのドキュメントの次にあり、私はPythonでゼロに近い経験があります。PDFを読んだり、ハイライトしたり、プログラムでPDFを保存したりする

誰かが私にチュートリアル、例、または役に立つマニュアルを教えてくれたら、それを始めるには非常に感謝しています。

+0

これは、任意のPDFコンパイラとして、一般的ではない100%のフールプルーフである - 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() 
関連する問題