Created
January 14, 2021 19:55
-
-
Save prathje/fedc49e215d6f0fc0d67159a5889b4c6 to your computer and use it in GitHub Desktop.
Multiply base pdf files and merge them with a number overlay. Creates _base.pdf as an intermediate file and out.pdf as the final output. See: https://stackoverflow.com/a/47591251/6669161
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger | |
| import io | |
| from reportlab.pdfgen import canvas | |
| from reportlab.lib.pagesizes import letter | |
| from reportlab.lib.pagesizes import A4 | |
| from reportlab.pdfbase.ttfonts import TTFont | |
| import sys | |
| if len(sys.argv) < 4: | |
| print("Usage pdf0.pdf pd1.pdf <start_number> <amount>") | |
| exit() | |
| pdf_file_names = sys.argv[1:-2] | |
| start = int(sys.argv[-2]) | |
| amount = int(sys.argv[-1]) | |
| print(pdf_file_names, start, amount) | |
| if start < 1 or amount < 1: | |
| print("Could not use start and amount") | |
| exit() | |
| # We first merge all PDF files to one base | |
| def create_overlay(number): | |
| packet = io.BytesIO() | |
| # Create a new PDF with Reportlab | |
| can = canvas.Canvas(packet, pagesize=A4) | |
| can.setFont('Helvetica', 10) | |
| can.setFillColorRGB(0.5, 0.5, 0.5) | |
| can.drawString(450, 800, "#{:04d}".format(number)) | |
| can.drawString(450, 40, "#{:04d}".format(number)) | |
| can.showPage() | |
| can.save() | |
| # Move to the beginning of the StringIO buffer | |
| packet.seek(0) | |
| return PdfFileReader(packet) | |
| def create_base_pdf(): | |
| merger = PdfFileMerger() | |
| for filename in pdf_file_names: | |
| merger.append(PdfFileReader(open(filename, 'rb'))) | |
| return merger | |
| base = create_base_pdf() | |
| baseStream = open("_base.pdf", "wb") | |
| base.write(baseStream) | |
| baseStream.close() | |
| output = PdfFileWriter() | |
| for i in range(start, start+amount): | |
| # TODO: This is not efficient! | |
| base = PdfFileReader(open("base.pdf", 'rb')) | |
| overlay = create_overlay(i) | |
| for p in range(0, base.getNumPages()): | |
| page = base.getPage(p) | |
| page.mergePage(overlay.getPage(0)) | |
| output.addPage(page) | |
| # Finally, write "output" to a real file | |
| outputStream = open("out.pdf", "wb") | |
| output.write(outputStream) | |
| outputStream.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment