前言
日常使用中,我们需要将程序生成的PDF内容避免被编辑,可以添加权限密码来达到目的,但有时候就想另辟蹊径,将PDF内容转为图片再保存为PDF文件来达到目的,这里我们介绍的一个.NET下开发的类库PdfiumViewer(Apache-2.0)来实现PDF内容转为图片。
原GitHub地址
该类库是根据PDFium来解析PDF文件,我们都知道PDFium是大名鼎鼎Chromium的PDF渲染引擎,由谷歌主导的开源项目,许可协议为 BSD 3-Clause,Pdfium 本身是一个 C 语言库,编译之后是一个dll。也正是因为是dll所以就可以使用通过C#去使用它,PdfiumViewer就是这么来的。不过PdfiumViewer看起来是为WinForm或者WPF下的一个PDF预览控件封装的,里面包含了很多桌面类库代码,导致只能在Windows下使用,无法达到现在所谓的“政治正确”跨平台这一特性,但是没关系,抽取里面的核心逻辑即可;对我们来说,黑猫白猫,能实现功能就是好猫。
跨平台实现
根据源码做了如下修改:
- - 去除desktop runtime相关依赖
- - 新增图形库SkiaSharp以便更好的支持跨平台
- - 引用PDFium(ImageResizer.Plugins.PdfiumRenderer.Pdfium.Dll)
- - 基于.NET8重新编译(直接改其他目标框架如.NET6编译也可)
Gitee地址:gitee.com/huangguishe…
代码示例
修改后的项目没有放置于Nuget下,可以引用该项目或编译生成dll引用,下面是简单的使用demo。
var pdfFilePath = "d:\\pdfdemo.pdf";//pdf路径
using var pdfiumViewer = PdfDocumentSkiaSharp.Load(pdfFilePath);
var pdfpage = pdfiumViewer.PageCount;
var pagesizes = pdfiumViewer.PageSizes;
//生成图片
for (int i = 0; i < pdfpage; i++)
{
var height = (int)pagesizes[i].Height;
var width = (int)pagesizes[i].Width;
//保存到本地
using var fsImage = new FileStream($"d:\\pdfdemo{i}.jpeg", FileMode.Create);
using var imasge = pdfiumViewer.Render(i, width * 110 / 72, height * 110 / 72, 72, 72, true);
imasge.Encode(SkiaSharp.SKEncodedImageFormat.Jpeg, 72).SaveTo(fsImage);
}
其他
这里简单介绍了现有pdf转为图片的操作,若需要操作pdf也可以看看我另一篇文章.NET下免费开源的PDF类库(PDFSharp),也是跨平台的类库。