五月春生 2024-04-13 10:29 采纳率: 66.7%
浏览 5

python的PyPDF2包读取pdf文件页面尺寸的异常问题:A4页面读成A3尺寸,如何解决?(开发工具-pycharm)

代码如下,经查看页面尺寸,左下角显示的是A4尺寸

img

img

但用python的PyPDF2包读取时,发现奇怪现象。这些A4页面均读取为A3尺寸。以下是将两A4页面(其中一页会读取为A3)合并后,读取的情况


import PyPDF2


def GetPdfsize(filepath):
    """
    根据传入的pdf文件路径,返回该文件的尺寸(长和宽),较小的值在左。注意要判断只接收pdf文件
    :param filepath:
    :return: 列表形式返回文件内页面尺寸,每一页尺寸一个元组,是列表中的一项。
    """
    list_size = []
    pdf = PyPDF2.PdfReader(filepath)
    for page in pdf.pages:

        w = float(page.mediabox.width) * 0.352
        h = float(page.mediabox.height) * 0.352
        # 一律设置尺寸两数值的左边为较小值。
        if w > h:
            w, h = h, w
        list_size.append((round(w), round(h)))
    print(list_size)  # [(315, 446)]
    return list_size


# 打开PDF文件
with open(r"C:\Users\xcxc\Desktop\A3A4.pdf", 'rb') as file:
    reader = PyPDF2.PdfReader(file)

    # 遍历每一页
    for page in reader.pages:
        # 获取页面的宽度和高度
        width, height = page.mediabox.width, page.mediabox.height
        print(f"页面尺寸: 宽度 = {width}, 高度 = {height}")  # Page Size: Width = 1267.41, Height = 896.203

GetPdfsize(r"C:\Users\xcxc\Desktop\A3A4.pdf")

'''
页面尺寸: 宽度 = 1267.41, 高度 = 896.203
页面尺寸: 宽度 = 595.276, 高度 = 841.89
[(315, 446), (210, 296)]
'''
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 10:29
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,看起来可能是由于PDF元数据中的媒体盒(MediaBox)尺寸被错误地设置为了A3尺寸。媒体盒定义了PDF页面的边界,而实际内容可能小于这个区域。在这种情况下,我们可以尝试从PDF的其他部分获取正确的页面尺寸,例如 CropBox 或者 ArtBox。

    下面是一个改进的 GetPdfsize 函数,它首先尝试从 CropBox 获得尺寸,如果 CropBox 不可用,则使用 MediaBox 的小边作为近似值。这样可以更准确地反映页面的实际内容尺寸。

    import PyPDF2
    
    def GetPdfsize(filepath):
        """
        根据传入的pdf文件路径,返回该文件的尺寸(长和宽),较小的值在左。注意要判断只接收pdf文件
        :param filepath:
        :return: 列表形式返回文件内页面尺寸,每一页尺寸一个元组,是列表中的一项。
        """
        list_size = []
        pdf = PyPDF2.PdfReader(filepath)
        for page in pdf.pages:
    
            # 尝试从 CropBox 获取尺寸,如果不可用则使用 MediaBox
            try:
                crop_box_width, crop_box_height = page.cropbox.width, page.cropbox.height
            except AttributeError:
                crop_box_width, crop_box_height = None, None
    
            mediabox_width, mediabox_height = page.mediabox.width, page.mediabox.height
    
            # 使用 CropBox 如果可用,否则使用 MediaBox 的小边
            width = min(mediabox_width, crop_box_width or mediabox_width)
            height = min(mediabox_height, crop_box_height or mediabox_height)
    
            # 一律设置尺寸两数值的左边为较小值。
            if width > height:
                width, height = height, width
            list_size.append((round(width), round(height)))
    
        print(list_size)
        return list_size
    
    # 打开PDF文件
    with open(r"C:\Users\xcxc\Desktop\A3A4.pdf", 'rb') as file:
        reader = PyPDF2.PdfReader(file)
    
        # 遍历每一页
        for page in reader.pages:
            # 获取页面的宽度和高度
            width, height = page.mediabox.width, page.mediabox.height
            print(f"页面尺寸: 宽度 = {width}, 高度 = {height}")
    
    GetPdfsize(r"C:\Users\xcxc\Desktop\A3A4.pdf")
    

    这段代码应该能更准确地获取页面的实际尺寸。如果 CropBox 不存在,它会使用 MediaBox 的小边作为近似值,这通常比完全依赖 MediaBox 更准确。然而,这种方法并不完美,因为有些 PDF 文件可能会有多个 Box,每个 Box 可能对应不同的裁剪区域。在这种情况下,可能需要进一步分析 PDF 元数据来找到最合适的尺寸。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图