knx888 发表于 2024-8-11 12:56

python 转换图片后不完整求解

本帖最后由 knx888 于 2024-8-11 22:46 编辑

如下代码,请前辈指点

import fitz# PyMuPDF
from PIL import Image

def convert_pdf_to_images(pdf_path, resolution):
    # 打开 PDF 文件
    pdf_document = fitz.open(pdf_path)

    # 存储所有转换后的图片
    images = []

    # 遍历 PDF 中的每一页
    for page_number in range(len(pdf_document)):
      page = pdf_document

      # 获取页面的原始大小(以点为单位)
      zoom_x = resolution / page.rect.width
      zoom_y = resolution / page.rect.height

      # 将 PDF 页面转换为图片
      pix = page.get_pixmap(matrix=mat)

      # 使用 PIL 的 Image 对象打开图片
      image = image = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)

      # 将图片添加到列表中
      images.append(image)

    # 合并所有图片
    total_height = sum(image.size for image in images)
    combined_image = Image.new('RGB', (images.size, total_height))

    current_height = 0
    for image in images:
      combined_image.paste(image, (0, current_height))
      current_height += image.size

    # 关闭 PDF 文件
    pdf_document.close()

    return combined_image

combined_image = convert_pdf_to_images(r"F:\pdf处理\处理.pdf", resolution=3396)

# 保存合并后的图片
combined_image.save(r"F:\pdf处理\处理.png")

vista_info 发表于 2024-8-11 13:10

本帖最后由 vista_info 于 2024-8-11 13:16 编辑

建议检查imagesize数据是否符合预期,比如自行在ps新建100*200的图片若干(pdf页面等大),检查代码运行过程中变量是否正确,以及图片结果是否合理;
或是页面缩放统一分辨率这里缩放后每页状态。
另附别人在github上开源的同类工具供参考https://github.com/yuanqimanong/imgconvert-tool

knx888 发表于 2024-8-11 14:31

vista_info 发表于 2024-8-11 13:10
建议检查imagesize数据是否符合预期,比如自行在ps新建100*200的图片若干(pdf页面等大),检查代码运行过 ...

好的,谢谢前辈指点。

huluwa123 发表于 2024-8-11 16:17

您提供的Python代码使用PyMuPDF库(fitz模块)将PDF文件转换为图片,并将这些图片合并成一张长图。代码逻辑是正确的,但如果在合并图片时遇到最后一张图片显示不完整的问题,可能是由以下原因造成的:
1. 分辨率设置: resolution 参数可能不适合PDF的最后一页。如果最后一页的宽度或高度大于其他页面,即使使用了最小缩放比例,也可能无法完整显示。
2. 图片尺寸计算:在计算 zoom_x 和 zoom_y 时,如果使用 page.rect.width 和 page.rect.height ,这可能不包括PDF页面的裁剪边距。如果最后一页的实际内容区域比其他页面大,这可能导致显示不完整。
3. 图片合并逻辑:在合并图片时,如果最后一张图片的底部与 total_height 不匹配,可能导致显示问题。
为了解决这个问题,您可以尝试以下步骤:
检查PDF页面尺寸:确保您了解PDF中每一页的实际内容尺寸,特别是最后一页。
调整分辨率:尝试调整 resolution 参数,以确保所有页面都能以合适的大小转换。
修改缩放逻辑:在计算 zoom 时,可以考虑添加一个额外的缩放因子,以确保所有页面都能完整显示。
检查图片合并:在合并图片时,确保 current_height 的累加是正确的,并且没有超过 total_height 。
此外,您的代码中有一个小错误,在创建 Image.frombytes 对象时,使用了两次 image = 。这可能是一个笔误,正确的代码应该是:
image = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
修正这个错误后,再次运行代码,看看是否解决了最后一张图片显示不完整的问题。如果问题依旧,可能需要进一步调试或调整代码逻辑。

knx888 发表于 2024-8-11 17:56

huluwa123 发表于 2024-8-11 16:17
您提供的Python代码使用PyMuPDF库(fitz模块)将PDF文件转换为图片,并将这些图片合 ...

感谢前辈指点。

vista_info 发表于 2024-8-11 19:20

knx888 发表于 2024-8-11 14:31
好的,谢谢前辈指点。

说前辈有些言重了,碰巧思考过类似的需求
页: [1]
查看完整版本: python 转换图片后不完整求解