2017-03-29 10 views
0

장고에서 두 개의 pdf 파일을 PyPDF2와 ReportLab로 병합하려고합니다. 다음과 같이장고로 pdf 파일 열기

@login_required 
def export_to_pdf(request, user_id): 
    member = Member.objects.filter(user_id=user_id).values('user_id', 
                  'user__first_name', 
                  'user__last_name', 
                  'company_name', 
                  'vat_number', 
                  'address', 
                  'postcode', 
                  'city', 
                  'user__email', 
                  'telephone', 
                  'subscription__type__name', 
                  'subscription__type__limit', 
                  ).annotate(num_calculations=Count('user__calculations'))[0] 

    company_address = "{}, {} {}".format(member['address'], member['postcode'], member['city']) 
    buffer = BytesIO() 

    # Create the PDF object, using the BytesIO object as its "file." 
    p = canvas.Canvas(buffer, pagesize=A4) 
    p.setFont('Helvetica-Bold', 8) 
    p.drawString(70, 765, "{}".format(member['company_name'])) 

    p.drawString(70, 731, "{}".format(company_address)) 
    p.drawString(70, 714, "{}".format(member['telephone'])) 
    p.drawString(335, 697, "{}".format(member['vat_number'])) 

    p.drawString(335, 697, "{}".format(member['vat_number'])) 
    p.save() 

    buffer.seek(0) 
    new_pdf = PdfFileReader(buffer) 
    existing_pdf = PdfFileReader(open('master/files/file.pdf', "rb")) 

    page = existing_pdf.getPage(0) 
    page.mergePage(new_pdf.getPage(0)) 

    output = PdfFileWriter() 
    output.addPage(page) 
    output_stream = open("master/files/new_file.pdf", "wb") 
    output.write(output_stream) 
    output_stream.close() 

    with open('master/files/new_file.pdf', 'r', encoding="Latin-1") as pdf: 
     response = HttpResponse(pdf.read(), content_type='application/pdf') 
     response['Content-Disposition'] = 'attachment; filename=some_file.pdf' 
     return response 

프로젝트 나무는 다음과 같습니다 :

enter image description here

을 따라서 나는 새 파일을 만든 다음 나는 기존 파일 file.pdf를 열고 나는 그 두 병합, 다음과 같이 내도이다 파일. 마지막으로 출력 new_file.pdf에 대한 파일을 만듭니다.

잘 작동하지만 문제는 반환 된 파일입니다. export_to_pdf 함수를 실행하면 new_file.pdf을 얻어야합니다. 그 파일을 얻을 수 있지만, 그 파일의 내용은 내가 병합 된 파일 file.pdf의 어떤 내용이 없습니다

p = canvas.Canvas(buffer, pagesize=A4) 
p.setFont('Helvetica-Bold', 8) 
p.drawString(70, 765, "{}".format(member['company_name'])) 

p.drawString(70, 731, "{}".format(company_address)) 
p.drawString(70, 714, "{}".format(member['telephone'])) 
p.drawString(335, 697, "{}".format(member['vat_number'])) 

p.drawString(335, 697, "{}".format(member['vat_number'])) 
p.save() 

로 만든 유일한 것입니다.

그러나 new_file.pdf을 직접 클릭하면 열어야합니다.

내가 뭘 잘못했는지 조언 해주세요.

답변

0

해결했습니다. 다른 사람이 같은 문제가있는 경우.

난 그냥 rb 추가 이에 대신 r
with open('master/files/new_file.pdf', 'rb') as pdf: 

한줄

변경. 그리고 인코딩도 더 이상 필요하지 않았습니다.