4

2 つの pdf ファイルを私の django サイトにマージする pyPDF ロジックを組み込むのに問題があります。ローカル サーバー上の python ファイルで実行されたときにファイルをマージするように機能するコードを作成しました (ただし、マージするファイルを明示的に識別する必要があります。

from pyPdf import PdfFileReader, PdfFileWriter

output = PdfFileWriter()
input1 = PdfFileReader(file("abc_form0.pdf", "rb"))
input2 = PdfFileReader(file("abc_form1.pdf", "rb"))
total_pages = input1.getNumPages()
total_pages1 = input2.getNumPages()

for page in xrange(total_pages):
    output.addPage(input1.getPage(page))

for page in xrange(total_pages1):
    output.addPage(input2.getPage(page))


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

このコード (私の django サイトから) は、単一の PDF を表示するために機能します。ただし、複数の PDF を選択すると、最後に選択した PDF のみが表示されるため、pyPDF を統合して、要求されたすべてのファイルを含む 1 つのファイルを作成する必要があります。

class ABCAdmin(admin.ModelAdmin):

    actions = ['print_selected_pdf']

    def create_pdf(self, request, queryset):
        response = HttpResponse(mimetype="application/pdf")
        response['Content-Disposition'] = 'attachment; filename=form.pdf'
        for obj in queryset:
            response.write(obj.form)
            ABC.objects.filter(pk=obj.pk).update(user=request.user,pdf_printed="1",request_time=time.strftime("%H:%M:%S"),request_date=datetime.datetime.today())
            return response

    def print_selected_pdf(self, request, queryset):
        # prints the pdfs for those that are selected,
        # regardless if the pdf_printed field is true or false
        qs = queryset.filter(pdf_printed__exact=0)
        return self.create_pdf(request, qs)

これら2つの方法を組み合わせる方法を見つけるのに苦労しています。私が試したのは次のとおりですが、IO エラー [Errno 2] No such file or directory: 'obj.form' が発生します。したがって、obj.form を読み取っていません。これらのオブジェクトを正しく読み取る方法を見つける必要があります。とにかく、これは私が試したことです。

def create_pdf(self, request, queryset):
    response = HttpResponse(mimetype="application/pdf")
    response['Content-Disposition'] = 'attachment; filename=form.pdf'
    for obj in queryset:
        output = PdfFileWriter()
        input = PdfFileReader(file("obj.form","rb"))
        total_pages = input.getNumPages()
        for page in xrange(total_pages):
            output.addPage(input.GetPage(page))
        outputStream = file("output.pdf", "wb")
        response.write(outputStream)
        outputStream.close()
        ABC.objects.filter(pk=obj.pk).update(user=request.user,pdf_printed="1",request_time=time.strftime("%H:%M:%S"),request_date=datetime.datetime.today())
        return response

def print_selected_pdf(self, request, queryset):
    # prints the pdfs for those that are selected,
    # regardless if the pdf_printed field is true or false
    qs = queryset.filter(pdf_printed__exact=0)
    return self.create_pdf(request, qs)

いつものように、あなたが提供できる助けやヒントをありがとう!

4

2 に答える 2

6

これを回避するために、出力ストリームで stringIO を使用しました。出力に追加する PDF フォームの各ページも定義する必要がありました。これは、リクエストする必要がある任意の数のフォームを反復するために機能します。

def create_form(self, request, queryset):
    response = HttpResponse(mimetype="application/pdf")
    response['Content-Disposition'] = 'attachment; filename=form.pdf'
    output = PdfFileWriter()
    for obj in queryset:
        input = PdfFileReader(cStringIO.StringIO(obj.form))
        output.addPage(input.getPage(0))
        output.addPage(input.getPage(1))
        output.addPage(input.getPage(2))
        output.addPage(input.getPage(3))
        ABC_Self.objects.filter(pk=obj.pk).update(user=request.user,pdf_printed="1",request_time=time.strftime("%H:%M:%S"),request_date=datetime.datetime.today())
    outputStream = cStringIO.StringIO()
    output.write(outputStream)
    response.write(outputStream.getvalue())
    return response
于 2012-08-03T12:19:10.587 に答える
0

必要なのは、PDF ファイルへの完全な絶対パスを指定することだけです。

/home/joseph/form.pdf

また

c:/home/joseph/form.pdf

于 2011-11-07T07:45:10.487 に答える