醋醋百科网

Good Luck To You!

PDFiumCore:高效处理 PDF 的 .NET 库

在开发中,处理 PDF 文件是一个常见的需求。无论是生成报表、查看文档还是进行复杂的 PDF 操作,都需要一个强大且灵活的工具来支持。今天,我们将介绍一款优秀的 .NET 库——PDFiumCore,它是一个基于 Google 的 PDFium 引擎开发的 .NET 库,专门用于处理 PDF 文件。它提供了丰富的功能,包括 PDF 渲染、文本提取、页面操作等。PDFiumCore 支持 .NET Core 和 .NET Framework,适用于各种平台,如 Windows、macOS 和 Linux。


入门指南

安装

可以通过 NuGet 包管理器安装 PDFiumCore 库

dotnet add package PDFiumCore

1.PDF 渲染

PDFiumCore 支持将 PDF 页面渲染为图像,可以生成高质量的 PNG、JPEG 等格式的图片。这对于生成预览图或进行图像处理非常有用。


// 初始化 PDFium 库
using System.Drawing;
using System.Drawing.Imaging;
using PDFiumCore;

fpdfview.FPDF_InitLibrary();

// 加载 PDF 文档
var document = fpdfview.FPDF_LoadDocument("alice-in-wonderland.pdf", null);
if (document is null)
{
Console.WriteLine("无法加载 PDF 文档。");
return;
}

// 加载第一页
var page = fpdfview.FPDF_LoadPage(document, 0);
if (page is null)
{
Console.WriteLine("无法加载页面。");
fpdfview.FPDF_CloseDocument(document);
return;
}

// 获取页面宽高
double pageWidth = fpdfview.FPDF_GetPageWidth(page);
double pageHeight = fpdfview.FPDF_GetPageHeight(page);
int width = 1000;
int height = (int)(pageHeight * width / pageWidth);

// 创建位图(第三个参数设为1,表示带alpha通道)
var bitmap = fpdfview.FPDFBitmapCreate(width, height, 1);
if (bitmap is null)
{
Console.WriteLine("位图创建失败。");
fpdfview.FPDF_ClosePage(page);
fpdfview.FPDF_CloseDocument(document);
fpdfview.FPDF_DestroyLibrary();
return;
}

// 渲染 PDF 页面到位图
fpdfview.FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);

// 获取位图数据指针
IntPtr buffer = fpdfview.FPDFBitmapGetBuffer(bitmap);

// 创建 .NET Bitmap 对象(PDFium 默认 BGRA 格式)
using (var bmp = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, buffer))
{
bmp.Save("output.png", ImageFormat.Png);
}

// 销毁位图,释放资源
fpdfview.FPDFBitmapDestroy(bitmap);
fpdfview.FPDF_ClosePage(page);
fpdfview.FPDF_CloseDocument(document);
fpdfview.FPDF_DestroyLibrary();2.文本提取PDFiumCore 可以从 PDF 文件中提取文本内容,这对于全文搜索或内容分析非常有用。

 using System.Text;
using PDFiumCore;

public static void ExtractTextFromPDF(string pdfPath, string outputTextPath, int startPageIndex)
{
    // 初始化 PDFiumCore 库
    fpdfview.FPDF_InitLibrary();

    try
    {
        var document = fpdfview.FPDF_LoadDocument(pdfPath, null);
        if (document is null)
            throw new Exception("Failed to load PDF document.");

        int pageCount = fpdfview.FPDF_GetPageCount(document);
        var textBuilder = new StringBuilder();

        for (int i = startPageIndex; i < pageCount; i++)
        {
            var page = fpdfview.FPDF_LoadPage(document, i);
            if (page is null)
                continue;

            var textPage = fpdf_text.FPDFTextLoadPage(page);
            if (textPage is null)
            {
                fpdfview.FPDF_ClosePage(page);
                continue;
            }

            int charCount = fpdf_text.FPDFTextCountChars(textPage);
            if (charCount > 0)
            {
                var buffer = new ushort[charCount + 1];
                fpdf_text.FPDFTextGetText(textPage, 0, charCount, ref buffer[0]);
                // ushort[] 转 char[]
                var charBuffer = new char[charCount];
                for (int j = 0; j < charCount; j++)
                    charBuffer[j] = (char)buffer[j];
                string text = new string(charBuffer).TrimEnd('\0');
                textBuilder.AppendLine(#34;--- Page {i + 1} ---");
                textBuilder.AppendLine(text);
            }

            fpdf_text.FPDFTextClosePage(textPage);
            fpdfview.FPDF_ClosePage(page);
        }

        File.WriteAllText(outputTextPath, textBuilder.ToString(), Encoding.UTF8);
        Console.WriteLine(#34;Text extracted and saved to {outputTextPath}");

        fpdfview.FPDF_CloseDocument(document);
    }
    catch (Exception ex)
    {
        Console.WriteLine(#34;Error: {ex.Message}");
    }
    finally
    {
        fpdfview.FPDF_DestroyLibrary();
    }
}

3.页面操作

PDFiumCore 支持对 PDF 页面进行各种操作,如添加水印、旋转页面、缩放页面等。

4.文档信息提取

PDFiumCore 可以提取 PDF 文档的元数据信息,如标题、作者、创建日期等。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言