Spire.PDF for Java 支持通过 PdfGrid 类和 PdfTable 类在 PDF 页面中绘制表格,在“Java 创建并格式并 PDF 表格”一文中介绍了如何绘制表格。本篇文章将介绍使用 PdfTableExtractor 类来提取 PDF 中的表格的方法。
首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.11.11</version>
</dependency>
</dependencies>
提取表格的主要步骤如下:
import com.spire.pdf.*;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractTable {
public static void main(String[] args)throws IOException {
//实例化PdfDocument类的对象
PdfDocument pdf = new PdfDocument();
//加载PDF文档
pdf.loadFromFile("http://cdn.e-iceblue.cn/test.pdf");
//创建StringBuilder类的实例
StringBuilder builder = new StringBuilder();
//创建PdfTableExtractor类的对象
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
//遍历每一页
for (int page = 0; page < pdf.getPages().getCount(); page++)
{
//提取页面中的表格存入PdfTable[]数组
PdfTable[] tableLists = extractor.extractTable(page);
if (tableLists != null && tableLists.length > 0)
{
//遍历表格
for (PdfTable table : tableLists)
{
int row = table.getRowCount();//获取表格行
int column = table.getColumnCount();//获取表格列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
//获取表格中的文本内容
String text = table.getText(i, j);
//将获取的text写入StringBuilder容器
builder.append(text+" ");
}
builder.append("\r\n");
}
}
}
}
//保存为txt文档
FileWriter fileWriter = new FileWriter("ExtractedTable.txt");
fileWriter.write(builder.toString());
fileWriter.flush();
fileWriter.close();
}
}表格内容读取结果:

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。
Spire.PDF 7.12.1已发布。该版本带来了一些新功能。新增了.NET 6.0以及解密PDF方法,支持了获取附件所在的PDF页面。还增强了PDF到OFD,PDF到图片,XPS到PDF的转换功能。此外还修复了删除PDF文件中的图片结果文档变大等已知问题。详情请阅读以下内容。
新功能:
pdf.Security.DecryptOwnerPassWord(string ownerPassword);
pdf.Security.DecryptUserPassWord();
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(input);
int pageIndex = GetAttachmentPage(doc.Pages, attachmentName);
private int GetAttachmentPage(Spire.Pdf.Widget.PdfPageCollection pageCollection, string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is null or empty");
}
for (int i = 0; i < pageCollection.Count; i++)
{
PdfPageBase page = pageCollection[i];
for (int j = 0; j < page.AnnotationsWidget.Count; j++)
{
Spire.Pdf.Annotations.PdfFileLinkAnnotationWidget pdfFileLinkAnnotationWidget = page.AnnotationsWidget[j] as Spire.Pdf.Annotations.PdfFileLinkAnnotationWidget;
if (pdfFileLinkAnnotationWidget != null)
{
if (fileName.Equals(pdfFileLinkAnnotationWidget.FileName))
{
return i;
}
}
}
}
return -1;
}
问题修复:
Spire.PDF for Java 4.12.1已发布。该版本支持转换PDF为线性PDF,并且支持转换PDF到Excel单元格文本不换行的功能。另外还增强了PDF到OFD,PDF到PDFA的转换功能。此外还修复了压缩PDF图片后图片内容不正确等已知问题。详情请阅读以下内容。
新功能:
PdfToLinearizedPdfConverter converter = new PdfToLinearizedPdfConverter(inputPath);
converter.toLinearizedPdf(OutputPath);
//第四个参数控制着是否让文本换行
doc.getConvertOptions().setPdfToXlsxOptions(new XlsxLineLayoutOptions(false, false, false, false));
问题修复:
通常在工作中比较常用到的 Microsoft Word 是属于国外的文档内容编辑软件,其编译技术均属国外;而 OFD 是一种我国的自主文件格式,在某些特定行业或企业的文档存储技术上是一种更为安全的选择。下面,将介绍使用 Spire.Doc for Java 来实现 Word 文档转换为 OFD 格式的方法及步骤。此外,您也可以使用 Java 技术实现将 PDF 转为 OFD。
首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。JAR 文件可以从 此链接 下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而轻松地在应用程序中导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>13.12.2</version>
</dependency>
</dependencies>
文档转换只需要简单三行代码就可以实现,步骤如下:
import com.spire.doc.*;
public class WordToOFD {
public static void main(String[] args) {
//实例化Document类的对象
Document document = new Document();
//加载Word文档
document.loadFromFile("http://cdn.e-iceblue.cn/Guide.docx");
//保存为OFD格式
document.saveToFile("ToOFD.ofd", FileFormat.OFD);
}
}转换结果:

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。
Spire.Doc for Java 4.12.1已发布。该版本带来了一些新功能,比如:支持转换Word到OFD格式,支持设置修订作者,支持在进行比较时设置“忽略格式”。此外还增强了Word到PDF的转换功能,并且修复了获取的列表文本不正确等已知问题。详情请阅读以下内容。
新功能:
Document document = new Document();
document.loadFromFile("http://cdn.e-iceblue.cn/input.docx");
document.saveToFile("output.ofd", FileFormat.OFD);
Document doc = new Document();
doc.loadFromFile(inputFile);
doc.setTrackChanges(true);
TextRange range = doc.getLastParagraph().appendText("123413");
range.getInsertRevision().setAuthor("user");
doc.saveToFile(outputFile);
doc.dispose();
Document.compare(Document document, String author, CompareOptions options);
Document.compare(Document document, String author, Date date, CompareOptions options);
CompareOptions.setIgnoreFormatting(true);
问题修复:
Word 文档中的每个段落都有意或无意地使用着某一种段落样式。段落样式可以是内置样式,例如标题1和标题2,也可以是自定义样式。本文介绍了如何使用 Spire.Doc for Java 提取使用特定样式的段落。
下表列出了MS Word中的样式名称及其在 Spire.Doc 中的对应名称。简单判断的原则是编程返回的样式名称不包含空格。
| MS Word 的样式名称 | Spire.Doc 的样式名称 |
| Title | Title |
| Subtitle | Subtitle |
| Heading 1 | Heading1 |
| Heading 2 | Heading2 |
| Heading 3 | Heading3 |
| No Spacing | NoSpacing |
| Quote | Quote |
| Intense Quote | IntenseQuote |
| List Paragraph | ListParagraph |
| Normal | Normal |
| Custom Name | CustomName |
首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。JAR 文件可以从 此链接 下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而轻松地在应用程序中导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>13.12.2</version>
</dependency>
</dependencies>
您可以通过 Paragraph.getStyleName() 方法获取特定段落的样式名称。 如果段落的样式名称正好是您需要的,则可以使用 Paragraph.getText() 方法获取段落内容。以下是提取使用特定样式段落的步骤。
import com.spire.doc.Document;
import com.spire.doc.documents.Paragraph;
public class GetParagraphByStyleName {
public static void main(String[] args) {
//在初始化Document对象时加载示例Word文档
Document doc = new Document("C:\\Users\\Administrator\\Desktop\\sample.docx");
//声明一个变量
Paragraph paragraph;
//循环遍历各个节
for (int i = 0; i < doc.getSections().getCount(); i++) {
//循环遍历特定节的段落
for (int j = 0; j < doc.getSections().get(i).getParagraphs().getCount(); j++) {
//获取特定段落
paragraph = doc.getSections().get(i).getParagraphs().get(j);
//确定段落样式是否为“Heading 1”
if (paragraph.getStyleName().equals("Heading1")) {
//获取“Heading1”中段落的文本
System.out.println("Heading 1: " + paragraph.getText() + "\n");
}
//判断段落样式是否为“My Custom Style”
if (paragraph.getStyleName().equals("MyCustomStyle")) {
//获取“My Custom Style”中的段落文本
System.out.println("My Custom Style: " + paragraph.getText());
}
}
}
}
}
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。
Spire.Presentation for Java 4.11.7已发布。该版本支持添加数学公式和检测shape是否包含数学公式,并且增强了PPT到图片,PPT到PDF的转换功能,还修复了图表图例”是否重叠“属性设置不生效等已知问题。详情请阅读以下内容。
新功能:
Presentation ppt = new Presentation();
ppt.loadFromFile("input.pptx");
String latexMathCode = "x^{2}+\\sqrt{x^{2}+1}=2";
IAutoShape shape = ppt.getSlides().get(0).getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(30, 100, 400, 30));
shape.getTextFrame().getParagraphs().clear();
//Add math equation
ParagraphEx tp = shape.getTextFrame().getParagraphs().addParagraphFromLatexMathCode(latexMathCode);for (int i = 0; i<ppt.getSlides().get(0).getShapes().getCount(); i++)
{
//Check whether shape contains math equations
boolean containMathEquation = ((IAutoShape)ppt.getSlides().get(0).getShapes().get(i)).isContainMathEquation();
}
ppt.saveToFile("output.pptx", FileFormat.PPTX_2013);
ppt.dispose();
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html
在数据处理、自动化报表生成、业务数据整合等场景中,从 PDF 文件中提取表格是一项常见需求。PDF 作为通用文档格式,虽便于数据共享,但因底层以 “视觉布局” 而非 “结构化数据” 存储,导致编程提取表格时面临格式解析、数据对齐等难题。本文将介绍如何使用 Spire.PDF for .NET 库通过 C# 提取 PDF 中的表格,并将结果导出为 TXT 和 CSV 格式以便进一步分析。
目录:
Spire.PDF for .NET 是一个功能强大的库,用于在 C# 和 VB.NET 中处理 PDF 文件。它支持广泛的 PDF 操作,包括表格提取、文本提取、图像提取等。
推荐通过 NuGet 包管理器安装 Spire.PDF(最便捷,自动处理依赖)。步骤如下:
1. 打开 Visual Studio 并创建一个新的 C# 项目。(此处新建了一个控制台应用程序);
2. 在 Visual Studio 中,右键点击项目名称 → 选择 “管理 NuGet 程序包”;
3. 在 “浏览” 页搜索 Spire.PDF,选择最新稳定版 → 点击 “安装”。
在编写代码之前,让我们先弄清楚 PDF 是如何存储表格的。与 Excel(明确定义行 / 列)不同,PDF 无原生 “表格” 概念,仅通过 3 类视觉元素模拟表格:
Spire.PDF 的 PdfTableExtractor 类正是通过分析这些视觉元素,逆向推断出表格结构,从而实现结构化提取。
如果你需要快速预览表格数据(例如,开发调试或验证提取结果),可以直接通过控制台实时输出结果,无需生成额外文件,节省开发时间。
从 PDF 表格中提取数据的关键方法:
using Spire.Pdf;
using Spire.Pdf.Utilities;
namespace ExtractPdfTable
{
class Program
{
static void Main(string[] args)
{
// 创建PdfDocument对象
PdfDocument pdf = new PdfDocument();
// 加载PDF文件
pdf.LoadFromFile("表格.pdf");
// 初始化PdfTableExtractor类的实例
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 循环遍历页面
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 从特定页面提取表格
PdfTable[] tableList = extractor.ExtractTable(pageIndex);
// 判断表格列表是否为空
if (tableList != null && tableList.Length > 0)
{
int tableNumber = 1;
// 循环遍历列表中的表格
foreach (PdfTable table in tableList)
{
Console.WriteLine($"\n第 {pageIndex + 1} 页的第 {tableNumber} 个表格:");
Console.WriteLine("-----------------------------------");
// 获取特定表格的行数和列数
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循环遍历行和列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// 从特定单元格获取文本
string text = table.GetText(i, j);
// 将单元格文本打印到控制台并带有分隔符
Console.Write($"{text}\t");
}
// 每行后换行
Console.WriteLine();
}
tableNumber++;
}
}
}
// 关闭文档
pdf.Close();
}
}
}
适用场景
输出: 检索 PDF 表格数据并输出到控制台

对于轻量级的数据存档,将表格保存到文本文件是理想的选择。此方法使用 StringBuilder 高效地编译表格数据,保留换行符以提高可读性。
将 PDF 表格导出到 TXT 的主要优势:
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;
namespace ExtractTableToTxt
{
class Program
{
static void Main(string[] args)
{
// 创建PdfDocument对象
PdfDocument pdf = new PdfDocument();
// 加载PDF文件
pdf.LoadFromFile("表格.pdf");
// 创建StringBuilder对象
StringBuilder builder = new StringBuilder();
// 初始化PdfTableExtractor类的实例
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 声明PdfTable数组
PdfTable[] tableList = null;
// 循环遍历页面
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 从特定页面提取表格
tableList = extractor.ExtractTable(pageIndex);
// 判断表格列表是否为空
if (tableList != null && tableList.Length > 0)
{
// 循环遍历列表中的表格
foreach (PdfTable table in tableList)
{
// 获取特定表格的行数和列数
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循环遍历行和列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// 从特定单元格获取文本
string text = table.GetText(i, j);
// 将文本添加到字符串生成器
builder.Append(text + " ");
}
builder.Append("\r\n");
}
}
}
}
// 写入.txt文件
File.WriteAllText("提取PDF表格.txt", builder.ToString());
}
}
}
适用场景
输出: 提取 PDF 表格数据并保存到文本文件。

扩展应用:对于VB.NET代码示例,请使用我们的 C#⇆VB.NET 转换器直接转换上述代码。
CSV(逗号分隔值)是表格数据的行业标准,与 Excel、Google Sheets 和数据库兼容。此方法通过引用单元格和处理特殊字符,将提取的表格格式化为有效的 CSV 文件。
提取 PDF 表格到 CSV 的主要特点:
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;
namespace ExtractTableToCsv
{
class Program
{
static void Main(string[] args)
{
// 创建PdfDocument对象
PdfDocument pdf = new PdfDocument();
// 加载PDF文件
pdf.LoadFromFile("表格.pdf");
// 创建StreamWriter对象以高效写入CSV
using (StreamWriter csvWriter = new StreamWriter("PDF表格.csv", false, Encoding.UTF8))
{
// 创建PdfTableExtractor对象
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 循环遍历页面
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 从特定页面提取表格
PdfTable[] tableList = extractor.ExtractTable(pageIndex);
// 判断表格列表是否为空
if (tableList != null && tableList.Length > 0)
{
// 循环遍历列表中的表格
foreach (PdfTable table in tableList)
{
// 获取特定表格的行数和列数
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循环遍历行
for (int i = 0; i < row; i++)
{
// 创建列表存储数据
List<string> rowData = new List<string>();
// 循环遍历列
for (int j = 0; j < column; j++)
{
// 从表格单元格检索文本
string cellText = table.GetText(i, j).Replace("\"", "\"\"");
// 将单元格文本添加到列表并用双引号括起来
rowData.Add($"\"{cellText}\"");
}
// 用逗号连接单元格并写入CSV
csvWriter.WriteLine(string.Join(",", rowData));
}
}
}
}
}
}
}
}
适用场景
输出: 解析 PDF 表格数据并导出到 CSV 文件。

推荐:与 Spire.XLS for .NET 集成,直接提取 PDF 表格到 Excel 文档。
本文提供了三种在 C# 中提取 PDF 表格的有效方法。通过利用 Spire.PDF for .NET 库,开发者可以快速实现 PDF 表格的结构化提取,同时兼顾效率与兼容性。根据实际需求选择合适的导出格式,能大幅提升数据处理效率,减少人工录入成本。
如需进一步探索 PDF 处理功能(如 PDF 生成、水印添加、页面合并),可参考 Spire.PDF 官方文档;若需商业场景测试,可获取 30 天免费试用许可证。
答: Spire.PDF 提供了专用的 PdfTableExtractor 类,该类基于视觉提示(边框、间距和文本对齐)检测表格,简化了从 PDF 解析结构化数据的过程。
答: 不能。此.NET PDF 库仅支持文本型 PDF(文本可选中、复制)。对于扫描的 PDF,请使用 Spire.OCR (OCR 文字识别库)先提取文本,然后再解析表格。
答:可通过 Directory.GetFiles() 遍历文件夹中的所有 PDF,循环执行提取逻辑,示例代码如下:
string[] pdfFiles = Directory.GetFiles(@"C:\Invoices\", "*.pdf");
foreach (string file in pdfFiles)
{
// 表格提取的代码
}
答: 对于大型 PDF(100 + 页),通过以下方式优化性能:
using if (tableList == null || tableList.Length == 0))。Spire.Office 6.11.2已发布。本次更新带来了一些新的功能,例如:Spire.XLS支持给数据栏设置边框的功能以及给折线图和面积图设置垂直线;Spire.Doc新增了两个方法;Spire.PDF支持获取附件所在的页码和转换线性化PDF;Spire.Presentation支持获取表格单元格的填充颜色。此外,该版本还修复了大量已知的问题。详情请阅读以下内容。
该版本涵盖了最新版的Spire.Doc, Spire.PDF, Spire.XLS, Spire.Presentation, Spire.Email, Spire.DocViewer, Spire.PDFViewer, Spire.Spreadsheet, Spire.OfficeViewer, Spire.DataExport, Spire.Barcode。
版本信息如下:
https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html
新功能:
workbook.Worksheets[0].PageSetup.SetCustomPaperSize(width, height);
chart.Series[0].HasDroplines = true;
XlsConditionalFormats cfs = sheet.ConditionalFormats[0];
IConditionalFormat cf = cfs[0];
Spire.Xls.DataBar dataBar1 = cf.DataBar;
dataBar1.BarBorder.Type = Spire.Xls.Core.Spreadsheet.ConditionalFormatting.DataBarBorderType.DataBarBorderSolid;
dataBar1.BarBorder.Color = Color.GreenYellow;
问题修复:
新功能:
int page = pdf.Attachments.GetAttachmentPage("attachmentFileName");
PdfToLinearizedPdfConverter converter = new PdfToLinearizedPdfConverter("inputFile");
converter.ToLinearizedPdf("outputFile");
问题修复:
新功能:
table.SetColumnWidth(int columnIndex, float columnWidth, CellWidthType columnWidthType);
Document doc = new Document();
doc.LoadFromFile("http://cdn.e-iceblue.cn/input.docx");
doc.UseNewEngine = true;
doc.SaveToFile("result.pdf", FileFormat.PDF);
问题修复:
//Old method
//tableCell.Width //Deprecated
//tableCell.CellWidthType //Deprecated
//New method
tableCell.SetCellWidth(float width, CellWidthType widthType);
新功能:
table.TableRows[i][j].DisplayColor;
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.ColumnStacked, new RectangleF(100, 100, 500, 400));
CellRange cellRange = chart.ChartData["F1"];
cellRange.Text = "aaa";
cellRange = chart.ChartData["F2"];
cellRange.Text = "bbb";
cellRange = chart.ChartData["F3"];
cellRange.Text = "ccc";
cellRange = chart.ChartData["F4"];
cellRange.Text = "ddd";
chart.Series[0].DataLabelRanges = chart.ChartData["F1", "F4"];
ChartDataLabel dataLabel1 = chart.Series[0].DataLabels.Add();
dataLabel1.ID = 0;
dataLabel1.LabelValueVisible = true;
dataLabel1.ShowDataLabelsRange = true;
foreach (AnimationEffect effect in shape.Slide.Timeline.MainSequence)
{
if (effect.ShapeTarget.Equals(shape as Spire.Presentation.Shape))
{
MotionPath path = ((AnimationMotion)effect.CommonBehaviorCollection[0]).Path;
foreach (MotionCmdPath motionCmdPath in path)
{
PointF[] points = motionCmdPath.Points;
MotionCommandPathType type = motionCmdPath.CommandType;
}
}
}
Image image = shape.SaveAsImage();
table[0, 0].BorderLeftDisplayColor;
table[0, 0].BorderTopDisplayColor;
table[0, 0].BorderRightDisplayColor;
table[0, 0].BorderBottomDisplayColor;
问题修复:
问题修复:
Spire.XLS 11.11.2已发布。该版本带来了一些新功能,如支持转换excel文件到pdf文件设置自定义纸张尺寸的问题,支持了给数据栏设置边框的功能以及给折线图和面积图设置垂直线的功能。此外还增强了Excel到HTML,Excel到PDF的转换功能,并且修复了MS Excel打开保存后的xlsx文件失败等已知问题。详情请阅读以下内容。
新功能:
workbook.Worksheets[0].PageSetup.SetCustomPaperSize(width, height);
chart.Series[0].HasDroplines = true;
XlsConditionalFormats cfs = sheet.ConditionalFormats[0];
IConditionalFormat cf = cfs[0];
Spire.Xls.DataBar dataBar1 = cf.DataBar;
dataBar1.BarBorder.Type = Spire.Xls.Core.Spreadsheet.ConditionalFormatting.DataBarBorderType.DataBarBorderSolid;
dataBar1.BarBorder.Color = Color.GreenYellow;
问题修复: