def build_pdf(output_dir): """Build PDF versions of each content page.""" for html_file in files(output_dir, '*.html', label='Building PDFs'): html = weasyprint.HTML(filename=html_file) pdf_path = Path(output_dir, html_file.name.replace('.html', '.pdf')) html.write_pdf(pdf_path)
def test_python_render(): """Test rendering with the Python API.""" html = TestHTML(string='<body><img src=pattern.png>', base_url=resource_filename('dummy.html')) css = CSS(string=''' @page { margin: 2px; size: 8px; background: #fff } body { margin: 0; font-size: 0 } img { image-rendering: optimizeSpeed } ''') png_bytes = html.write_png(stylesheets=[css]) pdf_bytes = html.write_pdf(stylesheets=[css]) assert png_bytes.startswith(b'\211PNG\r\n\032\n') assert pdf_bytes.startswith(b'%PDF') check_png_pattern(png_bytes) # TODO: check PDF content? How? class fake_file(object): def __init__(self): self.chunks = [] self.write = self.chunks.append def getvalue(self): return b''.join(self.chunks) png_file = fake_file() html.write_png(png_file, stylesheets=[css]) assert png_file.getvalue() == png_bytes pdf_file = fake_file() html.write_pdf(pdf_file, stylesheets=[css]) assert pdf_file.getvalue() == pdf_bytes with temp_directory() as temp: png_filename = os.path.join(temp, '1.png') pdf_filename = os.path.join(temp, '1.pdf') html.write_png(png_filename, stylesheets=[css]) html.write_pdf(pdf_filename, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes png_filename = os.path.join(temp, '2.png') pdf_filename = os.path.join(temp, '2.pdf') with open(png_filename, 'wb') as png_file: html.write_png(png_file, stylesheets=[css]) with open(pdf_filename, 'wb') as pdf_file: html.write_pdf(pdf_file, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes x2_png_bytes = html.write_png(stylesheets=[css], resolution=192) check_png_pattern(x2_png_bytes, x2=True) pages = list(html.get_png_pages(stylesheets=[css])) assert pages == [(8, 8, png_bytes)] pages = list(html.get_png_pages(stylesheets=[css], resolution=192)) assert pages == [(16, 16, x2_png_bytes)]
def test_low_level_api(): html = TestHTML(string="<body>") css = CSS( string=""" @page { margin: 2px; size: 8px; background: #fff } html { background: #00f; } body { background: #f00; width: 1px; height: 1px } """ ) pdf_bytes = html.write_pdf(stylesheets=[css]) assert pdf_bytes.startswith(b"%PDF") assert html.render([css]).write_pdf() == pdf_bytes png_bytes = html.write_png(stylesheets=[css]) document = html.render([css], enable_hinting=True) page, = document.pages assert page.width == 8 assert page.height == 8 assert document.write_png() == (png_bytes, 8, 8) assert document.copy([page]).write_png() == (png_bytes, 8, 8) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) page.paint(cairo.Context(surface)) file_obj = io.BytesIO() surface.write_to_png(file_obj) check_png_pattern(file_obj.getvalue()) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) context = cairo.Context(surface) # Rotate at the center context.translate(4, 4) context.rotate(-math.pi / 2) context.translate(-4, -4) page.paint(context) file_obj = io.BytesIO() surface.write_to_png(file_obj) check_png_pattern(file_obj.getvalue(), rotated=True) document = html.render([css], enable_hinting=True) page, = document.pages assert (page.width, page.height) == (8, 8) png_bytes, width, height = document.write_png(resolution=192) assert (width, height) == (16, 16) check_png_pattern(png_bytes, x2=True) def png_size(result): png_bytes, width, height = result surface = cairo.ImageSurface.create_from_png(io.BytesIO(png_bytes)) assert (surface.get_width(), surface.get_height()) == (width, height) return width, height document = html.render([css], enable_hinting=True) page, = document.pages assert (page.width, page.height) == (8, 8) # A resolution that is not multiple of 96: assert png_size(document.write_png(resolution=145.2)) == (13, 13) document = TestHTML( string=""" <style> @page:first { size: 5px 10px } @page { size: 6px 4px } p { page-break-before: always } </style> <p></p> <p></p> """ ).render() page_1, page_2 = document.pages assert (page_1.width, page_1.height) == (5, 10) assert (page_2.width, page_2.height) == (6, 4) result = document.write_png() # (Max of both widths, Sum of both heights) assert png_size(result) == (6, 14) assert document.copy([page_1, page_2]).write_png() == result assert png_size(document.copy([page_1]).write_png()) == (5, 10) assert png_size(document.copy([page_2]).write_png()) == (6, 4)
def test_python_render(): """Test rendering with the Python API.""" base_url = resource_filename("dummy.html") html_string = "<body><img src=pattern.png>" css_string = """ @page { margin: 2px; size: 8px; background: #fff } body { margin: 0; font-size: 0 } img { image-rendering: optimizeSpeed } @media screen { img { transform: rotate(-90deg) } } """ html = TestHTML(string=html_string, base_url=base_url) css = CSS(string=css_string) png_bytes = html.write_png(stylesheets=[css]) pdf_bytes = html.write_pdf(stylesheets=[css]) assert png_bytes.startswith(b"\211PNG\r\n\032\n") assert pdf_bytes.startswith(b"%PDF") check_png_pattern(png_bytes) # TODO: check PDF content? How? class fake_file(object): def __init__(self): self.chunks = [] def write(self, data): self.chunks.append(bytes(data[:])) def getvalue(self): return b"".join(self.chunks) png_file = fake_file() html.write_png(png_file, stylesheets=[css]) assert png_file.getvalue() == png_bytes pdf_file = fake_file() html.write_pdf(pdf_file, stylesheets=[css]) assert pdf_file.getvalue() == pdf_bytes with temp_directory() as temp: png_filename = os.path.join(temp, "1.png") pdf_filename = os.path.join(temp, "1.pdf") html.write_png(png_filename, stylesheets=[css]) html.write_pdf(pdf_filename, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes png_filename = os.path.join(temp, "2.png") pdf_filename = os.path.join(temp, "2.pdf") with open(png_filename, "wb") as png_file: html.write_png(png_file, stylesheets=[css]) with open(pdf_filename, "wb") as pdf_file: html.write_pdf(pdf_file, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes x2_png_bytes = html.write_png(stylesheets=[css], resolution=192) check_png_pattern(x2_png_bytes, x2=True) screen_css = CSS(string=css_string, media_type="screen") rotated_png_bytes = html.write_png(stylesheets=[screen_css]) check_png_pattern(rotated_png_bytes, rotated=True) assert ( TestHTML(string=html_string, base_url=base_url, media_type="screen").write_png( stylesheets=[io.BytesIO(css_string.encode("utf8"))] ) == rotated_png_bytes ) assert ( TestHTML( string="<style>%s</style>%s" % (css_string, html_string), base_url=base_url, media_type="screen" ).write_png() == rotated_png_bytes )
def test_low_level_api(): html = TestHTML(string='<body>') css = CSS(string=''' @page { margin: 2px; size: 8px; background: #fff } html { background: #00f; } body { background: #f00; width: 1px; height: 1px } ''') pdf_bytes = html.write_pdf(stylesheets=[css]) assert pdf_bytes.startswith(b'%PDF') assert html.render([css]).write_pdf() == pdf_bytes png_bytes = html.write_png(stylesheets=[css]) document = html.render([css], enable_hinting=True) page, = document.pages assert page.width == 8 assert page.height == 8 assert document.write_png() == (png_bytes, 8, 8) assert document.copy([page]).write_png() == (png_bytes, 8, 8) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) page.paint(cairo.Context(surface)) file_obj = io.BytesIO() surface.write_to_png(file_obj) check_png_pattern(file_obj.getvalue()) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) context = cairo.Context(surface) # Rotate at the center context.translate(4, 4) context.rotate(-math.pi / 2) context.translate(-4, -4) page.paint(context) file_obj = io.BytesIO() surface.write_to_png(file_obj) check_png_pattern(file_obj.getvalue(), rotated=True) document = html.render([css], enable_hinting=True) page, = document.pages assert (page.width, page.height) == (8, 8) png_bytes, width, height = document.write_png(resolution=192) assert (width, height) == (16, 16) check_png_pattern(png_bytes, x2=True) def png_size(result): png_bytes, width, height = result surface = cairo.ImageSurface.create_from_png(io.BytesIO(png_bytes)) assert (surface.get_width(), surface.get_height()) == (width, height) return width, height document = html.render([css], enable_hinting=True) page, = document.pages assert (page.width, page.height) == (8, 8) # A resolution that is not multiple of 96: assert png_size(document.write_png(resolution=145.2)) == (13, 13) document = TestHTML(string=''' <style> @page:first { size: 5px 10px } @page { size: 6px 4px } p { page-break-before: always } </style> <p></p> <p></p> ''').render() page_1, page_2 = document.pages assert (page_1.width, page_1.height) == (5, 10) assert (page_2.width, page_2.height) == (6, 4) result = document.write_png() # (Max of both widths, Sum of both heights) assert png_size(result) == (6, 14) assert document.copy([page_1, page_2]).write_png() == result assert png_size(document.copy([page_1]).write_png()) == (5, 10) assert png_size(document.copy([page_2]).write_png()) == (6, 4)
def test_python_render(): """Test rendering with the Python API.""" base_url = resource_filename('dummy.html') html_string = '<body><img src=pattern.png>' css_string = ''' @page { margin: 2px; size: 8px; background: #fff } body { margin: 0; font-size: 0 } img { image-rendering: pixelated } @media screen { img { transform: rotate(-90deg) } } ''' html = TestHTML(string=html_string, base_url=base_url) css = CSS(string=css_string) png_bytes = html.write_png(stylesheets=[css]) pdf_bytes = html.write_pdf(stylesheets=[css]) assert png_bytes.startswith(b'\211PNG\r\n\032\n') assert pdf_bytes.startswith(b'%PDF') check_png_pattern(png_bytes) # TODO: check PDF content? How? class fake_file(object): def __init__(self): self.chunks = [] def write(self, data): self.chunks.append(bytes(data[:])) def getvalue(self): return b''.join(self.chunks) png_file = fake_file() html.write_png(png_file, stylesheets=[css]) assert png_file.getvalue() == png_bytes pdf_file = fake_file() html.write_pdf(pdf_file, stylesheets=[css]) assert pdf_file.getvalue() == pdf_bytes with temp_directory() as temp: png_filename = os.path.join(temp, '1.png') pdf_filename = os.path.join(temp, '1.pdf') html.write_png(png_filename, stylesheets=[css]) html.write_pdf(pdf_filename, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes png_filename = os.path.join(temp, '2.png') pdf_filename = os.path.join(temp, '2.pdf') with open(png_filename, 'wb') as png_file: html.write_png(png_file, stylesheets=[css]) with open(pdf_filename, 'wb') as pdf_file: html.write_pdf(pdf_file, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes x2_png_bytes = html.write_png(stylesheets=[css], resolution=192) check_png_pattern(x2_png_bytes, x2=True) screen_css = CSS(string=css_string, media_type='screen') rotated_png_bytes = html.write_png(stylesheets=[screen_css]) check_png_pattern(rotated_png_bytes, rotated=True) assert TestHTML(string=html_string, base_url=base_url, media_type='screen').write_png( stylesheets=[io.BytesIO(css_string.encode('utf8')) ]) == rotated_png_bytes assert TestHTML(string='<style>%s</style>%s' % (css_string, html_string), base_url=base_url, media_type='screen').write_png() == rotated_png_bytes
def test_python_render(): """Test rendering with the Python API.""" base_url = resource_filename('dummy.html') html_string = '<body><img src=pattern.png>' css_string = ''' @page { margin: 2px; size: 8px; background: #fff } body { margin: 0; font-size: 0 } img { image-rendering: optimizeSpeed } @media screen { img { transform: rotate(-90deg) } } ''' html = TestHTML(string=html_string, base_url=base_url) css = CSS(string=css_string) png_bytes = html.write_png(stylesheets=[css]) pdf_bytes = html.write_pdf(stylesheets=[css]) assert png_bytes.startswith(b'\211PNG\r\n\032\n') assert pdf_bytes.startswith(b'%PDF') check_png_pattern(png_bytes) # TODO: check PDF content? How? class fake_file(object): def __init__(self): self.chunks = [] self.write = self.chunks.append def getvalue(self): return b''.join(self.chunks) png_file = fake_file() html.write_png(png_file, stylesheets=[css]) assert png_file.getvalue() == png_bytes pdf_file = fake_file() html.write_pdf(pdf_file, stylesheets=[css]) assert pdf_file.getvalue() == pdf_bytes with temp_directory() as temp: png_filename = os.path.join(temp, '1.png') pdf_filename = os.path.join(temp, '1.pdf') html.write_png(png_filename, stylesheets=[css]) html.write_pdf(pdf_filename, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes png_filename = os.path.join(temp, '2.png') pdf_filename = os.path.join(temp, '2.pdf') with open(png_filename, 'wb') as png_file: html.write_png(png_file, stylesheets=[css]) with open(pdf_filename, 'wb') as pdf_file: html.write_pdf(pdf_file, stylesheets=[css]) assert read_file(png_filename) == png_bytes assert read_file(pdf_filename) == pdf_bytes x2_png_bytes = html.write_png(stylesheets=[css], resolution=192) check_png_pattern(x2_png_bytes, x2=True) screen_css = CSS(string=css_string, media_type='screen') rotated_png_bytes = html.write_png(stylesheets=[screen_css]) check_png_pattern(rotated_png_bytes, rotated=True) assert TestHTML( string=html_string, base_url=base_url, media_type='screen' ).write_png( stylesheets=[io.BytesIO(css_string.encode('utf8'))] ) == rotated_png_bytes assert TestHTML( string='<style>%s</style>%s' % (css_string, html_string), base_url=base_url, media_type='screen' ).write_png() == rotated_png_bytes