晚睡小猫 發表於 2025-7-4 13:48:00

国产化PDF处理控件Spire.PDF教程:在Java中读取PDF,提取文本、图片和表格

<p><img src="https://image.evget.com/attachment/keditor/image/20250704/094529_8.png"></p>
<p>在数据驱动的现代开发中,高效处理 PDF 文档已成为 Java 开发者不可或缺的核心能力。无论是处理各类发票扫描件、业务分析报告,还是包含丰富图表的技术文档,掌握 Java 版的 PDF 解析技术都将大幅提升数据处理效率,充分释放文档中的商业价值。</p>
<p><strong>E-iceblue</strong>旗下Spire系列产品,是文档处理组件领域的佼佼者,<strong>支持国产化信创</strong>。本指南将介绍<strong>如何使用</strong>&nbsp;<strong>Spire.PDF for Java</strong>&nbsp;<strong>读取 PDF 文档</strong>&nbsp;,涵盖从可搜索的 PDF&nbsp;<strong>提取文本</strong>&nbsp;、<strong>表格</strong>和&nbsp;<strong>图片</strong>&nbsp;,以及通过&nbsp;<strong>OCR</strong>&nbsp;技术从扫描版 PDF 中读取文本。</p>
<div>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for Java免费试用下载,请联系e-iceblue官方授权合作经销商慧都科技&nbsp;</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
</div>
<h2>用于读取 PDF 内容的 Java 库</h2>
<p>选择适合的库是成功读取 PDF 的关键。Spire.PDF 以其稳定性和丰富功能脱颖而出,支持文本提取、图片获取、表格解析及 OCR 集成,其直观 API 和完善的教程对新手和专家同样友好。</p>
<p>开始前请从官网<strong>下载 Spire.PDF for Java</strong><strong>&nbsp;</strong>并添加至项目依赖。Maven 用户请在 pom.xml 中添加:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>&lt;repositories&gt;
    &lt;repository&gt;
      &lt;id&gt;com.e-iceblue&lt;/id&gt;
      &lt;name&gt;e-iceblue&lt;/name&gt;
      &lt;url&gt;https://repo.e-iceblue.cn/repository/maven-public/&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;e-iceblue&lt;/groupId&gt;
      &lt;artifactId&gt;spire.pdf&lt;/artifactId&gt;
      &lt;version&gt;11.6.2&lt;/version&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
<p>下文将演示如何运用 Spire.PDF 完成各类 PDF 读取任务。</p>
<h2>Java 从可搜索 PDF 读取文本</h2>
<p>可搜索 PDF 以机器可读的格式存储文本,便于高效提取内容。<strong>Spire.PDF&nbsp;</strong>中的&nbsp;<strong>PdfTextExtractor</strong>&nbsp;类可直接获取可搜索PDF的页面文本,而&nbsp;<strong>PdfTextExtractOptions</strong>&nbsp;能灵活设置提取参数,包括文本布局处理策略和指定提取区域。</p>
<p>以下示例展示如何使用 Java 提取 PDF 所有页面的文本并输出到TXT文件:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextExtractOptions;
import com.spire.pdf.texts.PdfTextExtractor;
import com.spire.pdf.texts.PdfTextStrategy;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ExtractTextFromSearchablePdf {

    public static void main(String[] args) throws IOException {

      // 创建一个 PdfDocument 对象
      PdfDocument doc = new PdfDocument();

      // 加载 PDF 文件
      doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

      // 遍历所有页面
      for (int i = 0; i &lt; doc.getPages().getCount(); i++) {

            // 获取当前页面
            PdfPageBase page = doc.getPages().get(i);

            // 创建一个 PdfTextExtractor 对象
            PdfTextExtractor textExtractor = new PdfTextExtractor(page);

            // 创建一个 PdfTextExtractOptions 对象
            PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();

            // 指定提取策略
            extractOptions.setStrategy(PdfTextStrategy.None);

            // 从页面中提取文本
            String text = textExtractor.extract(extractOptions);

            // 定义输出文件路径
            Path outputPath = Paths.get("output/Extracted_Page_" + (i + 1) + ".txt");

            // 写入 txt 文件
            Files.write(outputPath, text.getBytes());
      }

      // 关闭文档
      doc.close();
    }
}</code></pre>
<p><strong>效果图:</strong></p>
<p><img src="https://www.e-iceblue.cn/images/tutorials-images/extract_text_from_pdf_20250630.png"></p>
<h2>Java 从 PDF 文档读取图片</h2>
<p>对于包含图形的 PDF,<strong>PdfImageHelper</strong>&nbsp;类能精准提取所有嵌入式图片。通过&nbsp;<strong>PdfImageInfo</strong>&nbsp;对象可将图片保存为标准图像文件,特别适用于产品图册等视觉内容重要的文档。</p>
<p>以下Java示例将 PDF 文档中的所有图片提取为 PNG 文件:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.utilities.PdfImageHelper;
import com.spire.pdf.utilities.PdfImageInfo;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ExtractAllImages {

    public static void main(String[] args) throws IOException {

      // 创建一个 PdfDocument 对象
      PdfDocument doc = new PdfDocument();

      // 加载 PDF 文档
      doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

      // 创建一个 PdfImageHelper 对象
      PdfImageHelper imageHelper = new PdfImageHelper();

      // 声明一个整型变量
      int m = 0;

      // 遍历页面
      for (int i = 0; i &lt; doc.getPages().getCount(); i++) {

            // 获取特定页面
            PdfPageBase page = doc.getPages().get(i);

            // 获取页面中的所有图像信息
            PdfImageInfo[] imageInfos = imageHelper.getImagesInfo(page);

            // 遍历图像信息
            for (int j = 0; j &lt; imageInfos.length; j++)
            {
                // 获取特定图像信息
                PdfImageInfo imageInfo = imageInfos;

                // 获取图像
                BufferedImage image = imageInfo.getImage();
                File file = new File(String.format("output/Image-%d.png",m));
                m++;

                // 以 PNG 格式保存图像文件
                ImageIO.write(image, "PNG", file);
            }
      }

      // 清理资源
      doc.dispose();
    }
}</code></pre>
<p><strong>效果图:</strong></p>
<p><img src="https://www.e-iceblue.cn/images/tutorials-images/extract_image_from_pdf_2050630.png"></p>
<h2>Java 从 PDF 文件读取表格数据</h2>
<p><strong>Spire.PDF&nbsp;</strong>提供的&nbsp;<strong>PdfTableExtractor</strong>&nbsp;类能智能识别表格边界,生成的&nbsp;<strong>PdfTable</strong>&nbsp;对象保持原始结构,并支持使用&nbsp;<strong>PdfTable.getText()</strong>&nbsp;方法获取具体单元格中的文本。该功能特别适用于从财务报表等结构化文档提取数据。</p>
<p>以下 Java 代码将 PDF 中的每一个表格导出为单独的TXT文件:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;

import java.io.FileWriter;

public class ExtractTableData {
    public static void main(String[] args) throws Exception {

      // 创建一个 PdfDocument 对象
      PdfDocument doc = new PdfDocument();

      // 加载 PDF 文档
      doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

      // 创建一个 PdfTableExtractor 实例
      PdfTableExtractor extractor = new PdfTableExtractor(doc);

      // 初始化表计数器
      int tableCounter = 1;

      // 遍历 PDF 中的页面
      for (int pageIndex = 0; pageIndex &lt; doc.getPages().getCount(); pageIndex++) {

            // 从当前页面提取表格到 PdfTable 数组
            PdfTable[] tableLists = extractor.extractTable(pageIndex);

            // 如果找到任何表格
            if (tableLists != null &amp;&amp; tableLists.length &gt; 0) {

                // 遍历数组中的表格
                for (PdfTable table : tableLists) {

                  // 为当前表格创建一个 StringBuilder
                  StringBuilder builder = new StringBuilder();

                  // 遍历当前表格中的行
                  for (int i = 0; i &lt; table.getRowCount(); i++) {

                        // 遍历当前表格中的列
                        for (int j = 0; j &lt; table.getColumnCount(); j++) {

                            // 从当前表格单元格中提取数据并附加到 StringBuilder
                            String text = table.getText(i, j);
                            builder.append(text).append(" | ");
                        }
                        builder.append("\r\n");
                  }

                  // 为每个表格写入一个单独的 .txt 文档
                  FileWriter fw = new FileWriter("output/Table_" + tableCounter + ".txt");
                  fw.write(builder.toString());
                  fw.flush();
                  fw.close();

                  // 增加表计数器
                  tableCounter++;
                }
            }
      }

      // 清理资源
      doc.dispose();
    }
}</code></pre>
<p><strong>效果图:</strong></p>
<p><img src="https://www.e-iceblue.cn/images/tutorials-images/input_table_pdf_20250630.png"></p>
<h2>通过 OCR 将扫描版 PDF 转为文本</h2>
<p>从扫描版的 PDF 提取文本需要依赖 OCR 引擎,如<strong>Spire.OCR for Java</strong>。本解决方案首先使用 Spire.PDF 的渲染引擎将页面转换为图片,然后通过 Spire.OCR 的&nbsp;<strong>OcrScanner</strong>&nbsp;类从图片识别文字。通过这两步法,可以有效地将实体文档扫描转换为可编辑文本,且支持多种语言。</p>
<p><strong>步骤 1. 安装Spire.OCR 并配置环境</strong></p>
<ul>
<li><strong>下载 Spire.OCR for Java</strong>,并将 Jar 文件作为依赖添加到您的项目中。</li>
<li>从以下链接中下载适合您操作系统的模型,并将压缩包解压到您磁盘上的某个位置。
<ul>
<li>Windows x64</li>
<li>Linux x64</li>
<li>macOS 10.15 及更高版本</li>
</ul>
</li>
<li>在您的代码中配置模型。</li>
</ul>
<pre class="prettyprint lang-js highlighter-hljs"><code>OcrScanner scanner = new OcrScanner();
configureOptions.setModelPath("D:\\win-x64"); // 模型路径</code></pre>
<p><strong>步骤 2. 将扫描的 PDF 转换为文本</strong></p>
<p>此代码示例将扫描 PDF 的每一页转换为图像文件,应用 OCR 提取文本,并将结果保存到文本文件中。</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>import com.spire.ocr.OcrException;
import com.spire.ocr.OcrScanner;
import com.spire.ocr.ConfigureOptions;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.PdfImageType;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ExtractTextFromScannedPdf {

    public static void main(String[] args) throws IOException, OcrException {

      // 创建 OcrScanner 类的实例
      OcrScanner scanner = new OcrScanner();

      // 配置扫描器
      ConfigureOptions configureOptions = new ConfigureOptions();
      configureOptions.setModelPath("D:\\win-x64"); // 设置模型路径
      configureOptions.setLanguage("Chinese"); // 设置语言

      // 应用配置选项
      scanner.ConfigureDependencies(configureOptions);

      // 加载 PDF 文档
      PdfDocument doc = new PdfDocument();
      doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

      // 准备临时目录
      String tempDirPath = "temp";
      new File(tempDirPath).mkdirs(); // 创建临时目录

      StringBuilder allText = new StringBuilder();

      // 遍历所有页面
      for (int i = 0; i &lt; doc.getPages().getCount(); i++) {

            // 将页面转换为图像
            BufferedImage bufferedImage = doc.saveAsImage(i, PdfImageType.Bitmap);
            String imagePath = tempDirPath + File.separator + String.format("page_%d.png", i);
            ImageIO.write(bufferedImage, "PNG", new File(imagePath));

            // 执行 OCR
            scanner.scan(imagePath);
            String pageText = scanner.getText().toString();
            allText.append(String.format("\n--- PAGE %d ---\n%s\n", i + 1, pageText));

            // 清理临时图像
            new File(imagePath).delete();
      }

      // 将所有提取的文本保存到文件
      Path outputTxtPath = Paths.get("output", "extracted_text.txt");
      Files.write(outputTxtPath, allText.toString().getBytes());

      // 关闭文档
      doc.close();
      System.out.println("文本已提取到 " + outputTxtPath);
    }
}</code></pre>
<p><strong>效果图:</strong></p>
<p><img src="https://www.e-iceblue.cn/images/tutorials-images/extract_text_from_scanned_pdf_2050630.png"></p>
<h2>结语</h2>
<p>在数字化转型的浪潮中,PDF 文档作为企业信息的重要载体,其高效处理能力已成为现代开发者的核心竞争力。通过本指南介绍的 Spire.PDF for Java 技术方案,开发者可以轻松应对各类&nbsp;<strong>PDF 数据提取</strong>需求,从简单的<strong>文本和图片提取</strong>&nbsp;到复杂的&nbsp;<strong>表格数据解析</strong>&nbsp;,再到&nbsp;<strong>扫描文档的智能识别</strong>&nbsp;,帮助企业更好地管理和利用文档信息。</p>
<p>此外,<strong>Spire.PDF for Java&nbsp;</strong>提供了一套全面的工具和功能,使开发者能够构建起完整的文档自动化处理能力。无论是自动化生成报告、批量处理文档,还是提取特定数据以供分析,开发者都能通过灵活的 API 和丰富的示例代码,快速实现这些功能。这不仅提高了工作效率,也减少了人工操作的错误率,为企业带来了更高的生产力和竞争优势。</p>
<h2>常见问题</h2>
<h3>Q1:如何使用 Java 从扫描 PDF 提取文本?</h3>
<p>结合<strong>&nbsp;Spire.PDF for Java</strong>&nbsp;和 Spire.OCR for Java 即可实现:先将 PDF 页面转为图片,再进行 OCR 识别。</p>
<h3>Q2:在Java 中读取 PDF 的最佳库是什么?</h3>
<p>强烈推荐<strong>&nbsp;Spire.PDF for Java</strong>,因为它功能多样且易于使用。它支持文本、图像、表格的提取以及 OCR 集成。</p>
<h3>Q3:Spire.PDF 是否支持提取元数据、附件和超链接?</h3>
<p>是的,<strong>&nbsp;Spire.P</strong><strong>DF</strong>支持提取:</p>
<ul>
<li>元数据(标题/作者/关键词)</li>
<li>附件(嵌入文件)</li>
<li>超链接( URL 和文档链接)</li>
</ul>
<p>该库提供&nbsp;<strong>PdfDocumentInformation</strong>&nbsp;类获取元数据,以及用于获取附件(&nbsp;<strong>PdfAttachmentCollection</strong>&nbsp;)和超链接(&nbsp;<strong>PdfUriAnnotation</strong>&nbsp;)的方法。</p>
<h3>Q4:如何以编程方式将 PDF表格提取为 CSV/Excel?</h3>
<p>使用<strong>&nbsp;Spire.PDF for Java</strong>,您可以从 PDF 中提取表格数据,然后通过<strong>&nbsp;Spire.XLS for Java</strong>&nbsp;无缝导出到 Excel(XLSX)或 CSV 格式。</p><br><br>
来源:https://www.cnblogs.com/software-Development/p/18965527
頁: [1]
查看完整版本: 国产化PDF处理控件Spire.PDF教程:在Java中读取PDF,提取文本、图片和表格