A module for creating PDF files
Project description
PDF-Maker
A module for creating PDF files from code.
Update log
2024-10-02 v0.0.50
- Supports hex colors for all components.
Example usage:
Case 1: Plot scatters and lines and write text based on a coordinate system
view the pdf generated in this example: pdf
basefont = "ArialMT"
file = pm.NewPDF(filepath="case1.pdf", _basefont=basefont)
# the below two texts will use default basefont of the page, which is ArialMT
file.text(page=0, x=20, y=100, line_space=1, size=12, base=0, rotate=0,
h_align="left", v_align="bottom", text="123456 ± Test Font Embeding")
file.text(page=0, x=20, y=150, line_space=1, size=24, base=0, rotate=0,
h_align="left", v_align="bottom", text="123456 ± Test Font Embeding")
font_obj = file.add_font(name="Calibri", width_scale=0.5, embed=True)
file.text(page=0, x=20, y=200, line_space=1, size=12, base=0, rotate=0, font=font_obj._basefont,
h_align="left", v_align="bottom", text="123456 ± Test Font Embeding")
file.text(page=0, x=20, y=250, line_space=1, size=24, base=0, rotate=0, font=font_obj._basefont,
h_align="left", v_align="bottom", text="123456 ± Test Font Embeding")
font_obj = file.add_font(name="MicrosoftSansSerif", width_scale=0.5, embed=True)
file.text(page=0, x=120, y=500, line_space=1, size=12, base=0, rotate=0, font=font_obj._basefont,
h_align="left", v_align="center", text="This is a rotated text")
file.text(page=0, x=120, y=500, line_space=1, size=12, base=0, rotate=30, font=font_obj._basefont,
h_align="left", v_align="center", text="This is a rotated text")
file.text(page=0, x=120, y=500, line_space=1, size=12, base=0, rotate=60, font=font_obj._basefont,
h_align="left", v_align="center", text="This is a rotated text")
file.text(page=0, x=120, y=500, line_space=1, size=12, base=0, rotate=90, font=font_obj._basefont,
h_align="left", v_align="center", text="This is a rotated text")
file.text(page=0, x=120, y=500, line_space=1, size=12, base=0, rotate=120, font=font_obj._basefont,
h_align="left", v_align="center", text="This is a rotated text")
font_obj = file.add_font(name="TimesNewRomanPSMT", width_scale=0.5, embed=True)
file.text(page=0, x=300, y=500, line_space=1, size=12, base=0, rotate=0, font=font_obj._basefont,
h_align="middle", v_align="center", text="This is a rotated text")
file.text(page=0, x=300, y=500, line_space=1, size=12, base=0, rotate=30, font=font_obj._basefont,
h_align="middle", v_align="center", text="This is a rotated text")
file.text(page=0, x=300, y=500, line_space=1, size=12, base=0, rotate=60, font=font_obj._basefont,
h_align="middle", v_align="center", text="This is a rotated text")
file.text(page=0, x=300, y=500, line_space=1, size=12, base=0, rotate=90, font=font_obj._basefont,
h_align="middle", v_align="center", text="This is a rotated text")
file.text(page=0, x=300, y=500, line_space=1, size=12, base=0, rotate=120, font=font_obj._basefont,
h_align="middle", v_align="center", text="This is a rotated text")
# save pdf
file.save()
Case 2: (v0.0.4) Plot isochron with ArArPY files
view the pdf generated in this example: pdf
# open ararpy files
file_path = r'D:\PythonProjects\pdf-maker\venv\Lib\site-packages\ararpy\examples\22WHA0433.arr'
sample = ap.from_arr(file_path=file_path)
plot: ap.Plot = sample.InvIsochronPlot
xaxis: ap.Axis = plot.xaxis
yaxis: ap.Axis = plot.yaxis
set1: ap.Set = plot.set1
set2: ap.Set = plot.set2
age_results = sample.Info.results.isochron["figure_3"]
plot_scale = (xaxis.min, xaxis.max, yaxis.min, yaxis.max)
# create a canvas
cv = pm.Canvas(width=17, height=12, unit="cm", show_frame=True, clip_outside_plot_areas=False)
# change frame outline style
cv.show_frame(color="grey", line_width=0.5)
pt = cv.add_plot_area(name="Plot1", plot_area=(0.15, 0.15, 0.8, 0.8), plot_scale=plot_scale, show_frame=True)
# isochron scatters
data = ap.calc.arr.transpose(plot.data)
for (x, sx, y, sy, r, i) in data:
pt.scatter(x, y, fill_color="red" if (i-1) in set1.data else "blue" if (i-1) in set2.data else "white", size=2)
# isochron line
line1: list = plot.line1.data
pt.line(start=line1[0], end=line1[1], clip=True, width=1, color='red')
# split sticks
xaxis.interval = (xaxis.max - xaxis.min) / xaxis.split_number
yaxis.interval = (yaxis.max - yaxis.min) / yaxis.split_number
for i in range(xaxis.split_number + 1):
start = pt.scale_to_points(*(xaxis.min + xaxis.interval * i, yaxis.min))
end = pt.scale_to_points(xaxis.min + xaxis.interval * i, yaxis.min)
end = (end[0], start[1] - 5)
pt.line(start=start, end=end, width=1, line_style="solid", clip=False, coordinate="pt")
pt.text(x=start[0], y=end[1] - 15, text=f"{xaxis.min + xaxis.interval * i}", clip=False,
coordinate="pt", h_align="middle")
for i in range(yaxis.split_number + 1):
start = pt.scale_to_points(*(xaxis.min, yaxis.min + yaxis.interval * i))
end = pt.scale_to_points(xaxis.min, yaxis.min + yaxis.interval * i)
end = (start[0] - 5, end[1])
pt.line(start=start, end=end, width=1, line_style="solid", clip=False, coordinate="pt")
pt.text(x=end[0] - 5, y=end[1], text=f"{yaxis.min + yaxis.interval * i}", clip=False,
coordinate="pt", h_align="right", v_align="center")
# axis titles
p = pt.scale_to_points((xaxis.max + xaxis.min) / 2, yaxis.min)
pt.text(x=p[0], y=p[1] - 30, text=f"<sup>39</sup>Ar<sub>K</sub>/<sup>40</sup>Ar*",
clip=False, coordinate="pt", h_align="middle", v_align="top")
p = pt.scale_to_points(xaxis.min, (yaxis.max + yaxis.min) / 2)
pt.text(x=p[0] - 50, y=p[1], text=f"<sup>36</sup>Ar<sub>a</sub>/<sup>40</sup>Ar*",
clip=False, coordinate="pt", h_align="middle", v_align="bottom", rotate=90)
# inside text
age, sage = round(age_results[0]['age'], 2), round(age_results[0]['s2'], 2)
F, sF = round(age_results[0]['F'], 2), round(age_results[0]['sF'], 2)
R0, sR0 = round(age_results[0]['initial'], 2), round(age_results[0]['sinitial'], 2)
pt.text(x=(xaxis.max - xaxis.min) * 0.6 + xaxis.min,
y=(yaxis.max - yaxis.min) * 0.7 + yaxis.min,
text=f"Age ={age} {chr(0xb1)} {sage} Ma<r>F = {F} {chr(0xb1)} {sF}<r>"
f"R<sub>0</sub> = {R0} {chr(0xb1)} {sR0}",
clip=True, coordinate="scale", h_align="middle", v_align="center", rotate=0)
file = pm.NewPDF(filepath="case2.pdf")
# as default, an empty pdf will have no page
file.add_page()
# rich text tags should follow this priority: color > script > break
file.text(page=0, x=300, y=780, line_space=1.2, size=24, base=0, h_align="middle",
text=f"This is a demo of creating pdf with <red>PDF-Maker</red>."
f"<r><sup>40</sup>Ar/<sup>39</sup>Ar Inverse Isochron")
file.canvas(page=1, margin_top=7, canvas=cv, unit="cm", h_align="middle")
# save pdf
file.save()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pdf_maker-0.0.56.tar.gz.
File metadata
- Download URL: pdf_maker-0.0.56.tar.gz
- Upload date:
- Size: 8.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a032e5d894b437008b4aae7defd4e49cd4339cfd4ce393edbbda07f60ce2bbe
|
|
| MD5 |
2fa7e75f0de8cfb2348c27b4b71bb3a5
|
|
| BLAKE2b-256 |
33c568ec84df5f7cf219907de6719542e6dfd99daa8ffbda3a3f1139fd310b15
|
File details
Details for the file pdf_maker-0.0.56-py3-none-any.whl.
File metadata
- Download URL: pdf_maker-0.0.56-py3-none-any.whl
- Upload date:
- Size: 9.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c05c1fab8e4e80fbafa3429646d43c503c13411cf71fd9406aea25e31cb7530
|
|
| MD5 |
92371a4995a29503a7e05f2950adf345
|
|
| BLAKE2b-256 |
585bf9dd0de46c8bb34e1e92c11aaeb0347e64011825a7cb70f2b221b1371645
|