Skip to content

Commit 4a66bb6

Browse files
author
Dmitry Berezovsky
committedDec 24, 2023
feat: use poppler for image rendering
1 parent 90c4bcc commit 4a66bb6

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed
 

‎poetry.lock

+16-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎pyproject.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ weasyprint="~=60.2"
4444
pyyaml = ">=5.0.0"
4545
appdirs = ">=1.4.4"
4646
jinja2 = ">=3.0.0, <4.0.0"
47+
python-poppler = "~=0.4.1"
4748

4849
[tool.poetry.dev-dependencies]
4950
# Dev tools
@@ -103,6 +104,6 @@ follow_imports = "silent"
103104
ignore_missing_imports = true
104105

105106
[[tool.mypy.overrides]]
106-
module = ["weasyprint.*", "cli_rack_validation.*", "cli_rack.*", "usb.*", "appdirs.*"]
107+
module = ["weasyprint.*", "cli_rack_validation.*", "cli_rack.*", "usb.*", "appdirs.*", "poppler.*"]
107108
ignore_missing_imports = true
108109
follow_imports = "skip"

‎src/tapen/renderer/weasyprint.py

+19-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from pathlib import Path
2121
from typing import Optional
2222

23+
import poppler
2324
import weasyprint as wp
2425
from PIL import Image
2526
from cli_rack.utils import ensure_dir
@@ -44,8 +45,9 @@
4445
"""
4546

4647
PAGE_SIZE_CONFIG_TEMPLATE = """
47-
@page tape {{
48+
@page {{
4849
margin: 0;
50+
padding: 0;
4951
size: {height} {width};
5052
}}
5153
"""
@@ -62,11 +64,14 @@
6264

6365
LOGGER = logging.getLogger("renderer.weasyprint")
6466

67+
DEFAULT_RENDERER_DPI = 96
68+
6569

6670
class WeasyprintRenderer(Renderer):
6771
def __init__(self, template_processor: TemplateProcessor) -> None:
6872
super().__init__()
6973
self.template_processor = template_processor
74+
self.pdf_page_renderer = poppler.PageRenderer()
7075

7176
def __get_resource_path(self, name: str):
7277
path = RESOURCES_DIR / name
@@ -127,8 +132,19 @@ def render(self, print_job: PrintJob, tape_params: TapeInfo, is_preview=False, d
127132
calculated_width_px = self.__find_body_width(rendered_label.pages[0])
128133
page_config = self.__page_config_css(tape_params, calculated_width_px)
129134
rendered_label = html.render(stylesheets=stylesheets + [wp.CSS(string=page_config)])
130-
result_png = BytesIO()
131-
rendered_label.write_png(result_png, resolution=dpi)
135+
result_pdf, result_png = BytesIO(), BytesIO()
136+
rendered_label.write_pdf(result_pdf, zoom=dpi / DEFAULT_RENDERER_DPI, dpi=dpi)
137+
result_pdf.seek(0)
138+
pdf = poppler.load(result_pdf)
139+
rendered_image = self.pdf_page_renderer.render_page(pdf.create_page(0))
140+
pil_image = Image.frombytes(
141+
"RGBA",
142+
(rendered_image.width, rendered_image.height),
143+
rendered_image.data,
144+
"raw",
145+
str(rendered_image.format),
146+
)
147+
pil_image.save(result_png, format="png")
132148
result_png.flush()
133149
result_png.seek(0)
134150
self.job_num += 1

‎tapen.spec

+11-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,17 @@ a = Analysis(['src/tapen/cli.py'],
1111
("src/tapen/resources", "tapen/resources"),
1212
("src/tapen/renderer/resources", "tapen/renderer/resources"),
1313
],
14-
hiddenimports=[],
14+
hiddenimports=[
15+
"poppler.cpp.embedded_file",
16+
"poppler.cpp.toc",
17+
"poppler.cpp.font",
18+
"poppler.cpp.document",
19+
"poppler.cpp.destination",
20+
"poppler.cpp.page",
21+
"poppler.cpp.page_renderer",
22+
"poppler.cpp.version",
23+
"poppler.cpp.rectangle",
24+
],
1525
hookspath=[],
1626
hooksconfig={},
1727
runtime_hooks=[],

0 commit comments

Comments
 (0)
Please sign in to comment.