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:
parent
0b094b594b
commit
3b094ae449
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user