首页 > 其他分享 >Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--打开大文件处理

Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--打开大文件处理

时间:2024-01-25 18:33:24浏览次数:28  
标签:stream -- Pdfium Free int 内存 var new

项目地址:

Pdfium.Net:https://github.com/1000374/Pdfium.Net

PdfiumViewer:https://github.com/1000374/PdfiumViewer

PDFium支持打开文件支持传入文件流

加载PDF到内存流(此种方式不占用文件):

var stream=new MemoryStream(File.ReadAllBytes(fileName));

var doc=PdfDocumentGdi.Load(this, stream);

但是当pdf文件超过85000字节后,内存既不像引用类型那样分配到普通堆上,也不像值类型那样分配到栈上,而是分配到了一个特殊的称为LOH的内部堆上,这部分的内存只有在GC执行完全回收,也就是回收二代内存的时候才会回收。

因此,考虑如下情形:

假设你的程序每次都要分配一个大型对象(大于85000字节),但却很少分配小对象,导致2代垃圾回收从不执行,即使这些大对象不再被引用,依然得不到释放,最终导致内存泄漏。

解决方案:

1.不考虑文件被占用可使用:

var filestm = new FileStream(fileName, FileMode.Open);
var doc=PdfDocumentGdi.Load(this, stream);

2.但是 有些情况下不想占用文件:

nuget 引用 Microsoft.IO.RecyclableMemoryStream

RecyclableMemoryStreamManager manager;
 int multiple = 5;
 int blockSize = multiple * 1024;
 int largeBufferMultiple = 1024 * 1024;
 int maxBufferSize = 16 * largeBufferMultiple;
 int maximumFreeSmallPoolBytes = 100 * blockSize / multiple;
 int maximumFreeLargePoolBytes = maxBufferSize * 4;

 var options = new RecyclableMemoryStreamManager.Options()
 {
     BlockSize = blockSize,
     LargeBufferMultiple = largeBufferMultiple,
     MaximumBufferSize = maxBufferSize,
     GenerateCallStacks = true,
     AggressiveBufferReturn = true,
     MaximumLargePoolFreeBytes = maximumFreeLargePoolBytes,
     MaximumSmallPoolFreeBytes = maximumFreeSmallPoolBytes,
 };
 manager = new RecyclableMemoryStreamManager(options);
 
var stream = manager.GetStream();
 using (var filestm = new FileStream(fileName, FileMode.Open))
 {
     filestm.CopyTo(stream);
 }
var doc=PdfDocumentGdi.Load(this, stream);

这两种方式都可以在打开第二份pdf时释放上一份的内存

 

 

  

标签:stream,--,Pdfium,Free,int,内存,var,new
From: https://www.cnblogs.com/xiaohemiao/p/17987266

相关文章

  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--快速入门
    Pdfium.Net.Free支持.NETFramework4.0.NETFramework4.5.NETStandard2.0可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free操作pdf,解决部分.NetCore调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功能等待后......
  • cloc 安装
    下载http://cloc.sourceforge.net/修改名称cloc.exe环境变量用户变量是由程序的用户自行定义和使用的变量,作用范围局限于程序的特定部分或特定函数内部;而系统变量是由操作系统或编程语言提供的全局变量,包含了程序执行环境的一些重要信息,可以在整个程序中访问。可以计算了......
  • 从 Greenplum 到 Databend,万全网络数据库平台架构演进
    作者:代城万全网络高级工程师,负责万全网络数据平台整体架构研发工作,拥有超过7年的大数据相关技术研发经验,一直关注着开源和云技术的发展。万全网络科技有限公司是一家专注于B端电商物流供应链的公司。致力于为客户提供全面的供应链解决方案,涵盖从产品采购到最终配送的全程......
  • 朋友圈运营分享-发圈时间
    ......
  • 研运干货|平台工程、应用可观测性趋势下,质量管理的应对之策
    “为变化做好准备。”这是当下对所有人的一句很重要的话,尤其是对于处在高速迭代与日新月异的技术工程领域的我们。最近,Gartner在2023十大技术趋势的报告中提到了平台工程(Platform Engineering)和应用可观测性(Applied Observability)。 本文将通过对这两大战略性技术趋势点的进行剖......
  • openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下
    openGauss学习笔记-207openGauss数据库运维-常见故障定位案例-btree索引故障情况下应对策略207.1btree索引故障情况下应对策略207.1.1问题现象偶发索引丢失错误,报错如下。ERROR:index'xxxx_index'containsunexpectedzeropage或ERROR:index'pg_xxxx_index'cont......
  • 无涯教程-Rust - 文件输入&输出
    除了对控制台进行读写之外,Rust还允许对文件进行读写,File结构代表一个文件,它允许程序对文件执行读写操作,File结构中的所有方法均返回io::Result枚举的变体。写入文件以下程序创建文件"data.txt",create()方法用于创建文件,如果文件创建成功,该方法将返回文件句柄,最后一行write_a......
  • Stream流操作示例
    1privatestaticdoubleoneMoney;2privatestaticdoubletwoMoney;3privatestaticdoublesumMoney;45publicstaticvoidmain(String[]args){6List<Employee>list1=newArrayList<>();7list1.add(new......
  • 常用样式--字体
    字体系列(FontFamily):font-family:"Helvetica","Arial",sans-serif;字体大小(FontSize):font-size:16px;font-size:1.5em;字体粗细(FontWeight):font-weight:600;字体样式(FontStyle):font-style:normal;font-style:italic;斜体......
  • 笨办法学 Java(四)
    原文:LearnJavaTheHardWay译者:飞龙协议:CCBY-NC-SA4.0练习55:记录数组记录很棒,数组更好,但是当你把记录放入数组时,这个生活中几乎没有你不能编码的东西。1classStudent2{3Stringname;4intcredits;5doublegpa;6}78publicclass......