Question

I managed to create a pdf report using pycairo. The cover page was fine but the second page I need to change its orientation depend on the size of a diagram. How can I set one page landscape and one page portrait using pycairo. Thank you.

Here is my function to generate the second page:

def draw_pedigree(ctx, path_to_image, left, top, container_width, container_height):
# create a new page to draw a pedigree
ctx.show_page()
ctx.save()

# load image from input path
image_surface = cairo.ImageSurface.create_from_png(path_to_image)

img_height = image_surface.get_height()
img_width = image_surface.get_width()

print "img_height: %d" % img_height
print "img_width: %d" % img_width
print "container_height: %d" % container_height
print "container_width: %d" % container_width

if (img_width <= container_width and img_height <= container_height): # this case the image don't need to be scaled or rotated
    ctx.translate(left, top)
    ctx.set_source_surface(image_surface)
    ctx.paint()
    ctx.restore()
else: # this case the image need to be scaled

    # check should image be rotated or not
    if(float(img_height)/float(img_width) <= 0.875): # rotate the image
        width_ratio = float(container_height) / float(img_width)
        height_ratio = float(container_width) / float(img_height)
        scale_xy = min(height_ratio, width_ratio)
        print "scale_xy: %f" % scale_xy

        ctx.translate(545, top)
        ctx.rotate(math.pi/2)

        if(scale_xy < 1):
            ctx.scale(scale_xy, scale_xy)

        ctx.set_source_surface(image_surface)
        ctx.paint()
        ctx.restore()
    else: # don't rotate the image
        # calculate proportional scaling
        width_ratio = float(container_width) / float(img_width)
        height_ratio = float(container_height) / float(img_height)
        scale_xy = min(height_ratio, width_ratio)
        ctx.scale(scale_xy, scale_xy)
        ctx.translate(left, top)
        ctx.set_source_surface(image_surface)
        ctx.paint()
        ctx.restore()

enter image description here

Was it helpful?

Solution

The PDF surface has a set_size method.

eg

# Set A4 portrait page size
surface.set_size(595, 842)

# Set A4 landscape page size
surface.set_size(842, 595)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top