带标签的 PDF(也称为 PDF/UA)是一种包含结构化标签树的 PDF 文档,其结构类似于 HTML,用于定义文档的层级和内容组织方式。通过这些标签,屏幕阅读器等辅助工具可以准确识别文档结构,实现无障碍阅读,确保信息完整传达。

本文将介绍如何使用 Spire.PDF for .NET,在 C# 和 VB.NET 中从零开始创建一个带标签的 PDF 文档。

安装 Spire.PDF for .NET

在开始之前,需要将 Spire.PDF for .NET 包中的 DLL 文件添加为 .NET 项目的引用。您可以通过官方下载链接获取 DLL 文件,或直接通过 NuGet 进行安装。

PM> Install-Package Spire.PDF

创建包含丰富结构元素的带标签 PDF

在带标签的 PDF 文档中添加结构元素时,首先需要创建一个 PdfTaggedContent 类对象。随后,通过 PdfTaggedContent.StructureTreeRoot.AppendChildElement() 方法向结构树的根节点添加元素。

下面以添加“标题(heading)”元素为例,介绍使用 Spire.PDF for .NET 创建带标签 PDF 的具体步骤:

  1. 创建 PdfDocument 对象,并使用 PdfDocument.Pages.Add() 方法添加一个页面。
  2. 创建 PdfTaggedContent 类的实例。
  3. 调用 PdfTaggedContent.SetPdfUA1Identification() 方法,使文档符合 PDF/UA 无障碍标准。
  4. 使用 PdfTaggedContent.StructureTreeRoot.AppendChildElement() 方法,在文档结构树根节点下添加一个 “document” 元素。
  5. 通过 PdfStructureElement.AppendChildElement() 方法,在 “document” 元素下添加一个 “heading” 元素。
  6. 调用 PdfStructureElement.BeginMarkedContent() 方法添加开始标记,用于标识标题内容的起始位置。
  7. 使用 PdfPageBase.Canvas.DrawString() 方法在页面上绘制标题文本。
  8. 添加结束标记(对应标题内容结束)。
  9. 使用 PdfDocument.SaveToFile() 方法将文档保存为 PDF 文件。

下面的代码示例展示了如何在 C# 和 VB.NET 中创建包含多种结构元素(如 document、heading、paragraph、figure 和 table)的带标签 PDF 文档。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Interchange.TaggedPdf;
using Spire.Pdf.Tables;
using System.Data;
using System.Drawing;

namespace CreatePDFUA
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 PdfDocument 对象
            PdfDocument doc = new PdfDocument();

            // 添加一个页面
            PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(20));          

            // 设置 Tab 顺序为结构顺序
            page.SetTabOrder(TabOrder.Structure);

            // 创建 PdfTaggedContent 类对象
            PdfTaggedContent taggedContent = new PdfTaggedContent(doc);

            // 设置文档语言和标题
            taggedContent.SetLanguage("en-US");
            taggedContent.SetTitle("test");

            // 设置 PDF/UA1 标识(符合无障碍标准)
            taggedContent.SetPdfUA1Identification();

            // 创建字体和画刷
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Times New Roman", 14), true);
            PdfSolidBrush brush = new PdfSolidBrush(Color.Black);

            // 添加“document”结构元素
            PdfStructureElement document = taggedContent.StructureTreeRoot.AppendChildElement(PdfStandardStructTypes.Document);

            // 添加“heading”(一级标题)元素
            PdfStructureElement heading1 = document.AppendChildElement(PdfStandardStructTypes.HeadingLevel1);
            heading1.BeginMarkedContent(page);      
            string headingText = "What Is a Tagged PDF?";
            page.Canvas.DrawString(headingText, font, brush, new PointF(0, 0));
            heading1.EndMarkedContent(page);

            // 添加“paragraph”(段落)元素
            PdfStructureElement paragraph = document.AppendChildElement(PdfStandardStructTypes.Paragraph);
            paragraph.BeginMarkedContent(page);
            string paragraphText = "“Tagged PDF” doesn’t seem like a life-changing term. But for some, it is. For people who are " +
                "blind or have low vision and use assistive technology (such as screen readers and connected Braille displays) to " +
                "access information, an untagged PDF means they are missing out on information contained in the document because assistive " +
                "technology cannot “read” untagged PDFs. Digital accessibility has opened up so many avenues to information that were once " +
                "closed to people with visual disabilities, but PDFs often get left out of the equation.";
            RectangleF rect = new RectangleF(0, 30, page.Canvas.ClientSize.Width, page.Canvas.ClientSize.Height);
            page.Canvas.DrawString(paragraphText, font, brush, rect);
            paragraph.EndMarkedContent(page);

            // 添加“figure”(图像)元素
            PdfStructureElement figure = document.AppendChildElement(PdfStandardStructTypes.Figure);
            figure.BeginMarkedContent(page);
            PdfImage image = PdfImage.FromFile(@"C:\Users\Administrator\Desktop\pdfua.png");
            page.Canvas.DrawImage(image, new PointF(0, 150));
            figure.EndMarkedContent(page);

            // 添加“table”(表格)元素
            PdfStructureElement table = document.AppendChildElement(PdfStandardStructTypes.Table);
            table.BeginMarkedContent(page);
            PdfTable pdfTable = new PdfTable();
            pdfTable.Style.DefaultStyle.Font = font;

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("Name");
            dataTable.Columns.Add("Age");
            dataTable.Columns.Add("Sex");
            dataTable.Rows.Add(new string[] { "John", "22", "Male" });
            dataTable.Rows.Add(new string[] { "Katty", "25", "Female" });

            pdfTable.DataSource = dataTable;
            pdfTable.Style.ShowHeader = true;
            pdfTable.Draw(page.Canvas, new PointF(0, 280), 300f);
            table.EndMarkedContent(page);

            // 将文档保存为文件
            doc.SaveToFile("CreatePDFUA.pdf");
        }
    }
}

申请临时许可证

如果您希望去除生成文档中的评估提示信息,或解除功能使用限制,请申请 30 天试用许可证。

标签: none

添加新评论