[PYTHON] Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße

Ich benötigte für meine Arbeit eine PDF-Datei mit unterschiedlichen Seitengrößen (1. Seite ist A4, 2. Seite ist B5 usw.).

Auf den ersten Blick hatte ich kein Tool, mit dem ich für jede Seite eine PDF-Datei mit einer anderen Größe erstellen konnte, also habe ich es selbst mit Python gemacht.

Dinge vorzubereiten

Die verwendete Umgebung ist Windows 10 Home 1903 Ver.

PyPDF2 kann leere PDF-Seiten erstellen. Sie können jedoch kein Objekt wie Text oder Bild auf die erstellte Seite schreiben **.

ReportLab kann ein PDF mit Zeichen und Zahlen erstellen, die direkt aus dem Programmcode geschrieben wurden. ** (soweit ich sehen kann) Sie können jedoch nicht für jede Seite PDFs mit unterschiedlichen Seitengrößen erstellen **.

So grob

  1. Erstellen Sie mit ReportLab eine einseitige PDF-Datei
  2. Lesen Sie 1 mit PyPDF2.PdfFileReader
  3. PyPDF2.Paste 2 in das von PdfFileWriter erstellte PDF einfügen

Nehmen Sie das Verfahren. Es ist ein bisschen nervig.

Code

Dieses Mal möchte ich Seiten aller Größen gleichmäßig von A0 bis C10 einfügen (ich weiß, dass es C gibt, ich weiß es zum ersten Mal), also alle in "reportlab.lib.pagesizes" definierten Seitengrößen erhalten Sah.

testpdf_creator.py


import random
import os
from pathlib import Path

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"

def makepage(writer, size, name):
  A4 = reportlab.lib.pagesizes.A4
  #Erstellen Sie ein PDF mit Text
  c = canvas.Canvas("base.pdf", pagesize=A4)
  pdfmetrics.registerFont(TTFont("YU", YU_GOTHIC))
  c.setFont('YU', 20)
  c.drawString(12, 12, f"This is {name} page.")
  c.drawString(12, A4[1] - 50, f"This is {name} page.")
  c.rect(0, 0, A4[0], A4[1])
  c.showPage()
  c.save()

  # Create Page
  with open("base.pdf", mode="rb") as f:
    r = PdfFileReader(f)
    p = writer.addBlankPage(size[0], size[1])
    scale = [a / b for a, b in zip(size, A4)]
    p.mergeTransformedPage(r.getPage(0), [scale[0], 0, 0 , scale[1], 0, 0] , True)

if __name__ == "__main__":
  writer = PdfFileWriter()
  sizes = list(filter(lambda n: type(eval(f'reportlab.lib.pagesizes.{n}')) == tuple, dir(reportlab.lib.pagesizes)))
  s = random.sample(sizes, 10)
  for n in tqdm(s):
    makepage(writer, eval(f"reportlab.lib.pagesizes.{n}"), n)

  with open("multisize.pdf", mode="wb") as f:
    writer.write(f)

Wo ich vorsichtig war

Informationen zu Canvas im Report Lab

In ReportLab können Sie mithilfe der Klasse "Canvas" eine PDF-Datei erstellen. In der Leinwand, die hier erhältlich ist, ** ist unten links der Ursprung (X: 0 Y: 0) **. Seien Sie also beim Zeichnen der Figur vorsichtig.

Wenn Ihnen das nicht gefällt, fügen Sie dem Konstruktor der Canvas-Klasse bottomup = False hinzu.

Informationen zu Canvas-Objektmethoden

Die "Canvas" -Objektmethode "rect ()" verwendet einige Argumente nach den X-, Y-Koordinaten, der Höhe und der Breite wie folgt:

reportlab/pdfgen/canvas.py


    def rect(self, x, y, width, height, stroke=1, fill=0):
        "draws a rectangle with lower left corner at (x,y) and width and height as given."

Die Werte wie "storke" und "fill" dieses Arguments geben jedoch keine Werte wie Linienbreite und Farbe an, sondern sind boolesche Typen, ob gemalt werden soll oder nicht **.

Dies wird in Zeile 44 von reportlab / pdfgen / canvas.py wie folgt beschrieben.

reportlab/pdfgen/canvas.py


PATH_OPS = {(0, 0, FILL_EVEN_ODD) : 'n',  #no op
            (0, 0, FILL_NON_ZERO) : 'n',  #no op
            (1, 0, FILL_EVEN_ODD) : 'S',  #stroke only
            (1, 0, FILL_NON_ZERO) : 'S',  #stroke only
            (0, 1, FILL_EVEN_ODD) : 'f*',  #Fill only
            (0, 1, FILL_NON_ZERO) : 'f',  #Fill only
            (1, 1, FILL_EVEN_ODD) : 'B*',  #Stroke and Fill
            (1, 1, FILL_NON_ZERO) : 'B',  #Stroke and Fill

Die Methode "rect" bezieht sich auf diese Variable mit dem Namen "PATH_OPS", und die beiden Argumente "Stroke" und "Fill" scheinen den beiden Werten in diesem Array zu entsprechen.

Über mergeScalePage von PyPDF2.PageObject

Verwenden Sie die Methode "PdfFileWriter # addBlankPage ()", um eine neue PDF-Seite mit "PyPDF2.PdfFileWriter" zu erstellen.

Wenn Sie hier ein anderes Seitenobjekt einfügen möchten, verwenden Sie "PageObject # merge *** Page ()".

Auf den ersten Blick scheint es so, als könnten Sie "mergeScaledPage ()" umgehen, indem Sie einfach die Skalierung ändern. Da "scale" dieser Methode jedoch nur einen Wert akzeptiert, kann sie nicht verwendet werden, wenn die vertikale und die horizontale Skalierung unterschiedlich sind.

Wenn die vertikale und horizontale Skalierung unterschiedlich sind, können Sie "mergeTransformedPage ()" verwenden. Das liegt daran, dass mergeScaledPage () nur mergeTransformedPage () mit der gleichen vertikalen und horizontalen Vergrößerung aufruft.

Wenn Sie die Vertikale auf 1,5x und die Horizontale auf 2x einstellen möchten, können Sie wie folgt vorgehen.

page.mergeTransformedPage('PageObject, das Sie hinzufügen möchten', [2, 0, 0 , 1.5, 0, 0] , True)

Um die Werte für alle vorhandenen Seitengrößen abzurufen

In reportlab / lib / pagesizes.py wird das Tupel beschrieben, das die Werte aller Seitengrößen definiert, sodass dies durch die Funktion dir erhalten wird.

Diese Datei definiert jedoch auch Funktionen wie "Portlait" und "Querformat", die die Höhe und Breite der Seite umkehren. Entfernen Sie sie daher mit der Funktion "Filter".

list(filter(lambda n: type(eval(f'reportlab.lib.pagesizes.{n}')) == tuple, dir(reportlab.lib.pagesizes)))

Verweise

Recommended Posts

Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße
Erstellen Sie eine 1-MByte-Zufallszahlendatei
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie eine große Textdatei mit Shellscript
VM mit YAML-Datei (KVM) erstellen
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
A4 Größe mit Python-Pptx
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Machen Sie einen Zylinder mit open3d + STL-Dateiausgabe
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Erstellen Sie eine Zufallszahl mit einer beliebigen Wahrscheinlichkeitsdichte
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine Dummy-Datendatei
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine Xlsx-Datei mit XlsxWriter
Erstellen Sie eine PythonBox, die nach der PEPPER-Eingabe mit Random ausgegeben wird
So setzen Sie einen Hyperlink zu "file: // hogehoge" mit sphinx-> pdf
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie eine Deb-Datei mit Docker
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie eine Binärdatei in Python
Erstellen Sie einen Poisson-Stepper mit numpy.random
Erstellen Sie eine zufällige Zeichenfolge in Python
So erstellen Sie eine Konfigurationsdatei
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
[Python] Lesen Sie eine CSV-Datei mit großen Datenmengen mithilfe eines Generators
Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen einer einfachen Power-Datei mit Python
Erstellen Sie mit Python + PIL ein Dummy-Image.
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Einführung)
Erstellen Sie schnell eine Excel-Datei mit Python #python
Erstellen Sie eine GUI-App mit Tkinter of Python
Erstellen Sie ein Sternensystem mit Blender 2.80-Skript
Erstellen Sie eine einfache Web-App mit Flasche
Erstellen Sie eine Excel-Datei mit Python + Ähnlichkeitsmatrix
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Erstellen Sie eine Deb-Datei aus einem Python-Paket
[GPS] Erstellen Sie eine kml-Datei mit Python
Erstellen Sie mit NetworkX einen verbindenden nächsten Nachbarn
Skript zum Erstellen einer Mac-Wörterbuchdatei
Erstellen Sie einen Webdienst mit Docker + Flask
Erstellen Sie einen Seiten- / Todo-Block mit der Notion-API
Überprüfen Sie die Dateigröße mit du -sh *
Zeichendatendatei mit numpy lesen
Erstellen Sie ein privates Repository mit AWS CodeArtifact
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi