2011-07-25 138 views
5

私はpdfを私のpdfと同じサイズ、つまりA4ページに変換しようとしています。 Pythonの既存のPDFドキュメントにテキストを追加

convert my_pdf.pdf -density 300x300 -page A4 my_png.png 

結果のpngファイルは、595px×842pxで72dpiの解像度にする必要があります。 私は、PILを使用していくつかのPDFフィールドにテキストを書き込んでPDFに変換することを考えていました。しかし、現在のところ、イメージは間違っています。

編集:間違った角度から問題に近づいていました。正しいアプローチには、イメージマジックはまったく含まれていませんでした。

+2

テキストファイルを画像ファイルに変換してテキストを書き込んで、ハイブリッド画像/テキスト形式に変換していますか? '.pdf'に注釈をつけたり、' .pdf'フォームに記入する最も良い方法は__no way__です。 – agf

+0

あなたはおそらく正しいでしょう。私はPythonの既存のpdfを修正する適切な方法を見つけることができないようです:/ –

+0

[既存のPDFへのテキストの追加(Pythonを使用したテキストの追加)](http://stackoverflow.com/questions/1180115/add-text-to-existing -pdf-using-python) – bain

答えて

2

Add text to Existing PDF using PythonPython as PDF Editing and Processing Frameworkをご覧ください。これらはあなたを正しい方向に向けるでしょう。あなたが.pdfに戻ってエクスポートするときに、質問で提案してきたものを行う場合

が、それは本当にちょうど.pdfに埋め込まれた画像ファイルになります、それはテキストではありません。

+0

私はそのポスト(最初のリンク)を読んで解決策に導いたので、私はあなたの答えを受け入れました。ありがとうございました。 –

+0

私はこれを自分自身で行う必要があるときに、わたしは今知られているスクリプトを持っているので、あなたに+1しました:) – agf

21

私は最終的に解決策を見つけました: 結局のところ、thisが正しいアプローチであることが判明しました。 しかし、私はそれが十分に冗長ではないと感じています。 ポスターはおそらくhere(同じ変数名など)から取ったようです。

アイデア:テキスト文字列のみを含むReportlabで新しい空のPDFを作成します。 次に、pyPdfを使用してウォーターマークとしてマージ/追加します。

from pyPdf import PdfFileWriter, PdfFileReader 
import StringIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 
packet = StringIO.StringIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(100,100, "Hello world") 
can.save() 

#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(file("mypdf.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page.mergePage(new_pdf.getPage(0)) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = file("/home/joe/newpdf.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

これが他の人に役立つと願っています。

5

私は上記の解決策を試しましたが、Python3で実行するにはかなりの問題がありました。だから、私は自分の修正を分けたいと思う。適応コードは次のようになります。

from PyPDF2 import PdfFileWriter, PdfFileReader 
import io 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

packet = io.BytesIO() 

# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(100, 100, "Hello world") 
can.save() 

# move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(open("mypdf.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page2 = new_pdf.getPage(0) 
page.mergePage(page2) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = open("newpdf.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

これで、page.mergePageはエラーをスローします。 pypdf2の移植エラーであることが判明しました。 Porting to Python3: PyPDF2 mergePage() gives TypeError

2

pdfrwを使用すると、既存のPDFをフォームXObjects(イメージに類似)としてレポートラボキャンバスに配置できます。これに関するいくつかの例がgithubのpdfrw examples/rl1サブディレクトリにあります。免責事項 - 私はpdfrwの著者です。

関連する問題