Skip to content

Instantly share code, notes, and snippets.

@TakamiChie
Created December 8, 2020 16:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TakamiChie/ca0a882fd173de612180d8f723bba3aa to your computer and use it in GitHub Desktop.
Save TakamiChie/ca0a882fd173de612180d8f723bba3aa to your computer and use it in GitHub Desktop.
任意のページサイズ、ページ数のPDFファイルを作成する。
# ReportLab, PyPDF2, TQDMは事前にpipでインストールしておいてください。
import random
import sys
import os
from pathlib import Path
from argparse import ArgumentParser
from tqdm import tqdm
from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import reportlab.lib.pagesizes
YU_GOTHIC = Path(filter(lambda n: (Path(n) / "Fonts" / "YuGothB.ttc").exists(), os.environ.get("PATH").split(";")).__next__()) / "Fonts" / "YuGothB.ttc"
WORKDIR = Path(__file__).parent
OUTDIR = WORKDIR
argp = ArgumentParser()
argp.add_argument("--pages", type=int, default=100, help="ページ数を指定する。省略時100")
argp.add_argument("--size", type=str, default="A4", help="ページサイズを文字列で指定する。省略時A4")
argp.add_argument("--output", type=str, default="testpdf", help="ファイル名。省略時「testpdf」")
args = argp.parse_args()
size = getattr(reportlab.lib.pagesizes, args.size)
p = PathManager()
# テキストの書かれたPDFを作る
c = canvas.Canvas(str(WORKDIR / "base.pdf"), pagesize=size)
pdfmetrics.registerFont(TTFont("YU", YU_GOTHIC))
for l in range(4):
for i in range(10):
xr = i / size[0] * 10000
yr = i / size[1] * 10000
r = 1 - i / 11 if l == 0 or l == 1 else 0
g = 1 - i / 11 if l == 0 or l == 2 else 0
b = 1 - i / 11 if l == 0 or l == 3 else 0
c.setStrokeColorRGB(r, g, b)
c.rect(xr, yr, size[0] - (xr * 2), size[1] - (yr * 2))
t = "Monochrome" if l == 0 else "Color"
c.setFont('YU', 20)
c.drawString(12, 12, f"This is {args.size} page {t}.")
c.drawString(12, size[1] - 50, f"This is {args.size} page {t}.")
c.showPage()
c.save()
with open(WORKDIR / "base.pdf", mode="rb") as rb:
reader = PdfFileReader(rb)
writer = PdfFileWriter()
for i in tqdm(range(args.pages), f"{args.output}.pdf"):
page = writer.addBlankPage(size[0], size[1])
page.mergePage(reader.getPage(random.randrange(0, 3)))
with open(OUTDIR / f"{args.output}.pdf", mode="wb") as wb:
writer.write(wb)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment