You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Flet容器无法显示PDF转换的PIL图片且无报错?

问题原因与解决方案

核心原因

Flet的ft.Image组件不支持直接传入PIL Image对象作为src参数。你通过pdf2image.convert_from_path()得到的viewer是PIL Image列表,直接把viewer[0]赋值给src时,Flet无法识别这个类型,所以容器没有显示内容也不会触发报错。

解决方法

需要把PIL Image转换为Flet Image组件能识别的格式,以下是两种常用方案:

方案1:转为字节流(推荐,无需临时文件)

使用io模块将PIL图片转为字节数组,通过src_bytes参数传递给ft.Image:

import flet as ft
import pdf2image
import io  # 导入io模块

def main(page: ft.Page):
    fullname = r'Your Full Path To the Doc.pdf'
    viewer = pdf2image.convert_from_path(fullname)

    def btn_Click(e):
        # 将PIL图片转为字节流
        img_byte_arr = io.BytesIO()
        viewer[0].save(img_byte_arr, format='PNG')  # 可替换为JPEG等格式
        img_byte_arr = img_byte_arr.getvalue()
        
        cont.content = ft.Image(
            src_bytes=img_byte_arr,
            fit=ft.ImageFit.FILL,
        )
        page.update()

    cont = ft.Container(
        height=0.4*page.height,
        width=0.4*page.width,
        border=ft.border.all(3, ft.colors.RED),
    )

    btn = ft.IconButton(
        icon=ft.icons.UPLOAD_FILE,
        on_click=btn_Click,
        icon_size=35,
    )

    page.add(ft.Column([cont, btn], horizontal_alignment="center"))
    page.window_maximized = True
    page.horizontal_alignment = "center"
    page.scroll = ft.ScrollMode.AUTO
    page.update()

ft.app(target=main, assets_dir="assets")

方案2:保存为临时文件(适合大文件)

将PIL图片保存到临时目录,用文件路径作为src参数:

import flet as ft
import pdf2image
import tempfile
import os

def main(page: ft.Page):
    fullname = r'Your Full Path To the Doc.pdf'
    viewer = pdf2image.convert_from_path(fullname)
    temp_file_path = None

    def btn_Click(e):
        nonlocal temp_file_path
        # 清理之前的临时文件
        if temp_file_path and os.path.exists(temp_file_path):
            os.remove(temp_file_path)
        
        # 保存PIL图片为临时文件
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as temp_file:
            viewer[0].save(temp_file, format='PNG')
            temp_file_path = temp_file.name
        
        cont.content = ft.Image(
            src=temp_file_path,
            fit=ft.ImageFit.FILL,
        )
        page.update()

    # 程序退出时清理临时文件
    def on_close(e):
        if temp_file_path and os.path.exists(temp_file_path):
            os.remove(temp_file_path)
    
    page.on_window_event = on_close

    cont = ft.Container(
        height=0.4*page.height,
        width=0.4*page.width,
        border=ft.border.all(3, ft.colors.RED),
    )

    btn = ft.IconButton(
        icon=ft.icons.UPLOAD_FILE,
        on_click=btn_Click,
        icon_size=35,
    )

    page.add(ft.Column([cont, btn], horizontal_alignment="center"))
    page.window_maximized = True
    page.horizontal_alignment = "center"
    page.scroll = ft.ScrollMode.AUTO
    page.update()

ft.app(target=main, assets_dir="assets")

额外注意点

  • 初始化容器时,0.4*page.height和0.4*page.width是在窗口最大化前计算的,实际尺寸可能不符合预期。可以把容器尺寸设置改为响应式,或者在page.window_maximized = True之后再设置容器尺寸。
  • 如果PDF文件较大,pdf2image.convert_from_path()会占用较多内存,建议按需转换单页,而不是一次性转换所有页。

内容的提问来源于stack exchange,提问作者eljamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:15