43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
from PyPDF2 import PdfFileReader, PdfFileWriter
|
|
import io
|
|
from reportlab.pdfgen import canvas
|
|
from reportlab.lib.pagesizes import A4
|
|
from typing import IO, Union
|
|
|
|
from xlsx_replacement import XlsxReplacement
|
|
|
|
|
|
class PdfMerger:
|
|
def __init__(self, input_file: Union[str, IO], replacer: XlsxReplacement):
|
|
self.in_file = input_file
|
|
self.in_pdf = PdfFileReader(input_file)
|
|
self.replacer = replacer
|
|
|
|
def get_new_document(self) -> io.BytesIO:
|
|
overlay = PdfFileReader(self._build_canvas())
|
|
|
|
generated = PdfFileWriter()
|
|
|
|
for i in range(self.in_pdf.numPages):
|
|
page = self.in_pdf.getPage(i)
|
|
if i <= overlay.numPages:
|
|
page.mergePage(overlay.getPage(i))
|
|
generated.addPage(page)
|
|
|
|
out = io.BytesIO()
|
|
generated.write(out)
|
|
out.seek(0)
|
|
return out
|
|
|
|
def _build_canvas(self) -> io.BytesIO:
|
|
packet = io.BytesIO()
|
|
|
|
can = canvas.Canvas(packet, pagesize=A4)
|
|
for x, y, data in self.replacer.get_replacements():
|
|
can.drawString(x, y, data)
|
|
can.save()
|
|
|
|
packet.seek(0)
|
|
return packet
|
|
pass
|