在开发中,处理 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 文档的元数据信息,如标题、作者、创建日期等。