2017-07-17 47 views
0

PDFからテキストを編集するためのPythonスクリプトを作成しています。Pythonを使用してPDFからテキストを消去する方法

私はPDFファイルの特定の位置にテキストを追加することができるこのPythonコードを持っています。

import PyPDF2 
import io 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 
import sys 

packet = io.BytesIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
# Insert code into specific position 
can.drawString(300, 115, "Hello world") 
can.save() 
#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PyPDF2.PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PyPDF2.PdfFileReader(open("original.pdf", "rb")) 
num_pages = existing_pdf.numPages 
output = PyPDF2.PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(num_pages-1) # get the last page of the original pdf 
page.mergePage(new_pdf.getPage(0)) # merges my created text with my PDF. 
x = existing_pdf.getNumPages() 
#add all pages from original pdf into output pdf 
for n in range(x): 
    output.addPage(existing_pdf.getPage(n)) 
# finally, write "output" to a real file 
outputStream = open("output.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

私の問題:私は私のカスタムテキストと私の元のPDFの特定の位置にテキストを置き換えたいです。空白の文字を書く方法ではこのトリックができますが、これを行うことはできません。

PS:私は後で.EXEファイルとしてこれを配置する必要がありますし、私はPythonのコードを使用していることを行う方法を知っているので、これは、Pythonコードでなければなりません。

答えて

1

PDF内のテキストを置き換える汎用アルゴリズムは、難しい問題です。私はAdobe PDFライブラリを使って非常に単純な入力ファイルを作成しても合併症がないことを実証しているので、これまで実行できないと言っているわけではありませんが、pyPDF2に必要な機能があるかどうかはわかりませんそう。部分的には、テキストを見つけることは難しいことです。

あなた(またはより現実的にはあなたのPDFライブラリ)は、ページの内容を解析してグラフィック状態の変更を追跡しなければなりません。具体的には、テキストがフォームXObjectにある場合は現在の変換マトリックス、変換行列、およびフォントの変更。フォントリソースを使用して文字幅を取得し、文字列を挿入した後にテキストカーソルの位置を特定する必要があります。フォントリソースにその情報を含まない標準14フォントを処理する必要があるかもしれません(アプリケーション - あなたのプログラムはメトリクスを知ることが期待されます)

結局のところ、テキストを削除するのは簡単ですTjやTJ(テキスト表示)命令を別の部分に分割する必要がありません。テキストがシフトしないようにするには、それが望ましい場合は、新しいTm命令を挿入して、テキストの位置を後ろに変える必要があります。

新しいテキストを挿入するのは難しいことがあります。使用されているフォントと一貫性を保つために、埋め込まれ、サブセットされている場合は、テキストの挿入に必要なグリフが必ずしも含まれているとは限りません。挿入後、挿入したテキストの後ろにあるテキストをリフローする必要があるかどうかを判断する必要があります。

最後に、すべての変更を保存するにはPDFライブラリが必要です。率直に言って、Adobe AcrobatのRedaction機能を使うことは、これを最初からプログラムしようとするよりも安価でコスト効率の良い方法になるでしょう。

+0

私はreportlabを使ってテキストの位置を見つけました。私はそのライブラリを使用したいと思ったものを書きました。私が追加したいテキストは常に同じ位置にあり、タスクをfscilitatesします。私の問題を解決する方法は、reportlabマージ機能を使用してテキストを空白に置き換える方法ですが、私はその方法を知らない –

+0

PyPDF2を使って新しいコンテンツを作成するために使用できるReportlabを混乱させています。既存のPDFを操作するPyPDF2のドキュメントをよく読んでから、既存のコンテンツを削除することはできませんが、その位置にテキストを追加する前に、白い塗りのパスで隠すことができるかもしれません。このルートに行くと、元のテキストが隠れてしまう前に元のテキストが表示されることがあります。テキスト抽出は、そのテキストの元のテキストと新しいテキストの両方を引き出し、おそらく判読できないものと混在させる可能性があります。 –

1

ReportLabとPyPDF2で貧弱な人間の編集をしたい場合は、 ReportLabで置換コンテンツを作成します。あなたは一時ファイルに作成したこのPDF文書の保存

#set a fill color to white: 
c.setFillColorRGB(1,1,1) 
# draw a rectangle 
c.rect([your rectangle], fill=1) 
# change color 
c.setFillColorRGB(0,0,0) 
c.drawString([text insert position], [text string]) 

: は、キャンバス、領域を示す四角形、テキスト文字列はあなたを挿入されるテキスト文字列とポイントでしょうが与えられました。 このPDF文書とPyPDF2のPdfFileReaderを使用して変更したい文書を開きます。 pdfFileWriterオブジェクトを作成し、それをModifiedDocと呼んでください。一時的なPDFのページ0を取得し、それをupdatePageと呼んでください。他のドキュメントのページnを取得して、それをModificationPageと呼んでください。

toModifyPage.mergePage(updatePage) 

あなたは、ページを更新して行われた後:

再び
modifiedDoc.cloneDocumentFromReader(srcDoc) 
modifiedDoc.write(outStream) 

、あなたはこのルートを行けば、ユーザーはまだそれが新しいコンテンツで隠蔽される前に、元のテキストを参照し、テキスト抽出かもしれませんおそらくその領域の元のテキストと新しいテキストの両方を引き出し、恐らくそれを判読不能なものに混ぜるだろう。

関連する問題