封装了一个Pdfium.Net 感兴趣的可以移步查看
Pdfium.Net:https://github.com/1000374/Pdfium.Net.Free
PdfiumViewer:https://github.com/1000374/PdfiumViewer
前言:
PdfiumViewer github上是这样介绍的:
PdfiumViewer 是一个基于 PDFium 项目的 PDF 查看器。
PdfiumViewer 提供了许多组件来处理 PDF 文件:
-
PdfDocument 是用于呈现 PDF 文档的基类;
-
PdfRenderer 是一个可以呈现 PdfDocument 的 WinForms 控件;
-
PdfiumViewer 是一个 WinForms 控件,它托管一个 PdfRenderer 控件并添加一个工具栏来保存 PDF 文件或打印它。
PdfiumViewer:https://github.com/pvginkel/PdfiumViewer
PDFium:https://pdfium.googlesource.com/pdfium/
由于PdfiumViewer开发者初衷是为了渲染pdf,所以一些基本的功能可能需要进行扩展来满足需求,我根据项目需要,查询了一些其他开发者的代码及PDFium源码对PdfiumViewer进行了一些扩展。
PdfiumViewerDemo
提取指定Rectangle的pdf的内容
var document = PdfDocument.Load(new MemoryStream(File.ReadAllBytes(fileName)));
for (int i = 0; i < document.PageCount; i++)
{
//获取当前页所有文本
var txt = document.GetPdfText(i);
//获取当前页指定坐标的文本
txt= document.GetBoundedText(i, 690, 548, 808, 569);
}
坐标可通过demo工具提前获取,方法:选中Matching=》框选所需区域即可,示例如下图

预览时复制内容
渲染pdf时有时需要复制选中的文字
pdfViewer1.Document?.Dispose();
pdfViewer1.Document = PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(fileName)));
pdfViewer1.Renderer.CursorMode = PdfViewerCursorMode.TextSelection;
根据指定Rectangle截取pdf图片
坐标可通过demo工具提前获取,方法:选中Cut=》框选所需区域即可,示例如下图
var document= PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(fileName)));
using (var image = document.Render(
i,
(int)document.PageSizes[i].Width,
(int)document.PageSizes[i].Height,
rectangle.X, // x of the top/left of clipping rectangle
rectangle.Y, // y of the top/left point of clipping rectangle
rectangle.Width, // width of clipping reactangle
rectangle.Height, // height of clipping reactangle
PdfRotation.Rotate0, // no rotation
PdfRenderFlags.None // no render flags
))
{
image.Save(Path.Combine(path, "Page " + i + "Cut.png"));
}

合并pdf
先读取pdf到内存然后合并doc2、doc3、doc4到doc1后
var doc1 = PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(@"C:\Users\11\Desktop\1.pdf")));
var doc2 = PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(@"C:\Users\11\Desktop\2.pdf")));
var doc3 = PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(@"C:\Users\11\Desktop\2.pdf")));
var doc4 = PdfDocument.Load(this, new MemoryStream(File.ReadAllBytes(@"C:\Users\11\Desktop\3.pdf")));
var bytes = doc1.PDFMerge(doc2, doc3, doc4);
File.WriteAllBytes(@"C:\Users\11\Desktop\11.pdf", bytes);
拆分pdf
可才分某一页或者拆分某几页
//拆分文件
var bytes = pdfViewer1.Document.GetPage(1);
var bytes1 = pdfViewer1.Document.GetPage("1-2");
File.WriteAllBytes(@"C:\Users\11\Desktop\11.pdf", bytes);
后台打印pdf
打印pdf组件是自带的 但是有时候是不需要选择打印机打印的
var printer = new PdfPrinter("Microsoft Print To PDF");
//printer.Print(fileName);
printer.Print(fileName, documentName: "with name");
使用此工具做了个提取不可复制PDF的工具,详情可移步查看