1
0
mirror of synced 2024-11-22 01:04:23 +01:00

Fix pdf issues on printers

pyCairo by default renders the PDF surfaces with a resolution of 72
dpi which is so low that the bitmap gets blurred compared to original.

Since pyCairo 1.12.0, a new method set_device_scale(x_scale, y_scale)
is added, which allows changing the canvas resolution.
This commit is contained in:
Antonio Eugenio Burriel 2021-07-25 14:10:36 +02:00 committed by jvoisin
parent 0b094b594b
commit 3b094ae449

View File

@ -32,7 +32,7 @@ class PDFParser(abstract.AbstractParser):
def __init__(self, filename): def __init__(self, filename):
super().__init__(filename) super().__init__(filename)
self.uri = 'file://' + os.path.abspath(self.filename) self.uri = 'file://' + os.path.abspath(self.filename)
self.__scale = 2 # how much precision do we want for the render self.__scale = 200 / 72.0 # how much precision do we want for the render
try: # Check now that the file is valid, to avoid surprises later try: # Check now that the file is valid, to avoid surprises later
Poppler.Document.new_from_file(self.uri, None) Poppler.Document.new_from_file(self.uri, None)
except GLib.GError: # Invalid PDF except GLib.GError: # Invalid PDF
@ -90,8 +90,8 @@ class PDFParser(abstract.AbstractParser):
page_width, page_height = page.get_size() page_width, page_height = page.get_size()
logging.info("Rendering page %d/%d", pagenum + 1, pages_count) logging.info("Rendering page %d/%d", pagenum + 1, pages_count)
width = int(page_width) * self.__scale width = int(page_width * self.__scale)
height = int(page_height) * self.__scale height = int(page_height * self.__scale)
img_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) img_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
img_context = cairo.Context(img_surface) img_context = cairo.Context(img_surface)
@ -105,7 +105,12 @@ class PDFParser(abstract.AbstractParser):
buf.seek(0) buf.seek(0)
img = cairo.ImageSurface.create_from_png(buf) img = cairo.ImageSurface.create_from_png(buf)
pdf_surface.set_size(page_width*self.__scale, page_height*self.__scale) if cairo.version_info < (1, 12, 0):
pdf_surface.set_size(width, height)
else:
print("lol")
pdf_surface.set_size(page_width, page_height)
pdf_surface.set_device_scale(1 / self.__scale, 1 / self.__scale)
pdf_context.set_source_surface(img, 0, 0) pdf_context.set_source_surface(img, 0, 0)
pdf_context.paint() pdf_context.paint()
pdf_context.show_page() # draw pdf_context on pdf_surface pdf_context.show_page() # draw pdf_context on pdf_surface