C# 从 PDF 提取图片教程

在实际开发中,PDF 文件中常包含文本、表格和图片。图片可能是合同中的签名、发票上的印章,或者报告、宣传资料中的图表。

本文将介绍如何使用 Spire.PDF for .NET 提取 PDF 中的图片,并保存为独立图像文件,重点演示 PdfImageHelper 的用法。


1. 为什么需要提取 PDF 图片?

  • 保存原始图像:方便后续处理或归档;
  • 数据分析:图表或图片信息可以进一步处理或识别;
  • 文档拆分:将 PDF 中的图片单独存储或用于报告生成。

2. 准备工作

  1. 安装 Spire.PDF for .NET(支持 .NET Framework 和 .NET Core):
powershell 复制代码
Install-Package Spire.PDF
  1. 引用命名空间:
C# 复制代码
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;

3. 提取 PDF 图片信息

PdfImageHelper 是 Spire.PDF 中用于处理 PDF 图片的核心类,它可以:

  • 获取页面上所有嵌入的图片对象;
  • 提供图片的位置信息、大小、格式等;
  • 将图片提取为 System.Drawing.Image 对象。

示例代码如下:

C# 复制代码
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
using System.Drawing;
using System.IO;

class ExtractPdfImages
{
    static void Main()
    {
        // 加载 PDF 文件
        PdfDocument pdf = new PdfDocument();
        pdf.LoadFromFile("Sample.pdf");

        int imageIndex = 1;

        // 遍历每一页
        foreach (PdfPageBase page in pdf.Pages)
        {
            // 使用 PdfImageHelper 获取页面上的所有图片信息
            PdfImageInfo[] images = PdfImageHelper.GetImages(page);

            foreach (PdfImageInfo info in images)
            {
                // 提取图片对象
                Image img = info.Image;

                // 保存为独立文件
                string fileName = $"Image_{imageIndex}.png";
                img.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);

                Console.WriteLine($"已提取图片: {fileName}");
                imageIndex++;
            }
        }

        Console.WriteLine("PDF 图片提取完成!");
    }
}

4. 高级用法(可选)

  • 获取图片位置和大小 :通过 PdfImageInfo.Rect 可以获取图片在页面中的矩形区域;
  • 按页面或区域过滤:只提取指定页或特定区域的图片;
  • 支持多种格式:可保存为 PNG、JPEG、BMP 等。

例如,只提取第一页的所有图片:

C# 复制代码
PdfPageBase firstPage = pdf.Pages[0];
PdfImageInfo[] firstPageImages = PdfImageHelper.GetImages(firstPage);

5. 总结

本文介绍了在 C# 中使用 Spire.PDF for .NET 提取 PDF 图片的完整流程:

  1. 加载 PDF 文件
  2. 使用 PdfImageHelper 获取图片信息
  3. 将图片保存为独立文件
  4. 可选:获取位置、大小或按区域提取

通过这种方式,开发者可以快速提取 PDF 中的所有图片,应用于报表处理、合同归档或数据分析场景。

相关推荐
孫治AllenSun12 小时前
【Springboot】介绍启动类和启动过程
java·spring boot·后端
绝无仅有12 小时前
面试之MySQL基础和事务实战经验总结与分享
后端·面试·github
程序员爱钓鱼12 小时前
Go语言实战案例 — 工具开发篇:Go 实现二维码生成器
后端·google·go
绝无仅有12 小时前
面试经验之MySQL 锁与索引实战总结分享
后端·面试·github
程序员码歌19 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安19 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
工程师小星星20 小时前
Golang语言的文件组织方式
开发语言·后端·golang
哈喽姥爷20 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
舒一笑1 天前
为什么where=Version就是乐观锁了?
后端·mysql·程序员
土了个豆子的1 天前
04.事件中心模块
开发语言·前端·visualstudio·单例模式·c#