This method inserts text into a predefined rectangular area of a (new or existing) PDF page. Words are distributed across the available space, put on new lines when required etc. Line breaks and tab characters are respected / resolved. Text can be aligned in the box (left, center, right) and fonts can be freely chosen. The method returns a float indicating how vertical space is left over after filling the area.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import fitz # import PyMuPDF doc = fitz.open("some.pdf") # or new: fitz.open(), followed by insertPage() page = doc[n] # choose some page rect = fitz.Rect(50, 100, 300, 400) # rectangle (left, top, right, bottom) in pixels text = """This text will only appear in the rectangle. Depending on width, new lines are generated as required.\n<- This forced line break will also appear.\tNow a very long word: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.\nIt will be broken into pieces.""" rc = page.insertTextbox(rect, text, fontsize = 12, # choose fontsize (float) fontname = "Times-Roman", # a PDF standard font fontfile = None, # could be a file on your system align = 0) # 0 = left, 1 = center, 2 = right print("unused rectangle height: %g" % rc) # just demo (should display "44.2") doc.saveIncr() # update file. Save to new instead by doc.save("new.pdf",...)
Choosing the right font is quite flexible:
fontname = "xxxxx", fontfile = None- xxxxx must be one of the 14 PDF standard fonts
fontname = "xxxxx", fontfile = ".../??????.ttf"- embed and use some new fontfile
fontname = "/xxxxx", fontfile = None- xxxxx must reference a font already used by the page.
Only this new text is put on the page - background is transparent. If anything is already there, it will "shine through". To prevent this, first fill the rectangle with some color using the
page.drawRect(rect, color = white, fill = white) # white is the tuple (1, 1, 1),