Skip to content

Instantly share code, notes, and snippets.

@prathje
Created January 14, 2021 19:55
Show Gist options
  • Select an option

  • Save prathje/fedc49e215d6f0fc0d67159a5889b4c6 to your computer and use it in GitHub Desktop.

Select an option

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
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