首页 > 其他分享 >Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf

Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf

时间:2024-04-07 12:11:17浏览次数:21  
标签:obj matrix res Pdfium Free height break var 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

 

标签:obj,matrix,res,Pdfium,Free,height,break,var,pdf
From: https://www.cnblogs.com/xiaohemiao/p/18112918

相关文章

  • 凡人修仙传8w字大纲pdf
    凡人修仙传8w字大纲pdf全资料包括主角韩立的一生、法宝法器、修炼体系、人物、妖兽、地理、宗门、设定、丹药、灵草、术法、材料、功法典籍、阵法等等详细进行了介绍。总pdf136页,内容来自于网络,仅用于学习交流,版权归原作者所有,侵权删。pdf永久网盘地址:https:/......
  • MC14516BDR2G倒数计数器芯片中文资料PDF数据手册参数引脚图图片特性概述
    产品概述:MC14516B同步正数/倒数二进制计数器在一个单片结构中使用MOSP沟道和N沟道增强模式器件构造。此计数器可通过对预设输入(P0、P1、P2、P3)应用所需的二进制值,然后将预设启用(PE)置于高电平,来进行预设。计数方向通过向UP/DOWN输入应用高电平(用于正数)或低电平(用于......
  • 使用 5 行 Python 代码拆分或合并 PDF 文件
    目录:拆分PDF文件合并PDF文件如果希望从大型PDF文件中提取特定页面或将多个PDF文件合并为一个文件,可以使用一些PDF编辑器来完成,但是你可能会发现拆分或合并功能在很多免费版PDF编辑工具中通常不可用。在本文中,我将分享一个简单的解决方案,用几行Python代......
  • CAT809JTBI-GT3中文资料规格书PDF数据手册引脚图产品参数特性概述
    产品概述:CAT809是一款µP监督电路,监控数字系统中的电源。CAT809可在基于工业温度范围运行的应用中直接替代MAX809。此器件会产生重置信号,当电源电压降至阈值阈值以下且电源升至该水平140ms之后发出该信号。安森美半导体使用的底层浮动门极技术AE²™可用于提供任......
  • MC14516BDR2G倒数计数器芯片中文资料PDF数据手册参数引脚图图片特性概述
    产品概述:MC14516B同步正数/倒数二进制计数器在一个单片结构中使用MOSP沟道和N沟道增强模式器件构造。此计数器可通过对预设输入(P0、P1、P2、P3)应用所需的二进制值,然后将预设启用(PE)置于高电平,来进行预设。计数方向通过向UP/DOWN输入应用高电平(用于正数)或低电平(用于......
  • 韦东山-数码相框之freetyte
    矢量字体文件的优点,不会变形,放大放小都会不模糊。​​矢量字体文件的实现方式:取若干条闭合曲线的关键点使用贝塞尔曲线连接关键点填充内部空间Freetype的函数说明​​​FT_Init_FreeType​初始化​FT_New_Face​加载字体文件​FT_Set_Char_Size​设置字体大小​......
  • pdffactory pro 8注册码序列号下载 附教程
    PdfFactoryPro可以说是一款行业专业且技术领先的的PDF虚拟打印机软件。其不仅占用系统内存小巧,功能强大,可支持用户无需使用Acrobat来创建AdobePDF即可以进行PDF组件的创建和打印。同时,现在全新的PdfFactoryPro8也正式上线来袭,全面新增添加了如书签、作业订购、信头和自动电......
  • Python实战:将Pdf文件转换为有声读物
    1.引言有声读物是现代生活中不可或缺的一部分,它可以让我们在通勤、健身等场合享受阅读的乐趣。然而,将Pdf文件转换为有声读物需要一定的技术支持。通过Python实现Pdf文件转换为有声读物,我们可以加深对编程语言的理解,同时也能够体会到编程带来的便利。2.环境准备在......
  • Pdf文件格式解析:stream中的变换矩阵指令 1 0 0 -1 0 841.9 cm
    解释100-10841.9cm在PDF文件中的变换矩阵指令100-10841.9cm中,前四个数值100-1组成了一个2x2的线性变换部分,用于描述旋转和缩放操作,而不涉及平移。这里,100-1的每一个数字都有特定的意义:第一个数字1:这是矩阵的第一行第一列的元素。它决定了x坐标在......
  • 如何不安装客户端下载百度网盘的文档(以PDF为例)
    百度网盘是目前使用比较广泛的网盘,很多方面,人们都会使用百度网盘来传输资料,由于不占用本地空间,因此比较方便,但是,令我们比较头疼的方面就是,只要文件大一点,便会出现如下情景:这种强制下载给用户的体验感十分不好,那么有什么办法绕过呢?方法是有的,作者不久前摸索出,以下内容,以pdf文件为......