操作现有PDF中的表格

操作现有 PDF 中的表格

Aspose.PDF for Python via .NET 支持的最早功能之一是其处理表格的能力,并且它为从头生成或已有的 PDF 文件中添加表格提供了极大的支持。在这个新版本中,我们实现了搜索和解析已经存在于 PDF 文档页面上的简单表格的新功能。一个名为 TableAbsorber 的新类提供了这些能力。TableAbsorber 的用法与现有的 TextFragmentAbsorber 类非常相似。以下代码片段展示了更新特定表格单元格内容的步骤。


    import aspose.pdf as ap

    # 加载现有 PDF 文件
    pdf_document = ap.Document(input_file)
    # 创建 TableAbsorber 对象以查找表格
    absorber = ap.text.TableAbsorber()
    # 使用吸收器访问第一页
    absorber.visit(pdf_document.pages[1])
    # 获取页面上第一个表格的访问权限,第一个单元格及其中的文本片段
    fragment = absorber.table_list[0].row_list[0].cell_list[0].text_fragments[1]
    # 更改单元格中第一个文本片段的文本
    fragment.text = "hi world"
    pdf_document.save(output_file)

在 PDF 文档中用新表替换旧表

如果您需要查找特定表并用所需表替换它,可以使用 TableAbsorber 类的 replace() 方法来实现。以下示例演示了在 PDF 文档中替换表的功能:


    import aspose.pdf as ap

    # 加载现有的 PDF 文档
    pdf_document = ap.Document(input_file)
    # 创建 TableAbsorber 对象以查找表
    absorber = ap.text.TableAbsorber()
    # 使用吸收器访问第一页
    absorber.visit(pdf_document.pages[1])
    # 获取页面上的第一个表
    table = absorber.table_list[0]
    # 创建新表
    new_table = ap.Table()
    new_table.column_widths = "100 100 100"
    new_table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 1)

    row = new_table.rows.add()
    row.cells.add("列 1")
    row.cells.add("列 2")
    row.cells.add("列 3")

    # 用新表替换表
    absorber.replace(pdf_document.pages[1], table, new_table)
    # 保存文档
    pdf_document.save(output_file)

如何确定表格是否会在当前页面中断

此代码生成一个包含表格的PDF文档,计算页面上的可用空间,并检查向表格添加更多行是否会因空间限制而导致分页符。结果将保存到输出文件中。


    import aspose.pdf as ap

    # 实例化一个PDF类对象
    pdf = ap.Document()
    # 添加一个部分到PDF文档的部分集合中
    page = pdf.pages.add()
    # 实例化一个表格对象
    table1 = ap.Table()
    table1.margin.top = 300
    # 在所需部分的段落集合中添加表格
    page.paragraphs.add(table1)
    # 设置表格的列宽
    table1.column_widths = "100 100 100"
    # 使用BorderInfo对象设置默认单元格边框
    table1.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
    # 使用另一个自定义的BorderInfo对象设置表格边框
    table1.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
    # 创建MarginInfo对象并设置其左、下、右和上边距
    margin = ap.MarginInfo()
    margin.top = 5
    margin.left = 5
    margin.right = 5
    margin.bottom = 5
    # 将默认单元格内边距设置为MarginInfo对象
    table1.default_cell_padding = margin
    # 如果将计数器增加到17,表格将会中断
    # 因为它不能再容纳于这个页面上
    for row_counter in range(0, 17):
        # 在表格中创建行,然后在行中创建单元格
        row1 = table1.rows.add()
        row1.cells.add("col " + str(row_counter) + ", 1")
        row1.cells.add("col " + str(row_counter) + ", 2")
        row1.cells.add("col " + str(row_counter) + ", 3")
    # 获取页面高度信息
    page_height = pdf.page_info.height
    # 获取页面顶部和底部边距、表格顶部边距和表格高度的总高度信息
    total_objects_height = page.page_info.margin.top + page.page_info.margin.bottom + table1.margin.top + \
                           table1.get_height(None)
    # 显示页面高度、表格高度、表格顶部边距以及页面顶部和底部边距信息
    print("PDF文档高度 = " + str(pdf.page_info.height) + "\n顶部边距信息 = " + str(page.page_info.margin.top)
          + "\n底部边距信息 = " + str(page.page_info.margin.bottom) + "\n\n表格顶部边距信息 = "
          + str(table1.margin.top) + "\n平均行高 = " + str(table1.rows[0].min_row_height) + " \n表格高度 "
          + str(table1.get_height(None)) + "\n ----------------------------------------" + "\n总页面高度 ="
          + str(page_height) + "\n包括表格的累计高度 =" + str(total_objects_height))
    # 检查我们是否从页面高度中扣除页面顶部边距+页面底部边距
    # + 表格顶部边距和表格高度,且小于10(平均行高可以大于10)
    if (page_height - total_objects_height) <= 10:
        # 如果值小于10,则显示消息。
        # 这表明不能再放置另一行,如果我们添加新行,表格将会中断。
        # 这取决于行高值。
        print("页面高度 - 对象高度 < 10,因此表格将会中断")
    # 保存pdf文档
    pdf.save(output_file)

在表中添加重复列

Aspose.Pdf.Table 类中,你可以设置 repeating_rows_count,如果表格在垂直方向上太长而溢出到下一页,它将重复行。然而,在某些情况下,表格太宽而无法适应单个页面,需要在下一页继续。为了实现这个目的,我们在 Aspose.Pdf.Table 类中实现了 repeating_columns_count 属性。设置此属性将导致表格按列方式分隔至下一页,并在下一页的开头重复给定的列数。以下代码片段展示了 repeating_columns_count 属性的用法:


    import aspose.pdf as ap

    # 创建一个新文档
    doc = ap.Document()
    page = doc.pages.add()
    # 实例化一个占据整个页面的外部表
    outer_table = ap.Table()
    outer_table.column_widths = "100%"
    outer_table.horizontal_alignment = ap.HorizontalAlignment.LEFT
    # 实例化一个将嵌套在 outerTable 内的表对象,该对象将在同一页面内拆分
    my_table = ap.Table()
    my_table.broken = ap.TableBroken.VERTICAL_IN_SAME_PAGE
    my_table.column_adjustment = ap.ColumnAdjustment.AUTO_FIT_TO_CONTENT
    # 将 outerTable 添加到页面段落
    # 将我的表格添加到 outerTable
    page.paragraphs.add(outer_table)
    body_row = outer_table.rows.add()
    body_cell = body_row.cells.add()
    body_cell.paragraphs.add(my_table)
    my_table.repeating_columns_count = 5
    page.paragraphs.add(my_table)
    # 添加标题行
    row = my_table.rows.add()
    row.cells.add("header 1")
    row.cells.add("header 2")
    row.cells.add("header 3")
    row.cells.add("header 4")
    row.cells.add("header 5")
    row.cells.add("header 6")
    row.cells.add("header 7")
    row.cells.add("header 11")
    row.cells.add("header 12")
    row.cells.add("header 13")
    row.cells.add("header 14")
    row.cells.add("header 15")
    row.cells.add("header 16")
    row.cells.add("header 17")
    for row_counter in range(0, 6):
        # 在表中创建行,然后在行中创建单元格
        row1 = my_table.rows.add()
        row1.cells.add("col " + str(row_counter) + ", 1")
        row1.cells.add("col " + str(row_counter) + ", 2")
        row1.cells.add("col " + str(row_counter) + ", 3")
        row1.cells.add("col " + str(row_counter) + ", 4")
        row1.cells.add("col " + str(row_counter) + ", 5")
        row1.cells.add("col " + str(row_counter) + ", 6")
        row1.cells.add("col " + str(row_counter) + ", 7")
        row1.cells.add("col " + str(row_counter) + ", 11")
        row1.cells.add("col " + str(row_counter) + ", 12")
        row1.cells.add("col " + str(row_counter) + ", 13")
        row1.cells.add("col " + str(row_counter) + ", 14")
        row1.cells.add("col " + str(row_counter) + ", 15")
        row1.cells.add("col " + str(row_counter) + ", 16")
        row1.cells.add("col " + str(row_counter) + ", 17")
    doc.save(output_file)