4

我在合并 pyPDF 逻辑以将两个 pdf 文件合并到我的 django 站点时遇到问题。我编写了在本地服务器上的 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。However, when more than one PDF is selected, only the final PDF selected displays, hence the need to integrate pyPDF to create one file containing all requested files.

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)

我正在努力寻找一种将这两种方法结合起来的方法。我尝试过的是以下内容,但出现 IO 错误 [Errno 2] 没有这样的文件或目录:'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 回答