Home

Zinner? I hardly know her.

So, I needed to print foldable zines, and after struggling for way too long with online tools that barely work, I made my own command-line converter.

It takes any pdf file as an input, just run ./zinner.py path/to/file.pdf to generate file-zinned.pdf in the same folder.

#!/usr/bin/env python
from pypdf import PdfWriter
from sys import argv

def main(path:str):

    assert path[-4:]==".pdf", "B-baka, that's not a pdf! (-‸ლ)"

    def order(n):
        total = 4*(((n-1)//4)+1)
        L=[]
        for k in range(total//4):
            L.append(2*k)
            L.append(total-2*k-1)
            L.append(total-2*k-2)
            L.append(2*k+1)

        return L

    input_file = PdfWriter(clone_from="input.pdf")
    n = len(input_file.pages)
    for _ in range( 4*(((n-1)//4)+1) - n ):
        input_file.add_blank_page()

    shuffled_file = PdfWriter()
    shuffled_file.append(input_file,order(n))

    WIDTH = shuffled_file.pages[0].mediabox.width
    HEIGHT = shuffled_file.pages[0].mediabox.height

    output_file = PdfWriter()
    for k in range(len(shuffled_file.pages)//2):
        output_file.add_blank_page(width=2*WIDTH,height=HEIGHT)

        output_file.pages[k].merge_translated_page(shuffled_file.pages[2*k],0,0)
        output_file.pages[k].merge_translated_page(shuffled_file.pages[2*k+1],WIDTH,0)

    output_file.write(path[:-4]+"-zinned.pdf")

main(argv[1])

It works on my machine with Python 3.13.7 and pypdf 6.0.0.