使用Python通过.NET操作PDF文档

在 Python 中操作 PDF 文档

验证 PDF 文档是否符合 PDF A 标准 (A 1A 和 A 1B)

要验证 PDF 文档是否兼容 PDF/A-1a 或 PDF/A-1b,请使用 Document 类的 validate 方法。此方法允许您指定保存结果的文件名称以及所需的验证类型 PdfFormat 枚举:PDF_A_1A 或 PDF_A_1B。

以下代码片段向您展示如何验证 PDF 文档是否符合 PDF/A-1A。


    import aspose.pdf as ap

    # 打开文档
    document = ap.Document(input_pdf)

    # 验证 PDF 是否符合 PDF/A-1a
    document.validate(output_xml, ap.PdfFormat.PDF_A_1A)

以下代码片段向您展示如何验证 PDF 文档是否符合 PDF/A-1b。


    import aspose.pdf as ap

    # 打开文档
    document = ap.Document(input_pdf)

    # 验证 PDF 是否符合 PDF/A-1b
    document.validate(output_xml, ap.PdfFormat.PDF_A_1B)

使用目录

向现有 PDF 添加目录

PDF 中的目录(TOC)代表“目录”。它是一项功能,通过提供文档各个部分和标题的概览,允许用户快速浏览文档。

要向现有的 PDF 文件添加目录,请使用 aspose.pdf 命名空间中的 Heading 类。aspose.pdf 命名空间可以创建新 PDF 文件,也可以操作现有 PDF 文件。要向现有的 PDF 添加目录,请使用 Aspose.Pdf 命名空间。以下代码片段展示了如何使用 Python 通过 .NET 在现有 PDF 文件中创建目录。


    import aspose.pdf as ap

    # 加载现有的 PDF 文件
    doc = ap.Document(input_pdf)

    # 访问 PDF 文件的第一页
    tocPage = doc.pages.insert(1)

    # 创建对象以表示目录信息
    tocInfo = ap.TocInfo()
    title = ap.text.TextFragment("目录")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD

    # 设置目录的标题
    tocInfo.title = title
    tocPage.toc_info = tocInfo

    # 创建将用作目录元素的字符串对象
    titles = ["第一页", "第二页", "第三页", "第四页"]
    for i in range(0, 2):
        # 创建 Heading 对象
        heading2 = ap.Heading(1)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = tocPage
        heading2.segments.append(segment2)

        # 指定标题对象的目标页面
        heading2.destination_page = doc.pages[i + 2]

        # 目标页面
        heading2.top = doc.pages[i + 2].rect.height

        # 目标坐标
        segment2.text = titles[i]

        # 将标题添加到包含目录的页面
        tocPage.paragraphs.add(heading2)

    # 保存更新后的文档
    doc.save(output_pdf)

为不同的目录级别设置不同的TabLeaderType

Aspose.PDF for Python还允许为不同的目录级别设置不同的TabLeaderType。您需要设置TocInfoline_dash属性。


    import aspose.pdf as ap

    doc = ap.Document()
    tocPage = doc.pages.add()
    toc_info = ap.TocInfo()

    # 设置LeaderType
    toc_info.line_dash = ap.text.TabLeaderType.SOLID
    title = ap.text.TextFragment("目录")
    title.text_state.font_size = 30
    toc_info.title = title

    # 将列表部分添加到Pdf文档的部分集合中
    tocPage.toc_info = toc_info
    # 通过设置左边距和
    # 每个级别的文本格式设置来定义四级列表的格式

    toc_info.format_array_length = 4
    toc_info.format_array[0].margin.left = 0
    toc_info.format_array[0].margin.right = 30
    toc_info.format_array[0].line_dash = ap.text.TabLeaderType.DOT
    toc_info.format_array[0].text_state.font_style = ap.text.FontStyles.BOLD | ap.text.FontStyles.ITALIC
    toc_info.format_array[1].margin.left = 10
    toc_info.format_array[1].margin.right = 30
    toc_info.format_array[1].line_dash = 3
    toc_info.format_array[1].text_state.font_size = 10
    toc_info.format_array[2].margin.left = 20
    toc_info.format_array[2].margin.right = 30
    toc_info.format_array[2].text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.format_array[3].line_dash = ap.text.TabLeaderType.SOLID
    toc_info.format_array[3].margin.left = 30
    toc_info.format_array[3].margin.right = 30
    toc_info.format_array[3].text_state.font_style = ap.text.FontStyles.BOLD

    # 在Pdf文档中创建一个部分
    page = doc.pages.add()

    # 在部分中添加四个标题
    for Level in range(1, 5):
        heading2 = ap.Heading(Level)
        segment2 = ap.text.TextSegment()
        heading2.segments.append(segment2)
        heading2.is_auto_sequence = True
        heading2.toc_page = tocPage
        segment2.text = "示例标题" + str(Level)
        heading2.text_state.font = ap.text.FontRepository.find_font("Arial")

        # 将标题添加到目录中。
        heading2.is_in_list = True
        page.paragraphs.add(heading2)

    # 保存Pdf
    doc.save(output_pdf)

隐藏目录中的页码

如果您不想在目录中显示页码,可以将TocInfo类的is_show_page_numbers属性设置为false。请查看以下代码片段以隐藏目录中的页码:


    import aspose.pdf as ap

    doc = ap.Document()
    toc_page = doc.pages.add()
    toc_info = ap.TocInfo()
    title = ap.text.TextFragment("目录")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.title = title
    # 将列表部分添加到PDF文档的部分集合中
    toc_page.toc_info = toc_info
    # 通过设置左边距和各级文本格式设置来定义四级列表的格式

    toc_info.is_show_page_numbers = False
    toc_info.format_array_length = 4
    toc_info.format_array[0].margin.right = 0
    toc_info.format_array[0].text_state.font_style = ap.text.FontStyles.BOLD | ap.text.FontStyles.ITALIC
    toc_info.format_array[1].margin.left = 30
    toc_info.format_array[1].text_state.underline = True
    toc_info.format_array[1].text_state.font_size = 10
    toc_info.format_array[2].text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.format_array[3].text_state.font_style = ap.text.FontStyles.BOLD
    page = doc.pages.add()
    # 在部分中添加四个标题
    for Level in range(1, 5):
        heading2 = ap.Heading(Level)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = toc_page
        heading2.segments.append(segment2)
        heading2.is_auto_sequence = True
        segment2.text = "这是第 " + str(Level) + " 级的标题"
        heading2.is_in_list = True
        page.paragraphs.add(heading2)
    doc.save(output_pdf)

自定义页码同时添加目录

在 PDF 文档中添加目录时,自定义目录中的页码是很常见的。例如,我们可能需要在页码前添加一些前缀,如 P1、P2、P3 等。在这种情况下,Aspose.PDF for Python 提供了 TocInfo 类的 page_numbers_prefix 属性,可以用来自定义页码,如以下代码示例所示。


    import aspose.pdf as ap

    # 加载现有的 PDF 文件
    doc = ap.Document(input_pdf)
    # 获取 PDF 文件的第一页
    toc_page = doc.pages.insert(1)
    # 创建对象以表示目录信息
    toc_info = ap.TocInfo()
    title = ap.text.TextFragment("Table Of Contents")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD
    # 设置目录的标题
    toc_info.title = title
    toc_info.page_numbers_prefix = "P"
    toc_page.toc_info = toc_info
    for i in range(len(doc.pages)):
        # 创建标题对象
        heading2 = ap.Heading(1)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = toc_page
        heading2.segments.append(segment2)
        # 指定标题对象的目标页
        heading2.destination_page = doc.pages[i + 1]
        # 目标页
        heading2.top = doc.pages[i + 1].rect.height
        # 目标坐标
        segment2.text = "Page " + str(i)
        # 将标题添加到包含目录的页面
        toc_page.paragraphs.add(heading2)

    # 保存更新后的文档
    doc.save(output_pdf)

如何设置PDF到期日期

我们对PDF文件应用访问权限,以便某些用户组可以访问PDF文档的特定功能/对象。为了限制PDF文件的访问,我们通常应用加密,并且可能需要设置PDF文件的到期日期,以便访问/查看文档的用户可以获得有关PDF文件到期的有效提示。


    import aspose.pdf as ap

    # 实例化Document对象
    doc = ap.Document()
    # 向PDF文件的页面集合添加页面
    doc.pages.add()
    # 向页面对象的段落集合中添加文本片段
    doc.pages[1].paragraphs.add(ap.text.TextFragment("Hello World..."))
    # 创建JavaScript对象以设置PDF到期日期
    javaScript = ap.annotations.JavascriptAction(
        "var year=2017;"
        + "var month=5;"
        + "today = new Date(); today = new Date(today.getFullYear(), today.getMonth());"
        + "expiry = new Date(year, month);"
        + "if (today.getTime() > expiry.getTime())"
        + "app.alert('The file is expired. You need a new one.');"
    )
    # 设置JavaScript为PDF打开动作
    doc.open_action = javaScript

    # 保存PDF文档
    doc.save(output_pdf)

在 Python 中将可填写的 PDF 扁平化

PDF 文档通常包含带有交互式可填写控件的表单,例如单选按钮、复选框、文本框、列表等。为了使其在各种应用程序中不可编辑,我们需要将 PDF 文件扁平化。
Aspose.PDF 提供了在 Python 中只需几行代码即可扁平化 PDF 的功能:


    import aspose.pdf as ap

    # 加载源 PDF 表单
    doc = ap.Document(input_pdf)

    # 扁平化可填写的 PDF
    if len(doc.form.fields) > 0:
        for item in doc.form.fields:
            item.flatten()

    # 保存更新后的文档
    doc.save(output_pdf)