冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

CSV(逗号分隔值)作为轻量级数据交换格式,广泛应用于财务报表、用户数据、分析结果等场景。在.NET 开发中,高效处理和解析 CSV 文件是一项基础且重要的技能。本文将介绍如何借助Spire.XLS for .NET 通过 C# 读取 CSV 文件,包括直接读取和将 CSV 转换为 DataTable 两种方式。

安装 Spire.XLS 库

Spire.XLS for .NET 不仅是专业的 Excel 处理工具,还对 CSV 文件提供了完善支持,无需依赖 Microsoft Office,处理效率高且跨平台兼容。

安装步骤:

  • 打开 Visual Studio 项目,在解决方案资源管理器中右键点击项目;
  • 选择「管理 NuGet 包」,搜索「Spire.XLS」;
  • 点击「安装」完成依赖添加。

或通过程序包管理器控制台执行命令:

PM> Install-Package Spire.XLS

C# 读取 CSV 文件内容

以下 C# 代码示例演示如何加载 CSV 文件、访问其中数据,并以表格格式将内容输出到控制台。

using Spire.Xls;

namespace ReadCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 实例
            Workbook workbook = new Workbook();

            // 加载 CSV 文件
            workbook.LoadFromFile("库存表.csv", ",");

            // 获取第一个工作表
            Worksheet sheet = workbook.Worksheets[0];

            // 获取已使用的范围
            CellRange range = sheet.AllocatedRange;

            // 遍历行和列
            for (int row = 1; row <= range.RowCount; row++)
            {
                for (int col = 1; col <= range.ColumnCount; col++)
                {
                    // 获取单元格值
                    string cellValue = range[row, col].Value;
                    Console.Write(cellValue + "\t");
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

核心说明:

  • Workbook 类:作为 CSV 文件的内存容器,统一处理逻辑。
  • Workbook.LoadFromFile():用于加载 CSV 文件,参数说明如下:
    • 文件路径:如"库存表.csv"。
    • 分隔符:","(逗号 - CSV 的默认分隔符)。
  • Worksheet.AllocatedRange:仅获取包含数据的单元格范围。
  • CellRange[row, col].Value:用于获取特定单元格的值。

运行效果:CSV 数据将以清晰的制表符分隔格式输出到控制台。

C# 将 CSV 文件读取到控制台

若需要通过 VB.NET 读取 CSV 文件,可使用 C# 到 VB.NET转换器 直接转换代码

C# 读取 CSV 到 DataTable

DataTable 是.NET 中灵活的内存数据结构,便于筛选、排序、绑定 UI 等高级操作。以下代码演示如何将 CSV 直接转换为 DataTable:

using Spire.Xls;
using System.Data;

namespace ReadCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 实例
            Workbook workbook = new Workbook();

            // 加载 CSV 文件
            workbook.LoadFromFile("库存表.csv", ",");

            // 获取第一个工作表
            Worksheet worksheet = workbook.Worksheets[0];

            // 将工作表中的数据导出到 DataTable
            DataTable dataTable = worksheet.ExportDataTable();

            // 获取行和列的数量
            Console.WriteLine("\n转换完成!DataTable信息:");
            Console.WriteLine($"列数:{dataTable.Columns.Count}");
            Console.WriteLine($"行数:{dataTable.Rows.Count}");
            Console.WriteLine();

            // 打印列名
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                Console.Write(dataTable.Columns[i].ColumnName + "  | ");
            }
            Console.WriteLine();
            Console.WriteLine("----------------------------------------------------------");

            // 打印行数据
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                for (int j = 0; j < dataTable.Columns.Count; j++)
                {                
                    string value = dataTable.Rows[i][j].ToString();

                    Console.Write(value + "\t");
                }
                Console.WriteLine(); 
            }
        }
    }
}

核心说明:

  • Worksheet.ExportDataTable():一键完成 CSV 到 DataTable 的转换。
  • 元数据与内容访问:可通过 DataTable 的 ColumnsRows 属性快速获取元数据与内容。
  • 高级操作:转换后的数据支持与数据库、UI 组件(如 DataGridView)直接交互。

运行效果:输出包含列名、数据行及统计信息的结构化结果。

C# 将 CSV 文件转换为 DataTable

若需分析、计算或格式化数据,您可以通过 C# 将 CSV 转换为 Excel

两种方法的适用场景

根据实际需求选择合适的方法:

方法 适用场景 典型用例
直接读取 CSV 快速验证数据、简单打印输出 检查 CSV 文件是否正确加载、预览数据
转换为 DataTable 复杂数据处理、绑定 UI 或数据库 筛选行、排序数据或保存到SQL Server

结论

借助 Spire.XLS for .NET,C# 处理 CSV 文件变得简单高效:直接读取适用于快速验证,转换为 DataTable 则便于高级操作。两种方法均无需依赖 Office,且代码可直接复用(只需修改文件路径)。

如需进一步了解格式转换、样式应用等高级功能,可参考 Spire.XLS 官方文档

常见问题

问题1:为什么选择用 Spire.XLS 读取 CSV 文件?

:虽然 .NET Framework 提供了内置的 StreamReader 处理 CSV 文件,但 Spire.XLS 的优势在于:

  • 无需依赖:不需要安装 Microsoft Excel 或 Office
  • 高性能:针对大型 CSV 文件的高效处理进行了优化
  • 灵活性:提供多种读取 CSV 数据的方式,可按需选择
  • 跨平台:兼容.NET Framework/.NET Core/.NET Standard 等多框架

问题2:如何处理非逗号分隔的文件(如分号或制表符)?

:只需将 LoadFromFile() 的第二个参数替换为实际分隔符即可:

// 读取制表符分隔的文件
workbook.LoadFromFile("data.txt", "\t");

// 读取分号分隔的文件
workbook.LoadFromFile("data.csv", ";");

// 读取竖线分隔的文件
workbook.LoadFromFile("data.csv", "|");

问题3:能否读取 CSV 中的指定行或列?

:可以。通过定义范围实现精准读取,例如跳过标题行只取特定列:

// 定义特定范围
int startRow = 2;   // 从第2行开始(跳过标题)
int endRow = 4;     // 在第4行结束
int startCol = 2;   // 从第2列开始
int endCol = 6;     // 在第6列结束


// 遍历行和列
for (int row = startRow; row <= endRow; row++)
{
   for (int col = startCol; col <= endCol; col++)
   {
      // 获取单元格值
      string cellValue = worksheet.Range[row, col].Value;
      Console.Write(cellValue + "\t"); 
   }
   Console.WriteLine();
}

注意:Spire.XLS 采用 1-based 索引(与Excel一致),因此第一行/列编号为1(而非0)。

我们很高兴地宣布 Spire.PDFViewer 8.1.8 的发布。此更新引入了对 Windows 上 MAUI 的支持,并解决了 PDF 内容无法完整显示的问题。更多详细信息如下。

新功能:

问题修复:


获取 Spire.PDFViewer 8.1.8 请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDFViewer-NET.html

Spire.PDF for Python 11.9.0 现已正式发布。该版本支持在 PDF 中绘制表格,以及给多行文本添加批注。此外,它还修复了一个在转换后的HTML文件中出现的问题。详情请查阅以下内容。

新功能:

  • 支持在转换 PDF 到图片时设置图片 DPI。
  • pdf.SaveAsImage(pageIndex,dpiX,dpiY)

    问题修复:


    获取 Spire.PDF for Python 11.9.0 请点击:

    https://www.e-iceblue.cn/Downloads/Spire-PDF-Python.html

    Markdown 转 HTML Python 教程

    Markdown (.md) 是一种在网页开发、文档撰写和技术写作中广受欢迎的格式。其简洁直观的语法不仅能够提升写作效率,还能让内容阅读更加顺畅。然而,浏览器无法直接解析 Markdown,因此将 Markdown 转换为 HTML 是保证内容结构清晰、排版规范,并能够在各类网页平台上正常显示的关键步骤。

    本教程将展示如何使用 Python 和 Spire.Doc for Python 高效实现 Markdown 到 HTML 的转换。内容涵盖详细步骤与实用代码示例,既支持单文件转换,也可进行批量处理,帮助您快速掌握完整流程,实现高效、可靠的文档转换。

    目录

    什么是 Markdown?

    Markdown 是一种轻量级标记语言,旨在提升可读性和易写性。与繁琐的 HTML 相比,Markdown 使用简单的语法来表示标题、列表、链接和图片等元素。

    示例 Markdown:

    # 这是一个标题
    这是一个包含 **粗体文本** 和 *斜体文本* 的段落。
    
    - 项目 1
    - 项目 2
    

    即使在原始格式下,Markdown 也非常易于阅读,这使得它在文档、博客、README 文件和技术写作中备受青睐。

    有关 Markdown 语法的更多信息,请参考 Markdown 指南

    为什么要将 Markdown 转换为 HTML?

    虽然 Markdown 非常适合撰写内容,但网页浏览器并不能直接解析它。将 Markdown 转换为 HTML 可以为您带来以下好处:

    • 网站发布:大多数内容管理系统需要使用 HTML 格式来发布网页内容。
    • 增强样式:HTML 支持 CSS 和 JavaScript,使您能够实现更加复杂的格式和交互效果。
    • 保持兼容性:HTML 在所有主流浏览器中得到广泛支持,确保您的内容能够正确显示。
    • 与 Web 框架集成:如 React、Vue 和 Angular 等框架都依赖于 HTML 作为渲染组件的基础。

    通过将 Markdown 转换为 HTML,您可以充分利用这些优势,提升内容的展示效果和用户体验。

    Spire.Doc for Python 介绍

    Spire.Doc for Python 是一个多功能的文档处理库,能够读取 Word 文档和 Markdown 文件,并将内容导出为 HTML。这个库让开发者可以用极少的代码轻松地将 Markdown 转换为 HTML,同时保持良好的格式和结构。

    此外,Spire.Doc for Python 还支持将 Markdown 转换为 WordPDF,这使其成为一个完整的解决方案,适合希望使用同一工具处理 Markdown 并输出为多种格式的开发者。

    使用 Spire.Doc for Python 进行 Markdown 到 HTML 转换的优势

    • 易于使用的 API:提供简单直观的方法,显著减少开发工作量。
    • 精准的格式保留:能够完美保留所有 Markdown 元素,如标题、列表和链接。
    • 无额外依赖:不需要手动解析或依赖第三方库,使用方便。
    • 灵活性:支持单文件转换和批量处理,满足不同需求。

    如何使用 Python 将 Markdown 转换为 HTML

    现在您已经了解了将 Markdown 转换为 HTML 的目的和好处,接下来,我们将逐步演示如何在 Python 中将 Markdown 文件转换为适合网页使用的 HTML。

    步骤 1:安装 Spire.Doc for Python

    首先,确保在您的环境中安装了 Spire.Doc for Python。您可以通过运行以下 pip 命令从 PyPI 安装它:

    pip install spire.doc
    

    步骤 2:准备 Markdown 文件

    接下来,创建一个示例 Markdown 文件,例如 example-zh.md,作为转换的对象。

    示例Markdown文件

    步骤 3:编写 Python 脚本

    编写一个 Python 脚本,加载 Markdown 文件并将其转换为 HTML:

    from spire.doc import *
    
    # 创建 Document 对象
    doc = Document()
    
    # 从文件加载 Markdown
    doc.LoadFromFile("example-zh.md", FileFormat.Markdown)
    
    # 将文档保存为 HTML
    doc.SaveToFile("example-zh.html", FileFormat.Html)
    
    # 关闭文档
    doc.Close()
    

    代码说明:

    • Document():初始化一个新的Document对象。
    • LoadFromFile("example-zh.md", FileFormat.Markdown):将 Markdown 文件加载到Document对象中。
    • SaveToFile("example-zh.html", FileFormat.Html):将内容转换为 HTML 并保存到磁盘。
    • doc.Close():确保资源正确释放,这在处理多个文件或执行批处理时尤为重要。

    步骤 4:验证 HTML 输出

    最后,在网页浏览器或 HTML 编辑器中打开生成的 example-zh.html 文件,确认 Markdown 内容是否已正确转换。

    Python HTML转Markdown输出效果

    自动化批量转换多个 Markdown 文件为 HTML

    您可以自动化地转换文件夹中的多个 Markdown 文件。以下是示例代码:

    import os
    from spire.doc import *
    
    # 设置包含 Markdown 文件的文件夹
    input_folder = "markdown_files"
    
    # 设置 HTML 文件保存的文件夹
    output_folder = "html_files"
    
    # 如果输出文件夹不存在,则创建
    os.makedirs(output_folder, exist_ok=True)
    
    # 遍历输入文件夹中的所有文件
    for filename in os.listdir(input_folder):
        # 仅处理 Markdown 文件
        if filename.endswith(".md"):
            # 为每个文件创建一个新的 Document 对象
            doc = Document()
    
            # 将 Markdown 文件加载到 Document 对象中
            doc.LoadFromFile(os.path.join(input_folder, filename), FileFormat.Markdown)
    
            # 设置输出文件路径
            output_file = os.path.join(output_folder, filename.replace(".md", ".html"))
    
            # 将 Markdown 内容保存为 HTML
            doc.SaveToFile(output_file, FileFormat.Html)
    
            # 关闭文档以释放资源
            doc.Close()
    

    这种方法能够高效处理多个 Markdown 文件,并自动生成相应的 HTML 文件。通过批量转换,您可以节省时间并提升工作效率。

    Markdown 到 HTML 转换的实用建议

    虽然以上步骤已经可以完成 Markdown 到 HTML 的转换,但遵循一些实用建议可以帮助您避免常见问题,提升转换质量和输出效果:

    • 使用正确的 Markdown 语法:确保标题、列表、链接和强调的书写规范。
    • 使用 UTF-8 编码:始终以 UTF-8 编码保存 Markdown 文件,以避免特殊字符或非英文文本的问题。
    • 批量处理:如果需要转换多个文件,可以将脚本放入循环中,处理整个文件夹。这样不仅节省时间,还能确保文件格式一致。
    • 丰富样式:HTML 允许您添加 CSS 和 JavaScript,以实现自定义布局、响应式设计和交互性,这是原始 Markdown 所无法实现的。

    总结

    通过使用 Python 和 Spire.Doc,您可以轻松将 Markdown 文件转换为 HTML。这种方法不仅高效便捷,还能完整保留文档的格式和结构,确保生成的 HTML 输出既美观又实用。无论您是处理单个文件还是进行批量转换,按照本指南的步骤,您都能高效地完成任务,提升工作效率。

    常见问题解答

    Q1: 我可以在 Python 中将多个 Markdown 文件转换为 HTML 吗?

    A1: 可以。您可以通过遍历目录中的 Markdown 文件,并对每个文件应用转换逻辑,实现批量转换。

    Q2: 转换后的 HTML 会保留所有 Markdown 的格式吗?

    A2: 会。Spire.Doc 能够有效保留 Markdown 格式,包括标题、列表、粗体、斜体文本、链接等。

    Q3: 在转换过程中如何处理 Markdown 中的图片?

    A3: Spire.Doc 支持转换嵌入在 Markdown 中的图片,确保它们保留在生成的 HTML 中。

    Q4: 除了 Spire.Doc,我还需要其他库吗?

    A4: 不需要额外的库。Spire.Doc for Python 提供了一个全面的解决方案,可以在没有外部依赖的情况下将 Markdown 转换为 HTML。

    Q5: 我可以在 Web 框架中使用生成的 HTML 吗?

    A5: 可以,生成的 HTML 与流行的 Web 框架(如 React、Vue 和 Angular)完全兼容。

    Java通过模板生成PDF

    在企业级应用开发中,生成 PDF 文档是一项非常常见的需求。无论是发票、报告、合同,还是其他业务文档,开发人员通常都需要一种高效、稳定的方式来创建 PDF。与其逐行绘制 PDF 内容,不如直接利用 模板 ——常见的模板形式包括 HTML 模板PDF 模板 ,开发者只需将动态数据填充进去,就能快速生成所需文档。

    在本文中,我们将介绍如何使用 Spire.PDF for Java 通过模板生成 PDF 文件。文章不仅涵盖 HTML 模板和 PDF 模板的使用方法,还会提供一些高效生成文档的最佳实践和常见问题解答,帮助你在实际项目中更好地应用。

    目录 :

    Spire.PDF for Java 简介

    Spire.PDF for Java是一个功能强大的 PDF 库,提供用于创建、读取、编辑和转换 PDF 文件的完整 API。它支持以下功能:

    • 从零生成 PDF :可以从头开始创建全新的 PDF 文档。
    • 将 HTML 、图片和文本转换为 PDF :支持将网页内容、图片或文本内容快速生成 PDF。
    • 修改或编辑现有 PDF :可以对已有 PDF 文件进行内容更新或调整。
    • 操作文本、图片、表格和注释 :提供丰富的文档处理能力,满足多样化需求。

    安装:

    1. 从官网下载 Spire.PDF for Java,并将 JAR 文件添加到项目的构建路径中。
    2. 如果你使用 Maven 管理项目,可以在 pom.xml 中添加如下依赖:
    <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>
    

    从 HTML 模板创建 PDF

    HTML 模板非常灵活,允许你通过 CSS 样式 自定义文档布局和外观。在模板中,你可以定义 占位符 (使用 {{ }} 包裹),在运行时动态替换成实际数据,从而生成个性化的 PDF 文档。

    安装 HTML 转 PDF 渲染引擎

    Spire.PDF 依赖外部引擎来将 HTML 渲染为 PDF,可以选择 Qt WebEngineGoogle Chrome 。在本指南中,我们将使用 Qt WebEngine

    1. 下载适用于操作系统的 Qt WebEngine 插件:

    2. 将下载的文件解压到本地文件夹,并找到 plugins 目录,例如:C:\plugins-windows-x64\plugins

    3. 在代码中配置插件路径:

    HtmlConverter.setPluginPath("C:\\plugins-windows-x64\\plugins");
    

    完成插件配置后,Spire.PDF 就可以将 HTML 完整渲染为 PDF,并支持 CSS 样式,实现高保真的文档转换。

    示例:从 HTML 模板生成发票 PDF

    import com.spire.pdf.graphics.PdfMargins;
    import com.spire.pdf.htmlconverter.LoadHtmlType;
    import com.spire.pdf.htmlconverter.qt.HtmlConverter;
    import com.spire.pdf.htmlconverter.qt.Size;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class CreatePdfFromHtmlTemplate {
    
        public static void main(String[] args) {
    
            // HTML 模板,使用双大括号 {{}} 作为占位符变量
            String htmlTemplate = "<!DOCTYPE html>\n" +
                    "<html lang=\"zh\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
                    "    <title>发票</title>\n" +
                    "    <style>\n" +
                    "        body {\n" +
                    "            font-family: 宋体, sans-serif;\n" +
                    "            margin: 20px;\n" +
                    "            padding: 20px;\n" +
                    "            font-size: 12pt;\n" +
                    "        }\n" +
                    "        h1 {\n" +
                    "            text-align: left;\n" +
                    "            font-size: 30pt;\n" +
                    "        }\n" +
                    "        h2 {\n" +
                    "            font-size: 18pt;\n" +
                    "        }\n" +
                    "        .invoice-header, .invoice-footer {\n" +
                    "            text-align: left;\n" +
                    "            margin-bottom: 20px;\n" +
                    "        }\n" +
                    "        .invoice-details {\n" +
                    "            margin-bottom: 20px;\n" +
                    "        }\n" +
                    "        table {\n" +
                    "            width: 100%;\n" +
                    "            border-collapse: collapse;\n" +
                    "        }\n" +
                    "        th, td {\n" +
                    "            border: 1px solid #ccc;\n" +
                    "            padding: 8px;\n" +
                    "            text-align: left;\n" +
                    "        }\n" +
                    "        th {\n" +
                    "            background-color: #f2f2f2;\n" +
                    "        }\n" +
                    "        .total {\n" +
                    "            font-weight: bold;\n" +
                    "        }\n" +
                    "    </style>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "    <div class=\"invoice-header\">\n" +
                    "        <h1>发票</h1>\n" +
                    "        <p>发票编号: {{INVOICE_NUMBER}}</p>\n" +
                    "        <p>日期: {{INVOICE_DATE}}</p>\n" +
                    "    </div>\n" +
                    "    <div class=\"invoice-details\">\n" +
                    "        <h2 style=\"margin-top: 50px;\">开票给:</h2>\n" +
                    "        <p>姓名: {{BILLER_NAME}}</p>\n" +
                    "        <p>地址: {{BILLER_ADDRESS}}</p>\n" +
                    "        <p>邮箱: {{BILLER_EMAIL}}</p>\n" +
                    "    </div>\n" +
                    "    <table>\n" +
                    "        <thead>\n" +
                    "            <tr>\n" +
                    "                <th>描述</th>\n" +
                    "                <th>数量</th>\n" +
                    "                <th>单价</th>\n" +
                    "                <th>总计</th>\n" +
                    "            </tr>\n" +
                    "        </thead>\n" +
                    "        <tbody>\n" +
                    "            <tr>\n" +
                    "                <td>{{ITEM_DESCRIPTION}}</td>\n" +
                    "                <td>{{ITEM_QUANTITY}}</td>\n" +
                    "                <td>{{ITEM_UNIT_PRICE}}</td>\n" +
                    "                <td>{{ITEM_TOTAL}}</td>\n" +
                    "            </tr>\n" +
                    "            <!-- 如有需要,可添加更多项目 -->\n" +
                    "        </tbody>\n" +
                    "    </table>\n" +
                    "    <div class=\"total\" style=\"text-align: right;\">\n" +
                    "        <p>小计: {{SUBTOTAL}}</p>\n" +
                    "        <p>税率 ({{TAX_RATE}}%): {{TAX}}</p>\n" +
                    "        <p>总计: {{TOTAL}}</p>\n" +
                    "    </div>\n" +
                    "    <div class=\"invoice-footer\">\n" +
                    "        <p>感谢您的惠顾!</p>\n" +
                    "    </div>\n" +
                    "</body>\n" +
                    "</html>";
    
            // 发票示例数据 - 与模板占位符对应的键值对
            Map<String, String> invoiceData = new HashMap<>();
            invoiceData.put("INVOICE_NUMBER", "12345");
            invoiceData.put("INVOICE_DATE", "2025-08-25");
            invoiceData.put("BILLER_NAME", "张三");
            invoiceData.put("BILLER_ADDRESS", "北京市朝阳区123号");
            invoiceData.put("BILLER_EMAIL", "zhangsan@ example.com");
            invoiceData.put("ITEM_DESCRIPTION", "咨询服务");
            invoiceData.put("ITEM_QUANTITY", "10");
            invoiceData.put("ITEM_UNIT_PRICE", "¥100");
            invoiceData.put("ITEM_TOTAL", "¥1000");
            invoiceData.put("SUBTOTAL", "¥1000");
            invoiceData.put("TAX_RATE", "5");
            invoiceData.put("TAX", "¥50");
            invoiceData.put("TOTAL", "¥1050");
    
            // 用实际数据填充 HTML 模板
            String populatedInvoice = populateInvoice(htmlTemplate, invoiceData);
    
            // 指定生成 PDF 的输出路径
            String outputFile = "output/HtmlToPdf.pdf";
    
            // 指定 HTML 转 PDF 转换器插件路径(QT 插件)
            String pluginPath = "C:\\plugins-windows-x64\\plugins";
    
            // 设置 HTML 转 PDF 所需的插件路径
            HtmlConverter.setPluginPath(pluginPath);
    
            // 将 HTML 字符串转换为 PDF 并指定相关设置
            HtmlConverter.convert(populatedInvoice, outputFile,
                    true, // 启用 JavaScript
                    100000, // 超时时间(毫秒)
                    new Size(595, 842), // A4 页面大小(595x842磅)
                    new PdfMargins(20), // 四边 20 点边距
                    LoadHtmlType.Source_Code); // 从 HTML 源代码字符串加载
        }
    
        // 辅助方法:用数据 Map 中的实际值替换模板占位符
        private static String populateInvoice(String template, Map<String, String> data) {
            String result = template;
            for (Map.Entry<String, String> entry : data.entrySet()) {
                result = result.replace("{{" + entry.getKey() + "}}", entry.getValue());
            }
            return result;
        }
    }
    

    工作原理

    1. 定义一个 HTML 模板,使用占位符 {{PLACEHOLDER_NAME}}。
    2. 将实际数据存储在 Map<String, String> 中。
    3. 在运行时用实际数据替换占位符。
    4. 使用 HtmlConverter.convert 生成带样式的 PDF。

    这种方法非常适合 发票、收据和报表 等对格式有要求的文档生成场景。

    效果图:

    Java根据HTML模板生成PDF

    您可以能感兴趣:Java 将 URL、HTML 字符串或文件转换为 PDF

    基于现有 PDF 模板生成 PDF

    如果你已经有一个预先设计好的 PDF 表单或模板,可以直接在 PDF 内部 替换占位符 来生成新的文档。

    示例:替换 PDF 模板中的文本

    import com.spire.pdf.PdfDocument;
    import com.spire.pdf.PdfPageBase;
    import com.spire.pdf.texts.PdfTextReplaceOptions;
    import com.spire.pdf.texts.PdfTextReplacer;
    import com.spire.pdf.texts.ReplaceActionType;
    
    import java.util.EnumSet;
    import java.util.HashMap;
    import java.util.Map;
    
    public class CreatePdfFromPdfTemplate {
    
        public static void main(String[] args) {
    
            // 创建 PdfDocument 对象
            PdfDocument doc = new PdfDocument();
    
            // 加载现有 PDF 文件
            doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Template.pdf");
    
            // 创建 PdfTextReplaceOptions 对象并指定替换选项
            PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
            textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
    
            // 获取指定页面(此处为第一页)
            PdfPageBase page = doc.getPages().get(0);
    
            // 基于页面创建 PdfTextReplacer 对象
            PdfTextReplacer textReplacer = new PdfTextReplacer(page);
            textReplacer.setOptions(textReplaceOptions);
    
            // 定义旧字符串和新字符串的字典
            Map<String, String> replacements = new HashMap<>();
            replacements.put("{PROJECT_NAME}", "新网站开发");
            replacements.put("{PROJECT_NO}", "2023-001");
            replacements.put("{PROJECT MANAGER}", "王五");
            replacements.put("{PERIOD}", "2023年第3季度");
            replacements.put("{START_DATE}", "2023年7月1日");
            replacements.put("{END_DATE}", "2023年9月30日");
    
            // 遍历字典,替换占位符文本
            for (Map.Entry<String, String> pair : replacements.entrySet()) {
                textReplacer.replaceText(pair.getKey(), pair.getValue());
            }
    
            // 保存修改后的 PDF 到新的文件
            doc.saveToFile("output/ModifyTemplate.pdf");
            doc.dispose();
        }
    }
    

    工作原理

    1. 加载现有 PDF 模板。
    2. 使用 PdfTextReplacer 查找并替换占位符文本。
    3. 将更新后的文件保存为新的 PDF。

    注意事项

    • 此方法仅适用于 行内文本替换 ,适合替换 短文本 ,例如姓名、日期、ID 或项目编号。
    • 如果需要插入 多行文本 (例如长描述、条款或表格行),此方法不适用,因为 PDF 文本替换不会自动调整页面布局。

    多行文本的替代方案

    • 设计 HTML 或 Word 模板,然后转换为 PDF。
    • 使用 Spire.PDF 的文本绘制 API 编程生成新的文本块到 PDF 页面上。

    效果图:

    Java根据PDF模版生成PDF

    使用模板生成 PDF 的最佳实践

    • 使用 HTML 模板以获得灵活性 :适合发票、收据和报表等场景,尤其是需要处理长文本块、表格和 CSS 样式的文档。
    • 使用 PDF 模板以保证严格布局 :适合简单的占位符替换,如项目名称、日期或编号等固定内容。
    • 在适当情况下使用 Word 模板 :如果你的模板是 Word 格式,可以使用 Spire.Doc for Java。它支持在 Word 文件中修改占位符,并直接导出为 PDF。
    • 保持占位符唯一性 :使用清晰的标记,例如 {START_DATE} 或 {END_DATE},以避免意外替换。
    • 集中管理模板 :将模板存放在代码外部,以便于更新和维护。
    • 使用真实数据进行测试 :在投入生产使用前,务必验证格式、对齐方式和文本换行效果。

    常见问题与解答

    Q1:我可以在 Java 中通过 Word 模板创建 PDF 文件吗?

    可以,但需要使用 Spire.Doc for Java。它允许你替换 Word 文档中的占位符,然后将结果导出为 PDF。

    Q2:在通过模板生成 PDF 时,我可以添加图片或图表吗?

    可以。使用 Spire.PDF,无论是基于 HTML 模板生成,还是修改现有 PDF 模板,都可以嵌入图片、图表和形状。

    Q3:HTML 转 PDF 是否需要 Qt WebEngine 或 Google Chrome?

    是的,需要插件来准确渲染带样式和 CSS 的 HTML。

    • Qt WebEngine :易于配置,轻量级,且在 Spire.PDF 示例中常用。
    • Google Chrome :对于复杂的现代网页(尤其是包含高级 CSS 或 JavaScript 的页面)提供更高保真度。

    建议:简单文档使用 Qt WebEngine,要求与最新浏览器渲染效果一致时使用 Google Chrome。

    Q4:Spire.PDF for Java 支持模板中的多语言文本吗?

    支持。Spire.PDF 完全支持 Unicode,可以生成包含多种语言(如英文、中文、阿拉伯语或印地语)的 PDF,且不会丢失格式。

    总结

    通过将 Spire.PDF集成到 Java 项目中,你可以从 HTML 模板PDF 模板 高效生成专业的 PDF 文档。根据不同场景的需求:

    • 使用 PDF 模板 :适合轻量级文本替换。
    • 使用 HTML 模板 :当需要丰富的格式、表格、图片或多行内容时更合适。
    • 配置 Qt WebEngineGoogle Chrome :确保 HTML 转 PDF 的渲染准确无误。

    如果你的工作流程已经依赖 Word 模板,可以考虑使用 Spire.Doc for Java ,它能够:

    • 轻松替换 Word 文档中的占位符。
    • 保留所有 Word 格式、样式和布局。
    • 无损导出为 PDF,确保文档高保真。

    这种灵活性让你可以根据模板格式选择合适的工具 —— Spire.PDFSpire.Doc ,从而确保 PDF 输出既高效又高质量。

    申请临时License

    如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。

    Spire.Office 10.8.0 更新已发布。在该版本中,Spire.Doc 支持比较两个列表级别是否一致;Spire.Presentation 加强了PPTX 转 PDF;Spire.PDF 支持转换 PDF 到 SVG 时设置 SVG 文件的宽高。此外,大量已知问题在该版本中成功修复。详情请阅读以下内容。

    该版本涵盖了最新版的 Spire.Doc、Spire.PDF、Spire.XLS、Spire.Presentation、Spire.Barcode、Spire.Email、Spire.DocViewer、Spire.PDFViewer、Spire.OfficeViewer 和 Spire.DataExport。

    版本信息如下:


    获取Spire.Office 10.8.0,请点击:

    https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html

    Spire.Doc

    新功能:

    调整:

    Spire.Presentation

    更新依赖项:

    问题修复:

    Spire.PDF

    新功能:

    优化:

    调整:

    问题修复:

    手动向 Excel 工作表中输入数据既耗时又容易出错,尤其是在处理大型数据集时。而借助合适的 Java Excel 库,可以简化数据输入这一流程。本文将详细介绍如何使用 Spire.XLS for Java 库,通过 3 种高效方法完成 Java 向 Excel 工作表的数据写入,涵盖基础的逐个单元格录入、批量数组插入以及 DataTable 导出。

    设置与安装

    开始之前,需先将 Spire.XLS for Java 集成到项目中,以下为两种快速部署方式:

    方式 1:手动下载 JAR 包

    方式 2:Maven 依赖集成

    在项目 pom.xml 中添加以下仓库和依赖,Maven 会自动下载并引入库(无需手动处理依赖冲突):

    <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.xls</artifactId>
            <version>15.11.3</version>
        </dependency>
    </dependencies>
    

    Java 向 Excel 中写入数据的 3 种方法

    Spire.XLS for Java 提供了灵活的数据写入方法,可适配不同使用场景。以下将结合完整代码示例、说明及适用场景,逐一介绍每种方法。

    1. 在 Excel 单元格中写入文本或数字

    若需向单个单元格填充文本或数字,Spire.XLS 支持通过行、列索引(例如(2,1)代表第 2 行第 1 列)或 Excel 样式引用(例如"A1"、"B3")直接定位目标单元格:

    核心方法:

    • 使用 Worksheet.get(int row, int column)Worksheet.get(String name) 方法获取指定 Excel 单元格
    • 使用 setValue() 方法向单元格写入文本值
    • 使用 setNumberValue() 方法向单元格写入数值

    Java 代码示例:

    import com.spire.xls.*;
    
    public class WriteToCells {
    
        public static void main(String[] args) {
    
            // 创建 Workbook 对象
            Workbook workbook = new Workbook();
    
            // 获取第一个工作表
            Worksheet worksheet = workbook.getWorksheets().get(0);
    
            // 向指定单元格写入数据
            worksheet.get("A1").setValue("物品名");
            worksheet.get("B1").setValue("数量");
            worksheet.get("C1").setValue("分类");
            worksheet.get("D1").setValue("采购日期");
            worksheet.get(2,1).setValue("键盘");
            worksheet.get(2,2).setNumberValue(12);
            worksheet.get(2,3).setValue("办公用品");
            worksheet.get(2,4).setValue("2024/11/09");
            worksheet.get(3,1).setValue("毛巾");
            worksheet.get(3,2).setNumberValue(30);
            worksheet.get(3,3).setValue("生活用品");
            worksheet.get(3,4).setValue("2024/12/18");
    
            // 为第一行应用样式
            CellStyle style = workbook.getStyles().addStyle("newStyle");
            style.getFont().isBold(true); // 设置字体为粗体
            worksheet.getRange().get(1,1,1,4).setStyle(style);
    
            // 保存为 Excel 文件
            workbook.saveToFile("写入数据到单元格.xlsx", ExcelVersion.Version2016);
        }
    }
    

    适用场景:

    适用于小型数据集,且需要精确控制单元格位置的场景(例如添加标题、单行数据录入)。

    效果预览:

    Java 在指定单元格中写入数据

    2. 写入数组到 Excel 工作表

    将一维数组(单行)或二维数组(多行多列)一次性插入连续单元格区域,能提升逐个写入的效率。

    核心 API:insertArray() 解析

    insertArray() 方法可轻松处理一维数组(单行数据)和二维数组(多行多列数据),其参数说明如下:

    • Object[] array/ Object[][] array:待插入的一维、二维数组
    • int firstRow:起始行索引(从 1 开始)
    • int firstColumn:起始列索引(从 1 开始)
    • boolean isVertical:一维数组插入方向
      • false:水平插入(从左到右)
      • true:垂直插入(从上到下)

    Java 代码示例:

    import com.spire.xls.*;
    
    public class WriteArrayToWorksheet {
    
        public static void main(String[] args) {
    
            // 创建 Workbook 实例
            Workbook workbook = new Workbook();
    
            // 获取第一个工作表
            Worksheet worksheet = workbook.getWorksheets().get(0);
    
            // 创建一维数组
            Object[] oneDimensionalArray = {"一月", "二月", "三月", "四月", "五月", "六月"};
    
            // 将一维数组写入工作表第一行
            worksheet.insertArray(oneDimensionalArray, 1, 1, false);
    
            // 创建二维数组
            Object[][] twoDimensionalArray = {
                    {"姓名", "年龄", "性别", "部门", "电话"},
                    {"Bob", "25", "男", "技术部", "654214"},
                    {"John", "24", "男", "广告部", "624847"},
                    {"Kelly", "26", "女", "销售部", "624758"}
            };
    
            // 将二维数组从 A3 单元格开始写入工作表
            worksheet.insertArray(twoDimensionalArray, 3, 1);
            
            // 为第一行和第三行应用样式
            CellStyle style = workbook.getStyles().addStyle("newStyle");
            style.getFont().isBold(true); // 设置字体为粗体
            worksheet.getRange().get(1,1,1,6).setStyle(style);
            worksheet.getRange().get(3,1,3,6).setStyle(style);
    
            // 保存为 Excel 文件
            workbook.saveToFile("写入数组.xlsx", ExcelVersion.Version2016);
        }
    }
    

    适用场景:

    适用于有序数据(例如库存日志、用户列表)的批量插入场景。

    效果预览:

    Java 插入数组到 Excel 工作表

    3. 写入 DataTable 数据到 Excel 工作表

    若数据存储在 DataTable 中(例如来自数据库的数据),Spire.XLS 可通过 insertDataTable() 方法直接将其导出到 Excel,并保留数据结构和列标题。

    核心 API:insertDataTable() 解析

    insertDataTable() 是专用于向 Excel 工作表中批量插入结构化数据集的方法,其参数说明如下:

    • DataTable dataTable:待导出的 DataTable 对象
    • boolean columnHeaders:是否将 DataTable 的列名作为 Excel 表头
    • int firstRow:起始行索引(从 1 开始)
    • int firstColumn:起始列索引(从 1 开始)
    • boolean transTypes:是否保留数据类型

    Java 代码示例:

    import com.spire.xls.*;
    import com.spire.xls.data.table.DataRow;
    import com.spire.xls.data.table.DataTable;
    
    public class WriteDataTableToWorksheet {
    
        public static void main(String[] args) throws Exception {
    
            // 创建 Workbook 实例
            Workbook workbook = new Workbook();
    
            // 获取第一个工作表
            Worksheet worksheet = workbook.getWorksheets().get(0);
    
            // 创建 DataTable 对象
            DataTable dataTable = new DataTable();
            dataTable.getColumns().add("SKU", Integer.class); // 库存单位(SKU)
            dataTable.getColumns().add("产品名", String.class); // 产品名称
            dataTable.getColumns().add("价格", String.class); // 价格
    
            // 创建数据行并添加数据
            DataRow dr = dataTable.newRow();
            dr.setInt(0, 512900512);
            dr.setString(1,"无线鼠标M200");
            dr.setString(2,"¥99");
            dataTable.getRows().add(dr);
    
            dr = dataTable.newRow();
            dr.setInt(0,512900637);
            dr.setString(1,"B100有线鼠标");
            dr.setString(2,"¥85");
            dataTable.getRows().add(dr);
    
            dr = dataTable.newRow();
            dr.setInt(0,512901829);
            dr.setString(1,"游戏鼠标");
            dr.setString(2,"¥125");
            dataTable.getRows().add(dr);
    
            dr = dataTable.newRow();
            dr.setInt(0,512900386);
            dr.setString(1,"ZM光电鼠标");
            dr.setString(2,"¥89");
            dataTable.getRows().add(dr);
    
            // 将DataTable写入工作表
            worksheet.insertDataTable(dataTable,true,1,1,true);
    
            // 为第一行应用样式
            CellStyle style = workbook.getStyles().addStyle("newStyle");
            style.getFont().isBold(true); // 设置字体为粗体
            worksheet.getRange().get(1,1,1,3).setStyle(style);
    
            // 保存为Excel文件
            workbook.saveToFile("写入DataTable.xlsx", ExcelVersion.Version2016);
        }
    }
    

    适用场景:

    适用于导出数据库数据、客户关系管理(CRM)数据,或任何存储在 DataTable 中的结构化数据(例如 SQL 查询结果、CSV 导入数据)。

    效果预览:

    Java 导入数据表到 Excel 工作表

    大型数据集性能优化指南

    当处理超大型数据时,需通过以下手段减少内存占用、提升速度:

    • 优先使用批量操作(insertArray()insertDataTable()),而非逐个单元格写入。
    • 先写入所有数据,最后统一设置样式(避免频繁刷新表格布局)。
    • 对于大型数据集,建议使用流模式写入以减少内存占用。

    常见问题(FAQ)

    Q1:Spire.XLS for Java 支持哪些 Excel 格式?

    :Spire.XLS for Java 支持所有主流 Excel 格式,包括:

    • 旧版:XLS(Excel 97-2003)
    • 新版:XLSX、XLSM(支持宏)、XLSB 等。

    可通过 saveToFile() 方法指定输出格式。

    Q2:如何设置单元格格式(颜色、字体、边框)?

    :Spire.XLS 提供了丰富的样式设置功能,可参考以下指南:

    Q3:如何消除输出文件中的 Evaluation Warning?

    :需申请免费试用许可证,步骤如下:

    com.spire.xls.license.LicenseProvider.setLicenseKey("许可证密钥");
    
    Workbook workbook = new Workbook();
    

    总结

    对于数据驱动应用中的 Java 开发者而言,掌握 Excel 导出功能至关重要。Spire.XLS for Java 库提供了 3 种通过 Java 向 Excel 写入数据的高效方法:

    • 逐个单元格写入:实现精确控制
    • 数组批量插入:实现高性能数据录入
    • DataTable 导出:实现数据库式结构化数据传输

    结合本文的性能优化技巧,可轻松应对从简单报表到大型数据导出的各类需求。若需进一步探索高级功能(如公式计算、图表插入),可参考 Spire.XLS 官网的教程示例

    Spire.Office for Java 10.8.0 现已发布。该版本主要修复了在转换或处理 Word、Excel、PowerPoint 和 PDF 文件时出现的已知问题。例如,Spire.Doc for Java 修复了更新目录字段失败的问题;Spire.PDF for Java 修复了在重复使用 PdfTextReplacer 时发生的内存溢出问题。更多详细信息如下。


    获取Spire.Office for Java 10.8.0,请点击:

    https://www.e-iceblue.cn/Downloads/Spire-Office-JAVA.html

    Spire.Doc for Java

    问题修复:

    Spire.XLS for Java

    问题修复:

    Spire.Presentation for Java

    优化:

    问题修复:

    Spire.PDF for Java

    优化:

    问题修复:

    Spire.Doc for Java 13.8.7 现已正式发布。该版本主要提升了稳定性,修复了多项问题,包括Word转PDF错误、修订跟踪问题以及文档加载异常等。更多详情如下。

    问题修复:


    获取 Spire.Doc for Java 13.8.7 请点击:

    https://www.e-iceblue.cn/Downloads/Spire-Doc-JAVA.html

    Java 字节数组转PDF

    在现代 Java 应用中,PDF 数据并不总是以文件形式存储在磁盘上。它可能通过网络传输、由 REST API 返回,或以字节数组形式存储在数据库中。这类场景中,我们经常需要将字节数组还原为 PDF 文件,甚至需要从纯文本字节生成新的 PDF 文档。

    本教程将介绍如何使用 Spire.PDF for Java 在 Java 中将字节(Byte)数组转换为PDF文档

    目录:

    Spire.PDF for Java 入门指南

    Spire.PDF 是一款功能强大的 API,为 Java 开发者提供无需依赖 Adobe Acrobat 即可创建、读取、编辑、转换和打印 PDF 文档的能力。

    核心功能:

    • 生成包含文本、图片、表格和形状的 PDF 文档。
    • 编辑现有 PDF 并支持文本与图像提取。
    • PDF 转换为 HTML、Word、Excel 及图像等多种格式。
    • 通过密码保护实现 PDF 加密。
    • 添加水印、注释及数字签名。

    安装:

    请从官方网站下载 Spire.PDF for Java,并将 JAR 文件添加到项目的构建路径中。若使用 Maven 项目管理工具,请在 pom.xml 文件中配置以下依赖项:

    <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>
    

    环境配置完成后,即可开始执行字节数组转 PDF 及其他 PDF 相关操作。

    解析 PDF 字节与文本字节的区别

    在编写代码前,需要明确区分两种截然不同的字节数组类型:

    • PDF 文件字节 :代表有效 PDF 文档的实际二进制结构。这类字节始终以 %PDF-1.x 开头,包含对象、交叉引用表和流数据。此类字节数组可直接加载到 PdfDocument 对象中。
    • 文本字节 :仅仅是字符的 ASCII 或 UTF-8 编码。例如:
    byte[] bytes = {-26, -83, -92};  
    System.out.println(new String(bytes, java.nio.charset.StandardCharsets.UTF_8)); // 输出结果:"此"
    

    这类数组并非有效的 PDF 数据,但可以通过创建新 PDF 文档并将文本内容写入其中来实现转换。

    Java 从字节数组加载 PDF 文档

    假设你想从 URL 下载一个 PDF,并将其作为字节数组在内存中处理。使用 Spire.PDF for Java,你可以轻松加载并将其保存为 PDF 文档。

    import com.spire.pdf.PdfDocument;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class LoadPdfFromByteArray throws Exception {
    
        public static void main(String[] args) {
            
            // PDF URL
            String fileUrl = "https://www.e-iceblue.com/resource/sample_pdf_for_download.pdf";
    
            // 将 PDF 下载为字节数组
            byte[] pdfBytes = downloadPdfAsBytes(fileUrl);
    
            // 创建 PdfDocument 对象
            PdfDocument doc = new PdfDocument();
    
            // 从字节数组加载 PDF
            doc.loadFromStream(new ByteArrayInputStream(pdfBytes));
    
            // 将文档保存到本地
            doc.saveToFile("downloaded.pdf");
            doc.close();
        }
    
        // 辅助方法:将文件下载为字节数组
        private static byte[] downloadPdfAsBytes(String fileUrl) throws Exception {
            URL url = new URL(fileUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
    
            InputStream inputStream = conn.getInputStream();
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    
            byte[] data = new byte[4096];
            int nRead;
            while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }
    
            buffer.flush();
            inputStream.close();
            conn.disconnect();
    
            return buffer.toByteArray();
        }
    }
    

    工作原理:

    1. 发出 HTTP 请求以获取 PDF 文件。
    2. 使用 ByteArrayOutputStreamInputStream转换为字节数组。
    3. 通过 loadFromStream将字节数组传递给 Spire.PDF。
    4. 根据需要保存或处理文档。

    效果图:

    Java 从字节数组加载 PDF 文档

    Java 基于文本字节创建 PDF 文档

    如果你只有纯文本字节(例如:“此文档是由文本字节创建的。”),你可以将其解码为字符串,然后将文本绘制到新的 PDF 文档中。

    import com.spire.pdf.*;
    import com.spire.pdf.graphics.*;
    import java.awt.*;
    
    public class TextFromBytesToPdf {
        public static void main(String[] args) {
    
            // 你的文本字节
            byte[] byteArray = {
    
                    -26, -83, -92, // 此
                    -26, -106, -121, // 文
                    -26, -95, -93, // 档
                    -26, -104, -81, // 是
                    -25, -108, -79, // 由
                    -26, -106, -121, // 文
                    -26, -100, -84, // 本
                    -27, -83, -105, // 字
                    -24, -118, -126, // 节
                    -27, -120, -101, // 创
                    -27, -69, -70, // 建
                    -25, -102, -124, // 的
                    -29, -128, -126 // 。
            };
            String text = new String(byteArray, java.nio.charset.StandardCharsets.UTF_8);
    
            // 创建 PDF 文档
            PdfDocument doc = new PdfDocument();
    
            // 配置页面设置
            doc.getPageSettings().setSize(PdfPageSize.A4);
            doc.getPageSettings().setMargins(40f);
    
            // 添加页面
            PdfPageBase page = doc.getPages().add();
    
            // 将字符串绘制到 PDF 上
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 1, 16),true);
            PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));
            page.getCanvas().drawString(text, font, brush, 20, 40);
    
            // 将文档保存为 PDF 文件
            doc.saveToFile("TextBytes.pdf");
            doc.close();
        }
    }
    

    这将生成一个名为 TextBytes.pdf 的新 PDF 文件(如下所示),其中包含你的字节数组所表示的文本。

    Java通过字节数组创建PDF文档

    您可能会感兴趣:如何在 Java 中生成 PDF 文档

    常见误区与避免方法

    将字节数组转换为 PDF 时,需注意以下问题:

    • 混淆纯文本与PDF****字节流

    并非所有字节数组都是有效的 PDF。除非数组以 %PDF-1.x 开头且包含完整结构体,否则无法直接使用PdfDocument.loadFromStream加载。

    • 编码格式错误

    若文本字节采用 UTF-16ISO-8859-1或其他编码,创建字符串时需指定字符集:

    String text = new String(byteArray, StandardCharsets.UTF_8);
    
    • 大体积字节数组处理

    处理大型 PDF 时,建议采用流式传输而非完全加载到内存,避免 OutOfMemoryError异常。

    • 遗漏文档关闭操作

    保存或处理 PDF 后务必调用 doc.close() 来释放资源。

    常见问题解答

    Q1. 能否将 PDF 以字节数组形式存入数据库?

    可以。您可以将 PDF 作为 BLOB 类型存储在关系型数据库中,后续可检索并加载到 PdfDocument对象中进行保存或编辑。

    Q2. 如何验证字节数组是否为有效 PDF?

    检测数组是否以 %PDF- 开头即可。示例代码:

    String header = new String(Arrays.copyOfRange(bytes, 0, 5));
    if (header.startsWith("%PDF-")) {
        // 有效的PDF文件
    }
    

    Q3. Spire.PDF 能否直接从 InputStream 加载 PDF?

    可以。无需转换为字节数组,可直接将 InputStream传递给 loadFromStream() 方法。

    Q4. 能否将 PdfDocument 重新转换为字节数组?

    可通过 ByteArrayOutputStream 保存文档:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    doc.saveToStream(baos);
    byte[] pdfBytes = baos.toByteArray();
    

    Q5. 若字节数组包含的是图像而非文本或 PDF 怎么办?

    此情况下需要创建新 PDF 文档,并使用 Spire.PDF 的绘图 API 插入图像。

    总结

    本文探讨了如何通过 Spire.PDF for Java 实现字节数组与 PDF 文档的转换。无论您是通过 API 获取字节数组加载现有 PDF 文件,还是从纯文本字节创建新 PDF,Spire.PDF 都能提供可靠的解决方案。

    我们重点解析了 PDF 文件字节与文本字节的本质区别,并指出转换过程中需要规避的常见误区。通过掌握这些核心概念和工具,您可以在 Java 应用中无缝集成字节数组到 PDF 的转换功能,提升文档数据的管理与处理能力。

    申请临时License

    如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。