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的更多相关文章

  1. 一个免费的、跨平台的、开源音频编辑器Audacity

    Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...

  2. Caf.CMS是一个免费的、 开源,功能齐全的CMS

    Caf.CMS(疯狂蚂蚁CMS) 是一个免费的. 开源,功能全面的CMS(内容管理系统).定位CMS也有点狭义呢,因为Caf.CMS是基于国外SmartStore.NET 开源商城源码的基础上改造而成 ...

  3. 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门

    喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...

  4. 分享一个免费SSL证书申请网站,给网站开启https协议 | 张戈博客

    这些天,由于公司的业务需求,接触到了ssl证书和https协议.博客前几篇文章也分享了在WEB服务器上安装SSL证书,为网站开启https协议的教程,感兴趣的童鞋可以前往查看相关文章: <Lin ...

  5. 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm

    BrowserSwarm是一个免费工具,能够自动化跨平台测试JavaScript.

  6. IETester是一个免费的Web浏览器调试工具

    功能简介 IETester是一个免费的Web浏览器调试工具,可以模拟出不同的js引擎来帮助程序员设计效果统一的代码.IETester可以在独立的标签页中开启IE5.5.IE6.IE7以及最I新的IE8 ...

  7. 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门[zz]

    喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉得独立博客的管 ...

  8. 一个免费ss网站的数据爬取过程

    一个免费ss网站的数据爬取过程 Apr 14, 2019 引言 爬虫整体概况 主要功能方法 绕过DDOS保护(Cloudflare) post中参数a,b,c的解析 post中参数a,b,c的解析 p ...

  9. 【ghost初级教程】 怎么搭建一个免费的ghost博客

    ghost博客系统无疑是这个月最火热的话题之一,这个号称”只为博客“的系统,早在项目开始之初就受到了众人的关注.它使用了当前最火热node.js技术,10月14日发布了V0.3.3版本.江湖传言它将是 ...

  10. 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门(转)

    转自:http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html 喜欢写Blog的人,会经历三个阶段. 第一阶段,刚接触Blog, ...

随机推荐

  1. 【Java复健指南03】递归思想

    [递归] 递归重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响,比如n变量 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用 ...

  2. python如何多版本共存

    1. 先正常安装多个python版本,比如我电脑里面是安装的3.10以及3.12 2. 安装的时候建议不要选择系统盘,可以用两个目录安装,例如: d:\py310\... d:\py312\... 3 ...

  3. 【Azure 应用服务】记一次 App Service 部分请求一直返回 401 "No Authority" 的情况

    问题描述 发现部署在App Service上的 WCF 应用对于所请求的接口出现部分返回 401 - No Authority 消息,10次中有一次这样的概率.比较疑惑的问题是,应用没有更新,所以怀疑 ...

  4. C++ STL 容器-Deque

    C++ STL 容器-Deque std::deque(双端队列)是C++标准模板库(STL)中的一个容器,它支持在序列的两端快速插入和删除元素.与std::vector和std::list等其他序列 ...

  5. clickhouse快速上手和问题记录

    clickhouse官方中文社区实战经验:手把手教你搭建单机clickhouse开发环境 我是用的是centOS7的虚拟机, 官方教程中的:sudo /etc/init.d/clickhouse-se ...

  6. 【LLM应用】基于GPT3.5的代码编辑器Cursor试用-智能代码编辑助手

    一.安装和使用 官网下载安装Cursor,然后创建一个代码文件.Ctrl +  K生成, Ctrl + L提问. 默认每小时30词. 1. Try generating with command K ...

  7. 基于ads1299的可穿戴脑电信号采集之性能调试总结

    一 前言 问题背景: 最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试.   二 测试步骤 A 内部方波信号质量,通过测试发现内部方波信号质量特别好.这个说明了软件和存储这块,没啥 ...

  8. python计算二进制bin文件hash值

    一 hash的价值 hash值的唯一性仅仅在是同一个文件的情况下得到了同样的hash值,而哪怕错误一个字节也会得到不一样的hash值. hash值得最大价值就是唯一性.这样在bin文件检查和校验这块用 ...

  9. day01-项目介绍+SSM环境搭建

    项目介绍+SSM环境搭建 1.项目功能/界面 SSM整合项目界面:使用Vue完成 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM 前端框架-Vue3 后端框架-SSM(SpringMVC+S ...

  10. Linux快速入门(八)效率工具(SSH)

    环境 (1)Kali(源主机),IP:10.211.55.4/24 (2)Ubuntu(目标主机),IP:10.211.55.5/24 SSH OpenSSH用于在远程系统上安全的运行Shell,假设 ...