首页 > 解决方案 > 将一个文件重新制作成另一个文件

问题描述

我使用了图书馆。首先,我在某些页面上从 pdf 输出一个表格。然后我遍历表中的所有行并将行数据添加到工作表中。

    import 
from openpyxl import Workbook

with pdfplumber.open("Pdffile.pdf") as p:
    workbook = Workbook()  # New blank Excel workbook
    sheet = workbook.active  # activation sheet
    for i in range(4,6):  # Traverse 4 pages-6 page
        page = p.pages[i]
    for row in table:  # Traverse all rows
        print(row)
        sheet.append(row)  # Append write data by row
    workbook.save("Excel1.xlsx")  # Save file named Excel
    print("The first%d page PDF Extraction complete" % i)  # Prompt extraction progress

但结果,我得到了最后一个指定的页面,而不是全部。我想错误是在原始遍历中。但以什么方式?

在表格中显示了所有需要的页面。但在原始的,它是最后一个。

标签: python

解决方案


根据OP的评论编辑答案。通过删除隐藏的垂直线改进了表格提取。为了在缺少最左侧列的页面上保留表格的结构,您可以通过在写入 Excel 之前将缺失的单元格添加到左侧的该行来处理该问题。我假设所需的列数是 6,并且只有最左边的列会丢失。更新后的代码将变为:

import pdfplumber
from openpyxl import Workbook


def keep_visible_lines(obj):
    """If the object is a hidden line, remove it."""
    if obj["object_type"] == "rect":
        return obj["non_stroking_color"] == 0

    return True


with pdfplumber.open("Pdffile.pdf") as pdf:
    workbook = Workbook()
    sheet = workbook.active

    for page in pdf.pages:
        page = page.filter(keep_visible_lines)
        table = page.extract_table()

        for row in table:
            sheet.append(([None] * (6 - len(row))) + row)

        workbook.save("Excel1.xlsx")

原来的

用于写入工作表的 for 循环位于页面 for 循环之外。以下代码将解决该问题。

import pdfplumber
from openpyxl import Workbook

with pdfplumber.open("Pdffile.pdf") as p:
    workbook = Workbook()  # New blank Excel workbook
    sheet = workbook.active  # activation sheet
    for i in range(4,6):  # Traverse 4 pages-6 page
        page = p.pages[i]
        table = page.extract_table()  # Extract table data
        print(table)
        for row in table:  # Traverse all rows
            print(row)
            sheet.append(row)  # Append write data by row
        workbook.save("Excel1.xlsx")  # Save file named Excel
        print("The first%d page PDF Extraction complete" % i)  # Prompt extraction progress

推荐阅读