Spire.PDF for Java 12.4.4 现已正式发布。该版本优化了合并PDF文档时对内存的消耗并修复了一些在操作 PDF 文档时出现的问题。详情请查阅以下内容。
优化:
问题修复:
Spire.Doc 14.4.4 现已正式发布。该版本支持将图表保存为模板,并新增 GeneratorName 属性支持在转换 PDF 时配置 Producer 信息。此外,还支持获取图表坐标轴数据值以及读取和设置图表数据标签位置。同时,一些在 Markdown 转换、单元格拆分及文档合并时出现的问题也得以成功修复。更多详情如下。
调整:
ToPdfParameterList.IsAtlast-->ToPdfParameterList.IsAtLeast
新功能:
Document doc = new Document();
doc.LoadFromFile(inputFile);
int count = 1;
foreach (Section sec in doc.Sections)
{
foreach (Spire.Doc.Documents.Paragraph paragraph in sec.Paragraphs)
{
foreach (DocumentObject obj in paragraph.ChildObjects)
{
if (obj is ShapeObject shape)
{
Chart chart = shape.Chart;
if (chart == null)
continue;
string fileName = Path.Combine(outputPath, $"{count}.crtx");
chart.SaveAsTemplate(fileName);
count++;
}
}
}
}
string genName = "Testing For Set Producer";
Document doc = new Document();
doc.LoadFromFile(filename);
ToPdfParameterList toPdf = new ToPdfParameterList();
toPdf.GeneratorName = genName;
doc.SaveToFile("result.pdf", toPdf);
Document doc = new Document();
doc.LoadFromFile(inputFile);
StringBuilder sb = new StringBuilder();
int number = 1;
foreach (Section sec in doc.Sections)
{
foreach (Paragraph paragraph in sec.Paragraphs)
{
for (int i = 0; i < paragraph.ChildObjects.Count; i++)
{
DocumentObject obj = paragraph.ChildObjects[i];
if (obj is ShapeObject)
{
ShapeObject shape = obj as ShapeObject;
Chart chart = shape.Chart;
sb.Append("\r\n\r\n第" + number + "页:\r\n" + "获取所有X轴数据:");
for (int x = 0; x < chart.XValues.Count; x++)
{
ChartValue xVal = chart.XValues[x];
// 获取所有X轴数据值
sb.Append(xVal.StringValue + " ");
}
//获取第一个系列
ChartSeries series = chart.Series[0];
sb.Append("\r\n获取Y轴数据:");
foreach (ChartValue yVal in series.YValues)
{
// 获取第一个系列所有的Y轴数据值
sb.Append(yVal.Value + " ");
}
}
}
}
number++;
}
Document doc = new Document();
foreach (ChartDataLabelPosition position in Enum.GetValues(typeof(ChartDataLabelPosition)))
{
Section section = doc.AddSection();
section.AddParagraph().AppendText(position.ToString());
Spire.Doc.Documents.Paragraph newPara = section.AddParagraph();
ShapeObject shape = newPara.AppendChart(ChartType.Pie, 500, 300);
Chart chart = shape.Chart;
chart.Series[0].HasDataLabels = true;
chart.Series[0].DataLabels.ShowCategoryName = true;
chart.Series[0].DataLabels.ShowValue = true;
// 设置Position
chart.Series[0].DataLabels.Position = position;
ShapeObject shape2 = newPara.AppendChart(ChartType.Bubble, 500, 300);
Chart chart2 = shape2.Chart;
chart2.Series[0].HasDataLabels = true;
chart2.Series[0].DataLabels.ShowCategoryName = true;
chart2.Series[0].DataLabels.ShowValue = true;
chart2.Series[0].DataLabels.Position = position;
}
doc.SaveToFile(outputFile, FileFormat.Docx);
doc.Dispose();
问题修复:

对于许多开发任务(从网页抓取、数据提取到内容自动化)而言,高效解析 HTML 是一项常见需求。虽然 .NET 生态中提供了 HtmlAgilityPack 等工具,但 Spire.Doc 凭借直观的对象模型和良好的集成能力,使得在 C# 中解析 HTML 变得更加简单高效。
本指南将介绍如何使用 Spire.Doc for .NET 来解析 HTML,包括从不同来源加载 HTML、遍历文档结构以及提取关键信息。
将 C# HTML 解析库集成到项目中,最简单的方式是通过 NuGet:
或者,你也可以从 E-iceblue 官网直接下载库,解压 ZIP 文件,并在项目中引用 Spire.Doc.dll。
Spire.Doc 会将 HTML 转换为结构化的对象模型,其中 <p>、<a>、<table> 等元素都会映射为可通过代码访问的类。主要组件包括:
<body> 或 <div>)。<p>、<h1>、<li>。这种模型能够很好地保留 HTML 结构,并通过直观的 C# 属性和方法进行访问。
Spire.Doc 支持从字符串、本地文件以及远程 URL(结合 HTTP 客户端)加载并解析 HTML。以下是针对每种场景的详细示例。
将 HTML 字符串(例如来自 Web API 或数据库)解析为 Spire.Doc 的对象模型:
using Spire.Doc;
using Spire.Doc.Documents;
namespace ParseHtmlString
{
class Program
{
static void Main(string[] args)
{
// 创建 Document 对象
Document doc = new Document();
// 添加节作为容器
Section section = doc.AddSection();
// 添加段落
Paragraph para = section.AddParagraph();
// 定义要解析的 HTML 内容
string htmlContent = @"
<h2>示例 HTML 字符串</h2>
<p>这是一个包含<strong>粗体文本</strong>和一个<a href='https://www.e-iceblue.com/'>链接</a>的段落。</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
</ul>
";
// 将 HTML 字符串解析到段落中
para.AppendHTML(htmlContent);
// 打印所有段落文本
Console.WriteLine("已解析的 HTML 内容:");
Console.WriteLine("---------------------");
foreach (Paragraph paragraph in section.Paragraphs)
{
Console.WriteLine(paragraph.Text);
}
}
}
}
在这个示例中,AppendHTML() 方法会自动将 HTML 标签转换为对应的 Spire.Doc 对象(例如 <h1> → 标题样式,<ul> → 列表段落)。
输出:

专业提示:您也可以调用 SaveToFile() 方法在 C# 中将 HTML 字符串转换为 Word 文档。
对于存储在文件中的 HTML 内容(例如下载的网页、静态 HTML 报告),可以使用 LoadFromFile() 加载并分析其结构:
using Spire.Doc;
using Spire.Doc.Documents;
namespace ParseHtmlFile
{
class Program
{
static void Main(string[] args)
{
// 创建 Document 对象
Document doc = new Document();
// 加载 HTML 文件
doc.LoadFromFile("sample.html", FileFormat.Html);
// 遍历节(HTML body 块)
foreach (Section section in doc.Sections)
{
Console.WriteLine($"第 {doc.Sections.IndexOf(section) + 1} 节:");
Console.WriteLine("---------------------------------");
// 遍历节中的段落
foreach (Paragraph para in section.Paragraphs)
{
// 打印段落文本和样式(例如标题级别)
string styleName = para.StyleName;
Console.WriteLine($"[{styleName}] {para.Text}"+ "\n");
}
Console.WriteLine();
}
}
}
}
此 C# 代码示例加载一个本地 HTML 文件,然后使用 Paragraph.StyleName 和 Paragraph.Text 属性提取内容及其样式信息。
输出:

Spire.Doc 的对象模型允许您像操作 Word 文档一样与 HTML 文件交互。除了提取文本,还可以从 HTML 中提取链接、表格等元素。
要解析网页 HTML,可以结合 HttpClient 先获取 HTML,再用 Spire.Doc 解析:
using Spire.Doc;
using Spire.Doc.Documents;
namespace HtmlUrlParsing
{
class Program
{
// 用于 Web 请求的 HttpClient 实例
private static readonly HttpClient httpClient = new HttpClient();
static async Task Main(string[] args)
{
try
{
// 从 URL 获取 HTML
string url = "https://www.e-iceblue.com/privacypolicy.html";
Console.WriteLine($"正在从以下地址获取 HTML: {url}");
string htmlContent = await FetchHtmlFromUrl(url);
// 解析获取到的 HTML
Document doc = new Document();
Section section = doc.AddSection();
Paragraph paragraph = section.AddParagraph();
paragraph.AppendHTML(htmlContent);
// 提取关键信息
Console.WriteLine("\n已解析内容摘要:");
Console.WriteLine($"节数: {doc.Sections.Count}");
Console.WriteLine($"段落数: {section.Paragraphs.Count}");
Console.WriteLine("-------------------------------------------");
// 提取所有标题段落
foreach (Paragraph para in section.Paragraphs)
{
if (para.StyleName.StartsWith("Heading"))
{
string headings = para.Text;
Console.WriteLine($"标题: {headings}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
// 从 URL 获取 HTML 的辅助方法
private static async Task<string> FetchHtmlFromUrl(string url)
{
// 设置 user-agent 以避免被服务器阻止
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
// 发送 GET 请求并返回 HTML 内容
HttpResponseMessage response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode(); // 在发生 HTTP 错误时抛出异常 (4xx, 5xx)
return await response.Content.ReadAsStringAsync();
}
}
}
这个示例将网页抓取(获取 HTML)与文档解析结合起来,可以提取结构化信息(例如标题),非常适用于内容分析或数据抓取场景。
输出:

Spire.Doc for .NET 为在 C# 应用中解析 HTML 提供了一套完整解决方案。无论是 HTML 字符串、本地文件还是网页 URL,都可以通过统一的 API 进行处理。通过遵循本指南中概述的示例,您可以高效地将 HTML 解析功能集成到您的 .NET 项目中。
要完整体验 Spire.Doc for .NET 的功能,请在此处申请 30 天免费试用许可证。
答:Spire.Doc 和 HtmlAgilityPack 的主要目标不同,因此选择取决于您的需求:
HtmlAgilityPack:轻量级 HTML 解析库,适合处理原始 HTML(如提取标签、修复不规范 HTML),但不支持文档格式或导出 Word。
Spire.Doc:以文档处理为核心,将 HTML 映射为结构化 Word 元素(段落、样式等),适用于:
答:要在 C# 中将 HTML 文件转换为纯文本,请通过 GetText() 方法获取其文本内容,然后将结果写入 .txt 文件。
// 创建 Document 对象
Document doc = new Document();
// 加载 HTML 文件
doc.LoadFromFile("sample.html", FileFormat.Html);
// 从 HTML 获取文本
string text = doc.GetText();
// 写入文本文件
File.WriteAllText("HTMLText.txt", text);
答:Spire.Doc 具有良好的容错性,在一定程度上可以处理不完美的 HTML。但是,严重格式错误的 HTML 可能会导致解析问题。为获得最佳结果,请确保您的 HTML 格式良好,或在用 Spire.Doc 解析之前使用 HTML 清理库。
答:可以。Spire.Doc 完全兼容 ASP.NET Core,其安装和使用过程与其他 .NET 应用程序相同。

将 PDF 转换为数据库 是数据驱动应用程序中的常见需求。许多业务文档(如发票、报表和财务记录)以 PDF 格式存储结构化信息,但这些数据无法直接用于查询或分析。
为了使这些数据可用,开发人员通常需要通过提取结构化内容并将其插入关系型数据库(如 SQL Server、MySQL 或 PostgreSQL)来 将 PDF 转换为 SQL。手动处理此过程效率低下且容易出错,尤其是在大规模处理时。
在本指南中,我们专注于从 PDF 中提取 表格数据,并使用 Spire.PDF for Python 构建完整的管道,将数据转换并插入到 Python 的 SQL 数据库中。这种方法反映了现实世界中 PDF 转数据库工作流最实用且可扩展的解决方案。
快速导航
在深入实现之前,了解将 PDF 数据转换为数据库的整体流程非常重要。
与其将每个操作视为完全独立的过程,不如将此工作流程分为两个主要阶段:

每个阶段在管道中都扮演着独特的角色:
提取表格:从 PDF 文档中检索结构化的表格数据
处理并存储数据:清理、结构化提取的数据,并将其插入关系型数据库
这个端到端的管道反映了大多数实际系统如何处理 PDF 转数据库 工作流——首先提取可用数据,然后处理并将其存储在数据库中以便查询和分析。
开始之前,请确保您具备以下条件:
已安装 Python 3.x
已安装 Spire.PDF for Python:
pip install Spire.PDF
您也可以 下载 Spire.PDF for Python 并手动添加到项目中。
关系型数据库系统(如 SQLite、SQL Server、MySQL 或 PostgreSQL)
本指南为了简化演示使用 SQLite,同时也展示了如何将相同的方法应用于其他 SQL 数据库。
在大多数业务文档(如发票或报表)中,数据以表格形式组织。这些表格已经遵循行列结构,使其非常适合直接插入 SQL 数据库。
PDF 中的表格数据通常已经以行和列的形式结构化,这使其成为数据库存储的最合适格式。
以下是使用 Spire.PDF 从 PDF 文件中提取表格数据的示例:
from spire.pdf import *
from spire.pdf.common import *
# 加载PDF文档
pdf = PdfDocument()
pdf.LoadFromFile("Quarterly Sales.pdf")
table_data = []
# 遍历页面
for i in range(pdf.Pages.Count):
# 从页面提取表格
extractor = PdfTableExtractor(pdf)
tables = extractor.ExtractTable(i)
if tables:
print(f"第{i+1}页有{len(tables)}个表格。")
for table in tables:
rows = []
for row in range(table.GetRowCount()):
row_data = []
for col in range(table.GetColumnCount()):
text = table.GetText(row, col)
row_data.append(text.strip() if text else "")
rows.append(row_data)
table_data.extend(rows)
pdf.Close()
# 打印提取的数据
for row in table_data:
print(row)
以下是提取结果的预览:

在此阶段,数据已被提取,但在数据库使用方面仍然是非结构化的。一旦提取了表格数据,我们需要将其转换为适合 SQL 插入的结构化格式。
或者,您可以将提取的数据导出到 CSV 文件以进行验证或批量导入。参见:使用 Python 将 PDF 表格转换为 CSV
从 PDF 中提取的原始表格数据在插入 SQL 数据库之前通常需要进行清理和结构化。
为简化起见,以下示例演示如何处理 单个提取的表格。在实际场景中,PDF 可能包含多个表格,可以使用相同的逻辑在循环中处理。
structured_data = []
# 假设第一行为表头
headers = table_data[0]
for row in table_data[1:]:
if not any(row):
continue
record = {}
for i in range(len(headers)):
value = row[i] if i < len(row) else ""
record[headers[i]] = value
structured_data.append(record)
# 预览结构化数据
for item in structured_data:
print(item)
您还可以:
将原始 PDF 数据转换为结构化格式可确保其能够可靠地插入关系型数据库。转换后,数据即可立即插入数据库,从而完成整个管道。
使用来自单个表格的结构化数据,我们可以动态创建数据库架构并插入记录,而无需硬编码列名。
import sqlite3
# 连接到SQLite数据库
conn = sqlite3.connect("sales_data.db")
cursor = conn.cursor()
# 根据标题动态创建表
columns_def = ", ".join([f'"{h}" TEXT' for h in headers])
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS invoices (
id INTEGER PRIMARY KEY AUTOINCREMENT,
{columns_def}
)
""")
# 准备插入语句
placeholders = ", ".join(["?" for _ in headers])
column_names = ", ".join([f'"{h}"' for h in headers])
# 插入数据
for record in structured_data:
values = [record.get(h, "") for h in headers]
cursor.execute(f"""
INSERT INTO invoices ({column_names})
VALUES ({placeholders})
""", values)
# 提交并关闭
conn.commit()
conn.close()
?)防止 SQL 注入本节演示了使用单表示例将 PDF 表格数据转换为关系型数据库的核心工作流程。在下一节中,我们将扩展此方法以自动处理 多个表格。
以下是一个完整的可运行示例,演示从 PDF 到数据库的整个工作流程:
from spire.pdf import *
from spire.pdf.common import *
import sqlite3
import re
# ---------------------------
# 工具函数
# ---------------------------
def clean_column_name(name: str, index: int) -> str:
"""
清理列名中的空格
"""
if not name:
return f"column_{index}"
# 转为字符串并去掉首尾空格
name = str(name).strip()
# 将多个空白字符统一为一个空格(防止隐藏字符)
name = re.sub(r'\s+', ' ', name)
return name
# ---------------------------
# 步骤1:从PDF中提取表格
# ---------------------------
pdf = PdfDocument()
pdf.LoadFromFile("Quarterly Sales.pdf")
extractor = PdfTableExtractor(pdf)
all_tables = []
# 遍历所有页面
for i in range(pdf.Pages.Count):
tables = extractor.ExtractTable(i)
if tables:
for table in tables:
table_rows = []
# 遍历表格行
for row in range(table.GetRowCount()):
row_data = []
# 遍历列
for col in range(table.GetColumnCount()):
text = table.GetText(row, col)
row_data.append(text)
table_rows.append(row_data)
if table_rows:
all_tables.append(table_rows)
pdf.Close()
# 如果没有提取到表格,直接报错
if not all_tables:
raise ValueError("PDF 中未找到表格")
# ---------------------------
# 步骤2:写入SQLite数据库
# ---------------------------
conn = sqlite3.connect("sales_data.db")
cursor = conn.cursor()
for table_index, table in enumerate(all_tables):
# 跳过无效表格(少于2行通常没有意义)
if len(table) < 2:
continue
# 表头(第一行)
raw_headers = table[0]
# ---------------------------
# 清理列名(仅去空格)
# ---------------------------
clean_headers = [
clean_column_name(h, i)
for i, h in enumerate(raw_headers)
]
# 表名
table_name = f"table_{table_index+1}"
# ---------------------------
# 如果表已存在,先删除(避免列结构冲突)
# ---------------------------
cursor.execute(f'DROP TABLE IF EXISTS "{table_name}"')
# ---------------------------
# 创建表结构
# ---------------------------
columns_def = ", ".join([f'"{col}" TEXT' for col in clean_headers])
cursor.execute(f"""
CREATE TABLE "{table_name}" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
{columns_def}
)
""")
# ---------------------------
# 构建插入SQL
# ---------------------------
placeholders = ", ".join(["?" for _ in clean_headers])
column_names = ", ".join([f'"{col}"' for col in clean_headers])
insert_sql = f"""
INSERT INTO "{table_name}" ({column_names})
VALUES ({placeholders})
"""
# ---------------------------
# 准备批量插入数据
# ---------------------------
batch = []
for row in table[1:]:
# 跳过空行
if not any(row):
continue
values = [
row[i] if i < len(row) else ""
for i in range(len(clean_headers))
]
batch.append(values)
# 执行批量插入
if batch:
cursor.executemany(insert_sql, batch)
print(f"已向 {table_name} 插入 {len(batch)} 行数据")
# 提交事务
conn.commit()
conn.close()
print(f"PDF处理完成,共提取 {len(all_tables)} 个表格")
以下是数据库中插入结果的预览:

这个完整示例演示了完整的 PDF 转数据库 管道:
使用 AUTOINCREMENT 时,SQLite 会自动创建一个名为 sqlite_sequence 的系统表来跟踪当前最大 ID。这是预期行为,不会影响您的数据。您可以直接运行此代码将 PDF 表格数据转换为数据库。
注意:示例中直接使用表格数据中的中文表头作为列名,如果数据库支持 Unicode(如 SQLite、MySQL、SQL Server),可以安全使用中文列名。但在跨系统或企业环境中,建议映射为英文以提升兼容性。
虽然本指南为了简化使用 SQLite,但相同的方法也适用于其他 SQL 数据库。提取和转换步骤保持不变——只有数据库连接和插入语法略有不同。
以下示例假设您使用的是上一步中生成的规范化列名(headers)。
import pyodbc
# 连接到 SQL Server
conn_str = (
"DRIVER={SQL Server};"
"SERVER=your_server_name;"
"DATABASE=your_database_name;"
"UID=your_username;"
"PWD=your_password"
)
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
# 使用规范化标题生成动态列定义
columns_def = ", ".join([f"[{h}] NVARCHAR(MAX)" for h in headers])
# 动态创建表
cursor.execute(f"""
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'invoices')
BEGIN
CREATE TABLE invoices (
id INT IDENTITY(1,1) PRIMARY KEY,
{columns_def}
)
END
""")
# 准备插入语句
placeholders = ", ".join(["?" for _ in headers])
column_names = ", ".join([f"[{h}]" for h in headers])
# 插入数据
for record in structured_data:
values = [record.get(h, "") for h in headers]
cursor.execute(f"""
INSERT INTO invoices ({column_names})
VALUES ({placeholders})
""", values)
# 提交并关闭
conn.commit()
conn.close()
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
cursor = conn.cursor()
# 使用与前面所示相同的动态表创建和插入逻辑,
# 如有需要可进行细微的语法调整
import psycopg2
conn = psycopg2.connect(
host="localhost",
database="your_database",
user="your_username",
password="your_password"
)
cursor = conn.cursor()
# 使用与前面所示相同的动态表创建和插入逻辑,
# 如有需要可进行细微的语法调整
核心提取和转换步骤在不同的 SQL 数据库中保持不变,特别是在使用规范化列名以确保兼容性时。
虽然本指南专注于表格提取,但 PDF 通常包含其他类型的数据,根据您的用例也可以集成到数据库中。
在许多文档中,重要信息(如发票号码、客户名称或日期)嵌入在纯文本中而不是表格中。
您可以使用以下方法提取原始文本:
from spire.pdf import *
pdf = PdfDocument()
pdf.LoadFromFile("Quarterly Sales.pdf")
for i in range(pdf.Pages.Count):
page = pdf.Pages.get_Item(i)
extractor = PdfTextExtractor(page)
options = PdfTextExtractOptions()
options.IsExtractAllText = True
text = extractor.ExtractText(options)
print(text)
然而,原始文本不能直接插入数据库。它通常需要 解析为结构化字段,例如:
一旦结构化,数据就可以作为前面描述的相同转换和插入管道的一部分插入数据库。
有关更高级的技术,您可以在详细的 Python PDF 文本提取指南 中了解更多信息。
PDF 中的图像通常不能直接用作结构化数据,但仍可以通过两种方式集成到数据库工作流中:
选项1:OCR(推荐用于数据提取) 使用 OCR 工具将图像转换为文本,然后处理并存储提取的内容。
选项2:文件存储(推荐用于文档系统) 将图像存储为:
以下是提取图像的示例:
from spire.pdf import *
pdf = PdfDocument()
pdf.LoadFromFile("Quarterly Sales.pdf")
helper = PdfImageHelper()
for i in range(pdf.Pages.Count):
page = pdf.Pages.get_Item(i)
images = helper.GetImagesInfo(page)
for j, img in enumerate(images):
img.Image.Save(f"image_{i}_{j}.png")
要进一步处理基于图像的内容,您可以 使用 Spire.OCR for Python 从图像中提取文本。
在某些情况下,目标不是提取结构化数据,而是将整个 PDF 文件存储在数据库中。
这通常用于:
您可以将 PDF 存储为:
这种方法代表了 "数据库中的 PDF" 的另一种含义,但它与结构化数据提取不同。
虽然 PDF 可以包含多种类型的内容,但 表格数据仍然是数据库集成最高效且可扩展的格式。其他数据类型通常需要额外的处理才能有效地存储或查询。
虽然将 PDF 转换为数据库的过程看起来很简单,但会出现一些实际挑战。
并非所有 PDF 都遵循一致的表格格式:
解决方案:
某些 PDF 在内部没有正确定义表格,例如没有网格结构或单元格大小不规则。
解决方案:
提取的数据可能包含:
解决方案:
PDF 表格提取可能由于字体编码和连字而引入意外字符。例如,常见的字母组合如:
fi、ff、ffi、ffl、ft、ti可能在 PDF 中存储为 单个字形。提取时,它们可能显示为:
di\ue000erence → difference
o\ue002ce → office
\ue005le → file
这些通常是由自定义字体映射引起的 私有 Unicode 字符(例如 \ue000–\uf8ff)。
解决方案:
检测私有 Unicode 字符(\ue000–\uf8ff)
为连字构建映射表,例如:
\ue000 → ff\ue001 → ft\ue002 → ffi\ue003 → ffl\ue004 → ti\ue005 → fi在插入数据库之前规范化文本
可选地记录未知字符以进行进一步分析
正确处理编码问题可确保数据准确性,并防止下游处理中出现细微损坏。
PDF 中的大型表格通常分布在多个页面上。提取时,每个页面可能被视为单独的表格,导致:
解决方案:
在实践中,结合列结构和值模式检测提供了一种可靠的方法来重建跨页面的完整表格。
提取的数据与数据库列之间的映射不正确会导致错误。
解决方案:
处理大型 PDF 可能会很慢。
解决方案:
通过预见这些问题,您可以构建更可靠的 PDF 转数据库工作流。
将 PDF 转换为数据库不是一个单步操作,而是一个涉及提取数据并处理以进行数据库存储(包括转换和插入)的结构化过程
通过专注于表格数据并使用 Python,您可以高效地实现完整的 PDF 转数据库管道,使自动化数据集成任务更加容易。
这种方法对于处理需要存储在 SQL Server 或其他关系型数据库中的发票、报表和其他结构化业务文档特别有用。
如果您想评估 Spire.PDF for Python 的性能并消除任何限制,您可以 申请 30 天免费试用。
它指的是从 PDF 文件中提取结构化数据并将其存储在数据库中的过程。这通常涉及解析 PDF 内容,将其转换为结构化格式,并将其插入 SQL 数据库以进行进一步的查询和分析。
不可以。Python 无法一步直接将 PDF 转换为数据库。该过程通常涉及首先从 PDF 中提取数据,将其转换为结构化记录,然后使用 SQL 连接器将其插入数据库。
典型的工作流程包括:
可以。PDF 文件可以作为二进制(BLOB)数据存储在数据库中。然而,这种方法主要用于文档存储系统,而结构化提取更适合数据分析和查询。
您可以使用几乎任何 SQL 数据库,包括 SQLite、SQL Server、MySQL 和 PostgreSQL。整体提取和转换过程保持不变,只有数据库连接和插入语法略有不同。
在实际开发中,我们有时只需要将 Excel 中的部分数据导出为图片,而不是整个工作表。本文将介绍如何使用 .NET Excel 组件 Spire.XLS for .NET 在 C# 和 VB.NET 中将指定的工作表单元格转换为图片。该 Excel 库可以帮助我们快速将指定的单元格区域转换为多种图片格式,例如 JPEG、PNG、BMP、TIFF、GIF、ICO、EMF、EXIF 等。
在将工作表转换为图片时,Spire.XLS for .NET 提供了如下方法:Spire.Xls.Worksheet.ToImage(int firstRow, int firstColumn, int lastRow, int lastColumn); 可以看到,该方法包含四个参数,用于指定单元格范围。确定好范围后,即可将对应区域转换为图片。现在,让我们逐步了解整个过程。
下面是一个用于演示转换效果的 Excel 工作簿示例,其中包含了不同格式的数据:

Spire.XLS for .NET 是一个 Excel API,支持在 .NET 平台上快速创建、读取、编辑和操作 Excel 文件。您可以在此处下载并安装该组件到开发环境中。安装完成后,Spire.XLS for .NET 将以评估模式运行,这与其他 Spire 组件一致,并且该评估模式没有时间限制。
可以创建一个新的控制台应用程序(Console Application)项目,支持 C# 或 VB.NET。
在此项目中,我们需要添加引用。除了添加 System.Drawing 之外,我们还将使用 Spire.XLS for .NET,因此我们还必须添加下载的 Spire.Xls Bin 文件夹中的 Spire.Xls.dll、Spire.Common.dll 和 Spire.License.dll。默认路径通常为:"..\Spire.XLS\Bin\NET4.0\Spire.XLS.dll"。
在此步骤中:
Spire.XLS for .NET 支持多种图片格式,如 PNG、JPEG、Bmp、EMF、GIF、TIFF、WMF 等。
using System.Drawing.Imaging;
using Spire.Xls;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// 初始化一个新的 Workbook 对象
Workbook workbook = new Workbook();
// 打开模板 Excel 文件
workbook.LoadFromFile(@"..\excel to image.xlsx");
// 获取 Excel 文件中的第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 指定单元格范围并保存为特定的图片格式
sheet.ToImage(1, 1, 6, 10).Save("image1.png", ImageFormat.Png);
sheet.ToImage(7, 1, 13, 10).Save("image2.jpeg", ImageFormat.Jpeg);
sheet.ToImage(14, 1, 18, 10).Save("image3.bmp", ImageFormat.Bmp);
}
}
}
Imports System.Drawing.Imaging
Imports Spire.Xls
Module Module1
Sub Main()
' 初始化一个新的 Workbook 对象
Dim workbook As New Workbook()
' 打开模板 Excel 文件
workbook.LoadFromFile("..\excel to image.xlsx")
' 获取 Excel 文件中的第一个工作表
Dim sheet As Worksheet = workbook.Worksheets(0)
' 指定单元格范围并保存为特定的图片格式
sheet.ToImage(1, 1, 6, 10).Save("image1.png", ImageFormat.Png)
sheet.ToImage(7, 1, 13, 10).Save("image2.jpeg", ImageFormat.Jpeg)
sheet.ToImage(14, 1, 18, 10).Save("image3.bmp", ImageFormat.Bmp)
End Sub
End Module
执行上述代码后,第一个工作表(Sheet1)中的指定单元格区域将被转换为三张图片。生成的图片文件分别为 "image1.png"、"image2.jpeg" 和 "image3.bmp"。
效果如下:

本节介绍了如何使用 Spire.XLS for .NET 将指定的 Excel 单元格区域转换为图片。希望该内容能够帮助你更好地理解这一功能并应用到实际开发中。Spire.XLS for .NET 具有高性能、高效率和高稳定性,能够满足各种开发需求。可以看到,该方法实现简单,适用于将 Excel 指定区域快速导出为图片的场景。
如果您需要去除生成文档中的评估提示或解除功能限制,请联系销售申请有效期 30 天的免费临时许可证。
Spire.Office for JavaScript 11.4.1 现已发布。在该版本中,Spire.Doc for JavaScript 新增 Word 转 Markdown 等功能;Spire.XLS for JavaScript 支持转换 Excel 到 SVG;Spire.Presentation for JavaScript 支持将 PowerPoint 转换为 PDF/A。更多新功能详情如下。
https://www.e-iceblue.cn/Downloads/Spire-Office-Javascript.html
新功能:
新功能:
新功能:
我们很高兴地宣布发布 Spire.Doc for Python 14.4.2 版本。该版本带来了多项有价值的新功能,例如支持将 Word 转换为 Excel,以及将 MHTML 转换为 PDF。此外,还修复了在将 Word 转换为 PDF 时添加数字签名失败的问题。详情如下。
新功能:
document = Document()
document.LoadFromFile("input.mhtml")
document.SaveToFile("output.pdf", FileFormat.PDF)
document.Close()
HtmlExportOptions options = doc.HtmlExportOptions
options.OfficeMathOutputMode = HtmlOfficeMathOutputMode.MathML
document = Document()
document.LoadFromFile("input.docx")
document.SaveToFile("output.xlsx", FileFormat.XLSX)
document.Close()
问题修复:
Spire.PDF 12.4.5 现已正式发布。该版本增强了 PDF 到 PDF/A 和图片的转换功能,并同时修复了一些在合并和打印 PDF 文档时出现的问题。详情请查阅以下内容。
问题修复:
Spire.OCR 2.2.10 现已正式发布。该版本支持接入云端 AI 模型(如豆包、千问、DeepSeek 等)进行图片文本识别。(注:用户需自行在 AI 平台获取 API Key)。更多详情如下。
新功能:
static void Main(string[] args)
{
string filename = "1.png";
string outputFile = "scan.txt";
string filePath = "F:\\3.3.0AI\\AI\\"+"ocr.xml";
string newModel = "AIModel";
string newApiKey = "ApiKey";
string newApiUrl = "ApiUrl";
UpdateOcrConfig(filePath, newModel, newApiKey, newApiUrl);
ScanImg(filename, outputFile);
}
public static void ScanImg(string filename, string outputFile)
{
OcrScanner scanner = new OcrScanner();
ConfigureOptions configureOptions = new ConfigureOptions();
configureOptions.ModelPath = "F:\\3.3.0AI\\AI";
configureOptions.Language = "English";
scanner.ConfigureDependencies(configureOptions);
scanner.Scan(filename);
File.WriteAllText(outputFile, scanner.Text.ToString());
}
public static void UpdateOcrConfig(string filePath, string model, string apiKey, string apiUrl)
{
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlNode modelNode = doc.SelectSingleNode("/ocr/configs/model");
XmlNode apiKeyNode = doc.SelectSingleNode("/ocr/configs/apiKey");
XmlNode apiUrlNode = doc.SelectSingleNode("/ocr/configs/apiUrl");
if (modelNode != null) modelNode.InnerText = model;
if (apiKeyNode != null) apiKeyNode.InnerText = apiKey;
if (apiUrlNode != null) apiUrlNode.InnerText = apiUrl;
doc.Save(filePath);
Console.WriteLine("XML 文件更新成功!");
}
Spire.Doc for JavaScript 14.4.2 现已正式发布。该版本新增支持将 Word 文档转换为 Markdown 文件格式,同时支持在 Word 文档中添加 SVG 文件,并支持设置装订线宽度。详情如下。
新功能:
https://www.e-iceblue.cn/Downloads/Spire-DOC-Javascript.html