最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#在.NET中實現(xiàn)高效提取PDF文檔中的圖片

 更新時間:2026年01月30日 09:01:46   作者:大尚來也  
在文檔處理、內容分析、數據遷移或自動化測試等場景中,開發(fā)者常常需要從?PDF?文件中提取嵌入的圖像資源,本文將詳細介紹如何使用?C#?從?PDF?中提取所有圖片,并對比主流方案,感興趣的小伙伴可以了解下

在文檔處理、內容分析、數據遷移或自動化測試等場景中,開發(fā)者常常需要從 PDF 文件中提取嵌入的圖像資源——無論是產品手冊中的示意圖、發(fā)票上的二維碼,還是報告中的圖表。.NET 生態(tài)提供了多種庫來實現(xiàn)這一目標。本文將詳細介紹如何使用 C# 從 PDF 中提取所有圖片,并對比主流方案(如 iText 7PdfiumViewer / PdfPig),提供可直接運行的代碼示例。

一、為什么提取 PDF 中的圖片并不簡單

PDF 并非簡單的“圖片容器”,而是一種復雜的文檔格式,其中的圖像可能以不同方式存儲:

  • 嵌入為 JPEG、PNG、CCITT(傳真格式)、JBIG2、JPX 等編碼;
  • 被壓縮或加密;
  • 作為 XObject(Form XObject 或 Image XObject)存在;
  • 甚至被分割成多個片段。

因此,通用、健壯的圖片提取依賴于成熟的 PDF 解析庫,而非正則表達式或字節(jié)掃描。

二、技術選型:主流 .NET 庫對比

庫名類型圖片提取支持開源推薦度
iText 7商業(yè)/AGPL? 完整支持部分開源????☆
UglyToad.PdfPigMIT 開源? 支持主流格式?????
PdfiumViewerBSD 開源(基于 Chromium 的 PDFium)? 可渲染頁面截圖,但非原始圖???☆
Aspose.PDF商業(yè)? 強大?????(需授權)

本文重點介紹 PdfPig(純托管、開源)iText 7(功能全面) 兩種方案。

三、方案一:使用 PdfPig(推薦用于開源項目)

PdfPig 是一個純 C# 編寫的 PDF 解析庫,無需本地依賴,支持提取原始圖像數據。

1. 安裝 NuGet 包

Install-Package UglyToad.PdfPig

2. 提取圖片代碼示例

using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using System.Drawing.Imaging;
using System.IO;

class PdfImageExtractor
{
    public static void ExtractImagesFromPdf(string pdfPath, string outputFolder)
    {
        if (!Directory.Exists(outputFolder))
            Directory.CreateDirectory(outputFolder);

        using (var document = PdfDocument.Open(pdfPath))
        {
            int imageIndex = 0;
            foreach (var page in document.GetPages())
            {
                foreach (var image in page.GetImages())
                {
                    // 獲取原始字節(jié)和格式
                    var bytes = image.Data;
                    var format = GetImageFormat(image);

                    if (format != null)
                    {
                        string fileName = Path.Combine(outputFolder, $"image_{imageIndex++}.{format}");
                        File.WriteAllBytes(fileName, bytes);
                        Console.WriteLine($"Saved: {fileName}");
                    }
                }
            }
        }
    }

    private static string? GetImageFormat(XObjectImage image)
    {
        return image.Type switch
        {
            "Jpeg" => "jpg",
            "Png" => "png",
            "Jpx" => "jp2", // JPEG2000
            "CCITTFax" => "tiff", // 常見于掃描文檔
            _ => null // 未知格式暫不處理
        };
    }
}

3. 調用示例

PdfImageExtractor.ExtractImagesFromPdf("report.pdf", @"./extracted_images");

優(yōu)點:無外部依賴、跨平臺(.NET Core/.NET 5+)、MIT 許可證。

局限:對某些特殊編碼(如內聯(lián)圖像、掩碼圖像)支持有限。

四、方案二:使用 iText 7(適合復雜 PDF)

iText 7 提供更底層的訪問能力,可處理幾乎所有 PDF 圖像類型。

1. 安裝 NuGet 包

Install-Package itext7

2. 自定義圖像提取策略

using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
using System.IO;

public class ImageExtractor : IRenderListener
{
    private readonly string _outputDir;
    private int _imageCount = 0;

    public ImageExtractor(string outputDir)
    {
        _outputDir = outputDir;
        Directory.CreateDirectory(outputDir);
    }

    public void BeginTextBlock() { }
    public void EndTextBlock() { }
    public void RenderText(TextRenderInfo renderInfo) { }

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        try
        {
            var image = renderInfo.GetImage();
            if (image != null)
            {
                byte[] bytes = image.GetImageAsBytes();
                string extension = GetExtension(renderInfo);
                string path = Path.Combine(_outputDir, $"itext_img_{_imageCount++}.{extension}");
                File.WriteAllBytes(path, bytes);
                Console.WriteLine($"Extracted: {path}");
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine($"Failed to extract image: {ex.Message}");
        }
    }

    private string GetExtension(ImageRenderInfo info)
    {
        var filter = info.GetImage().GetPdfObject().GetAsStream().GetAsName(iText.Kernel.Pdf.PdfName.Filter);
        if (filter == null) return "png";
        if (filter.Equals(iText.Kernel.Pdf.PdfName.DCTDecode)) return "jpg";
        if (filter.Equals(iText.Kernel.Pdf.PdfName.FlateDecode)) return "png";
        if (filter.Equals(iText.Kernel.Pdf.PdfName.JPXDecode)) return "jp2";
        if (filter.Equals(iText.Kernel.Pdf.PdfName.CCITTFaxDecode)) return "tiff";
        return "bin";
    }
}

// 使用方法
public static void ExtractWithItext(string pdfPath, string outputDir)
{
    using var reader = new PdfReader(pdfPath);
    using var pdfDoc = new PdfDocument(reader);

    var extractor = new ImageExtractor(outputDir);
    for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
    {
        PdfCanvasProcessor processor = new PdfCanvasProcessor(extractor);
        processor.ProcessPageContent(pdfDoc.GetPage(i));
    }
}

注意:iText 7 在閉源商業(yè)項目中需購買許可證。

五、常見問題與優(yōu)化建議

Q1:提取的圖片模糊?

  • 原因:PDF 中圖像本身分辨率低,或為矢量圖轉柵格。
  • 建議:優(yōu)先提取原始嵌入圖像,而非頁面截圖。

Q2:無法提取掃描版 PDF 中的圖片?

掃描 PDF 通常整頁為一張圖像。此時可使用 PdfiumViewer 渲染整頁為 PNG

var bitmap = PdfiumViewer.PdfDocument.Load("scan.pdf").Render(0, 300, 300, true);
bitmap.Save("page.png", ImageFormat.Png);

Q3:如何只提取特定區(qū)域的圖片?

PdfPig 支持獲取圖像的邊界框(image.Rectangle),可結合坐標過濾。

六、總結

方案適用場景優(yōu)勢劣勢
PdfPig開源項目、簡單到中等復雜 PDF純 C#、無依賴、免費對高級圖像格式支持有限
iText 7企業(yè)級應用、復雜 PDF功能全面、標準兼容商業(yè)授權成本
PdfiumViewer掃描文檔、整頁圖像渲染質量高無法提取原始嵌入圖

對于大多數 .NET 開發(fā)者,PdfPig 是首選的開源解決方案;若需處理高度復雜的 PDF 或已有 iText 授權,則選擇 iText 7。

通過本文提供的代碼,你可以快速集成 PDF 圖片提取功能,賦能文檔智能處理、內容審核或數據歸檔等應用場景。

到此這篇關于使用C#在.NET中實現(xiàn)高效提取PDF文檔中的圖片的文章就介紹到這了,更多相關C#提取PDF圖片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#中使用Spire.doc對word的操作方式

    C#中使用Spire.doc對word的操作方式

    這篇文章主要介紹了C#中使用Spire.doc對word的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • WPF實現(xiàn)樹形表格控件的示例代碼

    WPF實現(xiàn)樹形表格控件的示例代碼

    這篇文章主要介紹了如何利用WPF框架實現(xiàn)樹形表格控件,該控件不僅能夠有效地展示復雜的層級數據,還能夠提供豐富的個性化定制選項,感興趣的可以了解下
    2024-04-04
  • C#結合數據庫實現(xiàn)驗證識別ID卡內容的方法

    C#結合數據庫實現(xiàn)驗證識別ID卡內容的方法

    這篇文章主要介紹了C#結合數據庫實現(xiàn)驗證識別ID卡內容的方法,非常實用的功能,需要的朋友可以參考下
    2014-07-07
  • C#?WPF實現(xiàn)3D操作幾何體效果

    C#?WPF實現(xiàn)3D操作幾何體效果

    眾所周知,我的世界就是無數個像素塊的集合,而像素塊也就是立方體。關于新建立方體,這個大家已經非常熟練了,本文就來說說如何實現(xiàn)3D操作幾何體效果吧
    2023-03-03
  • c#多線程中Lock()關鍵字的用法小結

    c#多線程中Lock()關鍵字的用法小結

    本篇文章主要是對c#多線程中Lock()關鍵字的用法進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C# 本地函數與 Lambda 表達式詳細介紹

    C# 本地函數與 Lambda 表達式詳細介紹

    這篇文章主要介紹了C 語言本地函數與 Lambda 表達式,,由于 C# 長期以來一直使用 lambda,因此從差異和相似之處來看本地函數確實是有意義的,感興趣的小伙伴可以參考下面文章內容
    2021-09-09
  • C#?內存安全性的重大演進:重新定義?unsafe?關鍵字

    C#?內存安全性的重大演進:重新定義?unsafe?關鍵字

    本文揭示了C#與.NETL1的內存安全變革,通過精準定位危險區(qū)域,讓C#更接近Rust的安全保障,引入newalloc三條件、safe關鍵字上下文等新模型代號MemorySafetyRules,同時提供ref安全的逃生通道,助力開發(fā)者在新舊模型間平穩(wěn)過渡,感興趣的朋友跟隨小編一起看看吧
    2026-06-06
  • c# Winform 程序自動更新實現(xiàn)方法

    c# Winform 程序自動更新實現(xiàn)方法

    Winform程序自動更新我也是第一次做,網上找了自動更新的源碼,后來又根據在網上看到的一些方法,自己試了很久,最終還是有寫錯誤,所以花了錢讓別人幫忙調試成功的,下面是我自己搗騰出來的,方便大家借鑒,如果有什么錯誤的地方歡迎指正
    2017-02-02
  • 創(chuàng)建execl導入工具類的步驟

    創(chuàng)建execl導入工具類的步驟

    這篇文章主要介紹了創(chuàng)建execl導入工具類的步驟,需要的朋友可以參考下
    2014-04-04
  • C#格式化數字字符串的方法

    C#格式化數字字符串的方法

    這篇文章主要為大家詳細介紹了C#格式化數字字符串的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論

同德县| 克东县| 绥芬河市| 贵州省| 泸西县| 道孚县| 祁东县| 山阳县| 古田县| 麻阳| 固安县| 丹棱县| 永平县| 唐海县| 建平县| 南雄市| 搜索| 公主岭市| 稻城县| 凭祥市| 舟山市| 正安县| 习水县| 隆安县| 泰兴市| 金华市| 桑日县| 宜阳县| 南城县| 延吉市| 灵宝市| 安顺市| 五寨县| 察隅县| 九江县| 喀喇| 莱西市| 奎屯市| 韶关市| 水富县| 准格尔旗|