Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf
Pdfium.Net.Free 支持
.NETFramework 4.0
.NETFramework 4.5
.NETStandard 2.0
- .Net8.0
可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free 操作pdf,解决部分.NetCore 调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功能等待后续~~
项目地址:
Pdfium.Net:https://github.com/1000374/Pdfium.Net.Free
PdfiumViewer:https://github.com/1000374/PdfiumViewer
操作pdf对象
- 获取PdfPageobject对象
- 把操作转换成矩阵
- 生成pdf页内容
转换矩阵请查看:什么是转换矩阵以及如何使用它
获取pdf对象:
var infos = new List<ObjectInformation>();
var count = page.GetObjectsCount();
for (int j = 0; j < count; j++)
{
var obj = page.GetObject(j);
GetObject(obj, infos, i, new List<int> { j }, page.PageText);
} private void GetObject(PdfPageobject obj, List<ObjectInformation> infos, int ipage, List<int> objIndex, PdfTextpage textpage)
{
if (!obj.IsNull)
{
var objType = obj.PageObjGetObjType();
var rect = obj.PageObjGetBounds().ToRectangle();
var cainfo = new ObjectInformation(ipage, obj, objIndex, objType, rect);
var sunObjCount = obj.FormObjCountObjects();
if (sunObjCount > 0)
{
cainfo.SubObjectInformations = new List<ObjectInformation>();
for (int sub = 0; sub < sunObjCount; sub++)
{
var subObj = obj.FormObjGetObject(sub);
var indexs = new List<int>(objIndex);
indexs.Add(sub);
GetObject(subObj, cainfo.SubObjectInformations, ipage, indexs, textpage);
}
} if (_isEditMinimum)
{
if (cainfo.PageObjType == PdfPageObjType.Text || cainfo.PageObjType == PdfPageObjType.Image || cainfo.SubObjectInformations?.Count > 0)
infos.Add(cainfo);
}
else
{
infos.Add(cainfo);
}
}
}
把操作转换成矩阵
var obj = _currObjectInformation.PdfPageobject;
var matrix = obj.PageObjGetMatrix();
bool res = false;
switch (_cursorMode)
{
case PdfViewerCursorMode.Move:
{
res = obj.SetMatrix(1, 0, 0, 1, width, -height);
break;
}
case PdfViewerCursorMode.LeftTop:
{
res = obj.SetMatrix(1 - width / matrix.A, 0, 0, 1 - height / matrix.D, width, 0);
break;
}
case PdfViewerCursorMode.Top:
{
res = obj.SetMatrix(1, 0, 0, 1 - height / matrix.D, 0, 0);
break;
}
case PdfViewerCursorMode.RightTop:
{
res = obj.SetMatrix(1 + width / matrix.A, 0, 0, 1 - height / matrix.D, 0, 0);
break;
}
case PdfViewerCursorMode.Right:
{
res = obj.SetMatrix(1 + width / matrix.A, 0, 0, 1, 0, 0);
break;
}
case PdfViewerCursorMode.RightBottom:
{
res = obj.SetMatrix(1 + width / matrix.A, 0, 0, 1 + height / matrix.D, 0, -height);
break;
}
case PdfViewerCursorMode.Bottom:
{
res = obj.SetMatrix(1, 0, 0, 1 + height / matrix.D, 0, -height);
break;
}
case PdfViewerCursorMode.LeftBottom:
{
res = obj.SetMatrix(1 - width / matrix.A, 0, 0, 1 + height / matrix.D, width, -height);
break;
}
case PdfViewerCursorMode.Left:
{
res = obj.SetMatrix(1 - width / matrix.A, 0, 0, 1, width, 0);
break;
}
case PdfViewerCursorMode.Rotation:
{
var angle = 90 - CharacterHelper.Direction(width, -height);
_currObjectInformation.DirectionEnd = point2.Location;
double angleValue = (angle / 180.0d) * Math.PI; res = obj.SetMatrix((float)Math.Cos(angleValue), (float)-Math.Sin(angleValue), (float)Math.Sin(angleValue), (float)Math.Cos(angleValue), 0, 0);
break;
}
default:
break;
}
生成pdf页内容
var page = Document.Pages[_currObjectInformation.Page];
if (page.GenerateContent())
{}
效果
1.编辑文字和图像(图片缩放、移动,文字编辑、移动)

2.删除文字和图像

3.操作完成后保存pdf

Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf的更多相关文章
- 一个免费的、跨平台的、开源音频编辑器Audacity
Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...
- Caf.CMS是一个免费的、 开源,功能齐全的CMS
Caf.CMS(疯狂蚂蚁CMS) 是一个免费的. 开源,功能全面的CMS(内容管理系统).定位CMS也有点狭义呢,因为Caf.CMS是基于国外SmartStore.NET 开源商城源码的基础上改造而成 ...
- 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...
- 分享一个免费SSL证书申请网站,给网站开启https协议 | 张戈博客
这些天,由于公司的业务需求,接触到了ssl证书和https协议.博客前几篇文章也分享了在WEB服务器上安装SSL证书,为网站开启https协议的教程,感兴趣的童鞋可以前往查看相关文章: <Lin ...
- 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm
BrowserSwarm是一个免费工具,能够自动化跨平台测试JavaScript.
- IETester是一个免费的Web浏览器调试工具
功能简介 IETester是一个免费的Web浏览器调试工具,可以模拟出不同的js引擎来帮助程序员设计效果统一的代码.IETester可以在独立的标签页中开启IE5.5.IE6.IE7以及最I新的IE8 ...
- 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门[zz]
喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...
- 一个免费ss网站的数据爬取过程
一个免费ss网站的数据爬取过程 Apr 14, 2019 引言 爬虫整体概况 主要功能方法 绕过DDOS保护(Cloudflare) post中参数a,b,c的解析 post中参数a,b,c的解析 p ...
- 【ghost初级教程】 怎么搭建一个免费的ghost博客
ghost博客系统无疑是这个月最火热的话题之一,这个号称”只为博客“的系统,早在项目开始之初就受到了众人的关注.它使用了当前最火热node.js技术,10月14日发布了V0.3.3版本.江湖传言它将是 ...
- 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门(转)
转自:http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html 喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog, ...
随机推荐
- 问题:RuntimeError: Model class LuffyAPI.apps.user.models.UserInfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
问题截图 报错原因 提示app未注册,但实际上已经注册的 1. # settings配置文件移动后要将这个settings添加到环境变量中 sys.path.insert(0, BASE_DIR) # ...
- 【Azure 应用服务】Azure Function Timer触发函数加上Singleton后的问题
问题描述 在Azure Function Timer Trigger的函数中,添加了Singleton属性,当Function的实例变为3个后,发现Timer函数并没有在三个实例上同时运行,每次触发时 ...
- 通过keil内置标准库创建stm32工程
通过keil内置标准库创建stm32工程.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkM ...
- vscode+gitee+picgo实现稳定图床
目录: 目录 目录: 1. 为什么使用vscode+gitee+picgo实现完美图床 2. 安装VSCode 2.1 安装VSCode软件及相关插件 3. 安装picgo 4. 准备Gitee图床 ...
- 【对比】Gemini:听说GPT-4你小子挺厉害
前言 缘由 谷歌连放大招:Gemini Pro支持中文,Bard学会画画 事情起因: 一心只读圣贤书的狗哥,不经意间被新闻吸引.[谷歌最新人工智能模型Gemini Pro已在欧洲上市 将与ChatGP ...
- springl课程整理,图片文档
学习spring第一步,导入坐标 注入案例 还能给bean取一个或多个别名.格式如下name = "xxx,ooo" 工厂方法也能不用new 造方法 工厂类方法用下面方法 如果不用 ...
- Zabbix“专家坐诊”第181期问答汇总
问题一 Q:大佬们,有没有基础的 监控模板 触发器分享下? A:你可以试一下乐维免费版(https://forum.lwops.cn/download ),里面基本的模板全齐. 问题二 Q :orab ...
- Python 动态网页Fetch/XHR爬虫——以获取NBA球员信息为例
Python 动态网页Fetch/XHR爬虫--以获取NBA球员信息为例 动态网页抓取信息,一般利用F12开发者工具-网络-Fetch/XHR获取信息,实现难点有: 动态网页的加载方式 获取请求Url ...
- Windows改变终端字体后,终端一片黑 的解决办法
使用Windows终端的时候总觉得字体不好看,于是乎按照网上的教程改了一下 注册表 计算机\HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe ...
- pcm5102芯片解析之基本概念
一 前记 1 在音频领域深耕,那就要不断的前行.最近有几个项目需要用到pcm5102这颗料,藉此机会,针对这个料进行深入的研究一下.做一一些简要的分析. 二 概念 音频芯片的指标,其实,很多年都没啥变 ...