6

元のファイルに透かしをマージする Pdf マージを作成しました。

私が今やりたいことは、ブラウザで「document-output.pdf」ファイルをDjangoビューで開くことです。Django の関連記事は既に確認済みですが、アプローチがかなり異なるため、response オブジェクトをその "file." として使用して PDF オブジェクトを直接作成することはなく、ちょっと迷っています。

では、どうすればDjangoビューでできますか?

from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

output = PdfFileWriter()
input = PdfFileReader(file('file.pdf', 'rb'))

# get number of pages
num_pages = input.getNumPages()

# register new chinese font
pdfmetrics.registerFont(TTFont('chinese_font','/usr/share/fonts/truetype/mac/LiHeiPro.ttf'))

# generate watermark on the fly
pdf = Canvas("watermark.pdf")
pdf.setFont("chinese_font", 12)
pdf.setStrokeColorRGB(0.5, 1, 0)
pdf.drawString(10, 830, "你好")
pdf.save()

# put on watermark
watermark = PdfFileReader(file('watermark.pdf', 'rb'))
page1 = input.getPage(0)

page1.mergePage(watermark.getPage(0))

# add processed pdf page
output.addPage(page1)

# then, add rest of pages
for num in range(1, num_pages):
    output.addPage(input.getPage(num))

outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
4

4 に答える 4

9

古い投稿であることは知っていますが、html の埋め込みタグを使用してこの種の機能を実装できます。例:

<embed height="100%" width="100%"  name="plugin" src="filename.pdf"  type="application/pdf">

したがって、あなたの場合、render to response を次のように使用して、単純に応答を送信できます。

return render_to_response("abc.html",{"filename":filename})

abc.html では、前述のように、このファイル名 (パスを含む) を埋め込みタグに入れることができます。

お役に立てれば。

于 2010-09-28T08:26:35.640 に答える
6

PDF をブラウザーに送り返すだけでなく、透かしを文字列バッファーに保存することで、いくつかのサイクルを節約することもできます。

from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from django.http import HttpResponse
try:
   from cStringIO import StringIO
except ImportError:
   from StringIO import StringIO

def some_view(request):
   output = PdfFileWriter()
   input = PdfFileReader(file('file.pdf', 'rb'))

   #create response object
   response = HttpResponse(mimetype='application/pdf')
   response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'

   # get number of pages
   num_pages = input.getNumPages()

   #register the font
   pdfmetrics.registerFont(TTFont('chinese_font','/usr/share/fonts/truetype/mac/LiHeiPro.ttf'))

   # generate watermark on the fly
   buffer = StringIO() # create string buffer for PDF
   pdf = Canvas(buffer)
   pdf.setFont("chinese_font", 12)
   pdf.setStrokeColorRGB(0.5, 1, 0)
   pdf.drawString(96, 26, "88888")
   pdf.save()

   # put on watermark from buffer
   watermark = PdfFileReader(buffer)
   page1 = input.getPage(0)

   page1.mergePage(watermark.getPage(0))

   # add processed pdf page
   output.addPage(page1)


   #stream to browser
   outputStream = response
   output.write(response)
   outputStream.close()

return response
于 2011-03-30T18:56:58.717 に答える
3

フォローしているかどうかわかりません。PDF コンテンツをブラウザに送信する場合は、HttpResponseインスタンスを使用する必要があります。コードのこの行

outputStream = file("document-output.pdf", "wb")

PDF コンテンツを応答に書き込む機能はありません。代わりに、コンテンツをローカルファイルに書き込むように見えますが、これは同じではありません。

アップデート

コメントに基づく:

PDF コンテンツを添付ファイルとしてではなく、ブラウザーで開くときに HttpResponse オブジェクトに送信する方法。

私の知る限り(誰かがもっとよく知っているなら、私を修正してください)これはブラウザに依存しています。

応答ヘッダーからを除外するとContent-Disposition = "attachment; filename=foo.pdf、特定のファイル名なしでコンテンツをブラウザーに送信できます。これにより、Firefox ブラウザー (3.6.10、Ubuntu Jaunty) が、プログラムを使用して開くかどうかを尋ねてきました。Chrome (6.0.472.62、Ubuntu Jaunty) では、ファイルはdownload.pdfプロンプトなしでダウンロードされました。

于 2010-09-22T08:43:26.173 に答える
1

クリスのコメントでこの行から「添付ファイル」を削除します

response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
于 2016-06-09T10:59:56.023 に答える