C#代码实现创建带结构标签的PDF文档

 更新时间:2026年03月03日 08:23:27   作者:2501_93070778  
带标签的 PDF(也称为 PDF/UA)是一种包含结构化标签树的 PDF 文档,本文将介绍如何使用 Spire.PDF for .NET,在 C# 和 VB.NET 中从零开始创建一个带标签的 PDF 文档,有需要的可以了解下

带标签的 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 的具体步骤:

  • 创建 PdfDocument 对象,并使用 PdfDocument.Pages.Add() 方法添加一个页面。
  • 创建 PdfTaggedContent 类的实例。
  • 调用 PdfTaggedContent.SetPdfUA1Identification() 方法,使文档符合 PDF/UA 无障碍标准。
  • 使用 PdfTaggedContent.StructureTreeRoot.AppendChildElement() 方法,在文档结构树根节点下添加一个 “document” 元素。
  • 通过 PdfStructureElement.AppendChildElement() 方法,在 “document” 元素下添加一个 “heading” 元素。
  • 调用 PdfStructureElement.BeginMarkedContent() 方法添加开始标记,用于标识标题内容的起始位置。
  • 使用 PdfPageBase.Canvas.DrawString() 方法在页面上绘制标题文本。
  • 添加结束标记(对应标题内容结束)。
  • 使用 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");
        }
    }
}

方法补充

下面小编为大家整理了其他C#创建带标签PDF文件的方法,希望对大家有所帮助

C#实现代码:

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Interchange.TaggedPdf;
using System.Drawing;
 
namespace CreateTaggedPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建PdfDocument类的对象
            PdfDocument pdf = new PdfDocument();
 
            //添加一页
            pdf.Pages.Add(PdfPageSize.A4);
 
            //设置tab order
            pdf.Pages[0].SetTabOrder(TabOrder.Structure);
 
            //创建PdfTaggedContent类的对象
            PdfTaggedContent taggedContent = new PdfTaggedContent(pdf);
            taggedContent.SetLanguage("en-US");
            taggedContent.SetTitle("test");
 
            //创建字体、画刷、字符串格式
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Times New Roman", 10), true);
            PdfSolidBrush brush = new PdfSolidBrush(Color.Black);
            PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left);
 
            //添加elements
            PdfStructureElement article = taggedContent.StructureTreeRoot.AppendChildElement(PdfStandardStructTypes.Document);
            PdfStructureElement paragraph1 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
            PdfStructureElement span1 = paragraph1.AppendChildElement(PdfStandardStructTypes.Span);
            span1.BeginMarkedContent(pdf.Pages[0]);
            //绘制内容到页面
            pdf.Pages[0].Canvas.DrawString("A PDF tag is the key to accessing the contents of PDF documents with supporting technologies such as screen readers. ", font, brush, new Rectangle(40, 0, 480, 80), format);
            span1.EndMarkedContent(pdf.Pages[0]);
 
            PdfStructureElement paragraph2 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
            paragraph2.BeginMarkedContent(pdf.Pages[0]);
            pdf.Pages[0].Canvas.DrawString("A PDF tag arranges the PDF content in a hierarchical architecture or tag tree.", font, brush, new Rectangle(40, 80, 480, 80), format);
            paragraph2.EndMarkedContent(pdf.Pages[0]);
 
            PdfStructureElement figure1 = article.AppendChildElement(PdfStandardStructTypes.Figure);
            //Set Alternate text 
            figure1.Alt = "replacement text1";
            figure1.BeginMarkedContent(pdf.Pages[0], null);
            PdfImage image = PdfImage.FromFile(@"logo.png");
            pdf.Pages[0].Canvas.DrawImage(image, new PointF(40, 200), new SizeF(100, 100));//绘制图片到页面
            figure1.EndMarkedContent(pdf.Pages[0]);
 
            PdfStructureElement figure2 = article.AppendChildElement(PdfStandardStructTypes.Figure);
            //Set Alternate text
            figure2.Alt = "replacement text2";
            figure2.BeginMarkedContent(pdf.Pages[0], null);
            pdf.Pages[0].Canvas.DrawRectangle(PdfPens.Black, new Rectangle(300, 200, 100, 100));
            figure2.EndMarkedContent(pdf.Pages[0]);
 
            //保存文档          
            pdf.SaveToFile("CreateTaggedFile_result.pdf");
        }
    }
}

vb.net实现代码

Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Interchange.TaggedPdf
Imports System.Drawing
 
Namespace CreateTaggedPDF
	Class Program
		Private Shared Sub Main(args As String())
			'创建PdfDocument类的对象
			Dim pdf As New PdfDocument()
 
			'添加一页
			pdf.Pages.Add(PdfPageSize.A4)
 
			'设置tab order
			pdf.Pages(0).SetTabOrder(TabOrder.[Structure])
 
			'创建PdfTaggedContent类的对象
			Dim taggedContent As New PdfTaggedContent(pdf)
			taggedContent.SetLanguage("en-US")
			taggedContent.SetTitle("test")
 
			'创建字体、画刷、字符串格式
			Dim font As New PdfTrueTypeFont(New Font("Times New Roman", 10), True)
			Dim brush As New PdfSolidBrush(Color.Black)
			Dim format As New PdfStringFormat(PdfTextAlignment.Left)
 
			'添加elements
			Dim article As PdfStructureElement = taggedContent.StructureTreeRoot.AppendChildElement(PdfStandardStructTypes.Document)
			Dim paragraph1 As PdfStructureElement = article.AppendChildElement(PdfStandardStructTypes.Paragraph)
			Dim span1 As PdfStructureElement = paragraph1.AppendChildElement(PdfStandardStructTypes.Span)
			span1.BeginMarkedContent(pdf.Pages(0))
			'绘制内容到页面
			pdf.Pages(0).Canvas.DrawString("A PDF tag is the key to accessing the contents of PDF documents with supporting technologies such as screen readers. ", font, brush, New Rectangle(40, 0, 480, 80), format)
			span1.EndMarkedContent(pdf.Pages(0))
 
			Dim paragraph2 As PdfStructureElement = article.AppendChildElement(PdfStandardStructTypes.Paragraph)
			paragraph2.BeginMarkedContent(pdf.Pages(0))
			pdf.Pages(0).Canvas.DrawString("A PDF tag arranges the PDF content in a hierarchical architecture or tag tree.", font, brush, New Rectangle(40, 80, 480, 80), format)
			paragraph2.EndMarkedContent(pdf.Pages(0))
 
			Dim figure1 As PdfStructureElement = article.AppendChildElement(PdfStandardStructTypes.Figure)
			'Set Alternate text 
			figure1.Alt = "replacement text1"
			figure1.BeginMarkedContent(pdf.Pages(0), Nothing)
			Dim image As PdfImage = PdfImage.FromFile("logo.png")
			pdf.Pages(0).Canvas.DrawImage(image, New PointF(40, 200), New SizeF(100, 100))
			'绘制图片到页面
			figure1.EndMarkedContent(pdf.Pages(0))
 
			Dim figure2 As PdfStructureElement = article.AppendChildElement(PdfStandardStructTypes.Figure)
			'Set Alternate text
			figure2.Alt = "replacement text2"
			figure2.BeginMarkedContent(pdf.Pages(0), Nothing)
			pdf.Pages(0).Canvas.DrawRectangle(PdfPens.Black, New Rectangle(300, 200, 100, 100))
			figure2.EndMarkedContent(pdf.Pages(0))
 
			'保存文档          
			pdf.SaveToFile("CreateTaggedFile_result.pdf")
			System.Diagnostics.Process.Start("CreateTaggedFile_result.pdf")
		End Sub
	End Class
End Namespace

到此这篇关于C#代码实现创建带结构标签的PDF文档的文章就介绍到这了,更多相关C#创建带结构标签PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .NET MemoryCache如何清除全部缓存

    .NET MemoryCache如何清除全部缓存

    本文主要介绍了.NET MemoryCache如何清除全部缓存,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C#实现十五子游戏

    C#实现十五子游戏

    这篇文章主要为大家详细介绍了C#实现十五子游戏的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • C#将文件复制到指定文件夹并整理

    C#将文件复制到指定文件夹并整理

    这篇文章主要介绍了C#将文件复制到指定文件夹并按照时间顺序来整理归档的方法,另外附上其他网友的2种实现方式,有需要的小伙伴可以参考下。
    2015-06-06
  • C sharp (#) 数据类型获取方式

    C sharp (#) 数据类型获取方式

    这篇文章主要介绍了C sharp (#) 数据类型获取方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C#实现鼠标移动到曲线图上显示值的方法

    C#实现鼠标移动到曲线图上显示值的方法

    这篇文章主要介绍了C#实现鼠标移动到曲线图上显示值的方法,是C#的WinForm窗体程序设计中非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C#如何绑定多个按钮到同一个事件

    C#如何绑定多个按钮到同一个事件

    这篇文章主要介绍了C#如何绑定多个按钮到同一个事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 基于C#实现串口监听与TCP转发功能

    基于C#实现串口监听与TCP转发功能

    在工业自动化、物联网设备管理、远程监控等应用场景中,经常需要将本地串口设备的数据实时传输到远程服务器进行处理,本文将详细介绍如何使用 C# 创建一个串口监听服务,并将接收到的数据通过 TCP 协议转发至远程服务器,需要的朋友可以参考下
    2025-06-06
  • C#动态webservice调用接口

    C#动态webservice调用接口

    动态调用webservice,就可以不用添加web引用了,上线的话也只是需要改一下wsdl地址就可以了
    2015-05-05
  • 详解C#如何对ListBox控件中的数据进行操作

    详解C#如何对ListBox控件中的数据进行操作

    这篇文章主要为大家详细介绍了C#中对ListBox控件中的数据进行的操作,主要包括添加、删除、清空、选择、排序等,感兴趣的小伙伴可以了解下
    2024-03-03
  • C#实现读取匿名对象属性值的方法示例总结

    C#实现读取匿名对象属性值的方法示例总结

    这篇文章主要介绍了C#实现读取匿名对象属性值的方法,结合实例形式总结分析了C#通过反射、转换等方法读取匿名对象属性值的相关操作技巧,需要的朋友可以参考下
    2020-03-03

最新评论