kronoszx
3/28/2018 - 4:39 PM

Django PDF

import os

from PyPDF2 import PdfFileWriter, PdfFileReader

from reportlab.pdfgen import canvas
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
# from reportlab.lib.enums import TA_JUSTIFY
# from reportlab.lib.pagesizes import letter

from django.conf import settings

from apps.report.models import Report


def generate_signature_pdf(report_id):

    report = Report.objects.get(id=report_id)

    path = os.path.join(
        settings.MEDIA_ROOT,
        'report/{}/signatures.pdf'.format(str(report_id).zfill(5))
    )

    signatures = []
    for re in report.reportsexperts.all():
        if re.report_valid is True:
            signatures.append(
                os.path.join(
                    settings.MEDIA_ROOT,
                    'signatures',
                    '{0:05d}.jpg'.format(re.expert.id))
            )

    c = canvas.Canvas(path, pagesize=letter)
    c.translate(cm, cm)

    styles = getSampleStyleSheet()
    styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))

    step = 0
    for signature in signatures:
        c.drawImage(signature, 5*cm*step, 15*cm, 4*cm, 2.5*cm, True)
        step += 1
    c.showPage()
    c.save()


def generate_signed_pdf(report_id, page_number=3):
    report = Report.objects.get(id=report_id)

    signatures_path = os.path.join(
        settings.MEDIA_ROOT,
        'report/{}/signatures.pdf'.format(str(report_id).zfill(5))
    )
    report_path = os.path.join(
        settings.MEDIA_ROOT,
        '{}'.format(report.report.path)
    )
    output_path = '{}.signed.pdf'.format(report_path)

    output = PdfFileWriter()
    report_pdf = PdfFileReader(open(report_path, "rb"))
    signatures_pdf = PdfFileReader(open(signatures_path, "rb"))

    for i in range(0, report_pdf.getNumPages()):
        # Open up the orgininal PDF.
        page = report_pdf.getPage(i)
        # Apply the watermark by merging the two PDF files.
        if i == page_number:
            page.mergePage(signatures_pdf.getPage(0))
        # Send the resultant PDF to the output stream.
        output.addPage(page)

    # write the output of our new, watermarked PDF.
    outputStream = open(output_path, "wb")
    output.write(outputStream)
    outputStream.close()