python 在reportlab中有没有一种方法可以使用鸭嘴兽动态地将图像适配到一个框架中?

vu8f3i0k  于 2023-03-21  发布在  Python
关注(0)|答案(2)|浏览(181)

我正在使用reportlab生成一些pdf。我需要追加一些图像。旧脚本依赖于一个已弃用的库将这些图像的pdf版本添加到新的pdf中,但我认为我应该能够将它们添加为png,如下所示:

doc = SimpleDocTemplate("GBD Country Report - " + country_name + ".pdf",
                            pagesize=letter,
                            rightMargin=0.25 * inch, leftMargin=0.25 * inch,
                            topMargin=0.75 * inch, bottomMargin=0.25 * inch)
 elements = []
 elements.append(Image(data_dir + 'figure1.png'), width=1, height=1)
 doc.build(elements)

但是,当我这样做时,我得到了这个错误:reportlab.platypus.doctemplate.LayoutError: Flowable <Image at 0x10bd6ae10 frame=cod filename=.../figure1.png>(28.346456692913385 x 612.0) too large on page 1 in frame 'cod'(475.2 x 90.0*) of template 'FirstPage'.我已经尝试添加更改宽度和高度参数多次,但它没有帮助.有什么方法可以动态修改图表图像的宽度和高度,使它们适合框架/模板?

1tuwyuhd

1tuwyuhd1#

这是一个很老的问题。但我找不到一个我满意的解决方案,所以我想我会分享我的毛定制解决方案。请注意,你需要交换信件为任何模板大小的对象,你导入。你还需要改变数字80和300,以适应自己的利润率偏好,但我发现这些有效。

# New dependency
import matplotlib.image as img

# Inferred dependencies of OP
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Image

# Read in image as array to assess dimensions
image = img.imread(pic_fp)

# Compare the reportlab template size object with the image to understand
# which dimension needs to be changed the most to make it fit on a page
width_is_restriction = (image.shape[0] / letter[1]) < (image.shape[1] / letter[0])

if width_is_restriction:
    new_width = letter[0] - 80 # Add small margins to sides
    new_height = image.shape[0] * (new_width / image.shape[1])

else:
    new_height = letter[1] - 300 # Add margins for titles, header etc
    new_width = image.shape[1] * (new_height / image.shape[0])

img_flowable = Image(pic_fp, width=new_width, height=new_height),
iezvtpos

iezvtpos2#

只需将您的宽度和高度乘以您所需的单位,即(宽度=1* 英寸,高度=1* 英寸)。
测量单位可通过以下方式引入:从reportlab.lib导入英寸单位。
祝你好运!

相关问题