2009-08-21 161 views

答えて

5

「違い」とはどういう意味ですか? PDFのテキストの違いやレイアウトの変更(埋め込みグラフィックのサイズが変更されたなど)。最初は検出が容易で、2番目は取得するのがほとんど不可能です(PDFは非常に複雑なファイル形式であり、無限のファイルフォーマット機能を提供します)。

テキスト差分を取得したい場合は、2つのPDFのpdf to textユーティリティを実行し、Pythonの組み込みdiffライブラリを使用して、変換されたテキストの差分を取得します。

この質問は、PDFとテキスト変換をPython:Python module for converting PDF to textで扱っています。

この方法の信頼性は、使用しているPDF Generatorによって異なります。たとえば、 Adobe AcrobatといくつかのGhostscriptベースのPDF-Creatorを使用してSAMEワードドキュメントから2つのPDFを作成すると、元のドキュメントは同じですが、まだ差分が得られることがあります。

これは、ソース文書の情報をPDFにエンコードする方法が数多くあり、各コンバータが異なるアプローチを使用しているためです。多くの場合、pdfからテキストへの変換では、特に複雑なレイアウトやテーブルでは正しいテキストフローがわかりません。

+0

テキストだけが行います。 pdfジェネレータは問題ではありません。 – Goutham

+0

イメージをサポートする必要がある場合は、pdfからJPGを抽出することができます。http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.htmlまたはpdfをイメージに変換して比較することができます。 –

0

チェックこれを、それが役立つことができます:http://pybrary.net/pyPdf/

+0

pyPdfは私のテストであまり強くなかった。Illustrator/InDesignやその他のベクター描画プログラムで作成されたpdfsでクラッシュしました。ただし、Officeアプリからの簡単なPDFの場合は問題ありません。はるかに堅実な選択肢は、xpdfツールキットのpdftotextです。 – fbuchinger

3

私はあなたのユースケースを知らないが、ReportLabのを使用してPDFを生成するスクリプトの回帰テストのために、私は変換

  1. によって差分PDFを行いますPIL

などを使用して、標準のPDFのページ画像に対して、各ページに相違取得ghostsript

  • を使用して、画像に各ページ

    im1 = Image.open(imagePath1) 
    im2 = Image.open(imagePath2) 
    
    imDiff = ImageChops.difference(im1, im2) 
    

    私のケースでは、これはコード変更のために導入された変更をフラグするために機能します。

  • +0

    あなたのステップ#1の参考資料はありますか? – yucer

    2

    暗号化されたpdf unittestと同じ質問にお答えいただきましたが、pdfminerもpyPdfもうまく動作しません。

    ここでは、2つのコマンド(pdftocairo、pdftotext)がテストに最適です。 (Ubuntuのインストール:のpoppler-utilsのインストールapt-getの)

    あなたがしてPDFコンテンツを取得することができます。

    from subprocess import Popen, PIPE 
    
    def get_formatted_content(pdf_content): 
        cmd = 'pdftocairo -pdf - -' # you can replace "pdftocairo -pdf" with "pdftotext" if you want to get diff info 
        ps = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
        stdout, stderr = ps.communicate(input=pdf_content) 
        if ps.returncode != 0: 
         raise OSError(ps.returncode, cmd, stderr) 
        return stdout 
    

    はpdftocairo PDFファイルを再描画することができ、pdftotextは、すべてのテキストを抽出することができそうです。

    そして、あなたが比較できる2つのPDFファイル:

    c1 = get_formatted_content(open('f1.pdf').read()) 
    c2 = get_formatted_content(open('f2.pdf').read()) 
    print(cmp(c1, c2)) # for binary compare 
    # import difflib 
    # print(list(difflib.unified_diff(c1, c2))) # for text compare 
    
    関連する問題