PdfSharp调用XImage.FromFile读取同文件名新存图片出现重复问题
问题原因
你遇到的问题是PdfSharp内置的图片缓存机制导致的:XImage.FromFile方法会以文件全路径为key,将读取过的图片内容缓存到内存中。后续只要是相同路径的读取请求,PdfSharp会直接返回缓存中的旧图片数据,不会重新读取磁盘上已经被覆盖的新文件,所以即使你本地的xxxx.jpg已经更新为第二张图的内容,PDF中读取到的还是第一次缓存的第一张图。
解决方案
以下三种方案均可解决问题,按优先级推荐:
方案1:使用流加载绕过文件缓存(最推荐,无需生成临时文件)
直接将处理后的Bitmap写入内存流,再交给XImage加载,完全规避文件缓存逻辑,修改的核心代码如下:' 删掉原有的保存到磁盘、从磁盘读取的逻辑,替换为以下代码 Using ms As New MemoryStream() ' 将Bitmap直接写入内存流 BitmapOut.Save(ms, ImageFormat.Jpeg) ' 重置流指针到起始位置 ms.Position = 0 ' 从流加载XImage Using xImg = XImage.FromStream(ms) ' 原有PDF绘制逻辑不变 Dim page = pdf.AddPage() Dim grPdf = PdfSharp.Drawing.XGraphics.FromPdfPage(page) page.Width = 500 * 72 / xImg.HorizontalResolution page.Height = 500 * 72 / xImg.HorizontalResolution xImg.Interpolate = False grPdf.DrawImage(xImg, 0, 0, page.Width, page.Height) End Using End Using BitmapOut.Dispose()方案2:使用不同的临时文件名
就是你已经验证可行的方案,每次保存Bitmap时使用带唯一标识的文件名(比如带循环序号的xxxx_1.jpg、xxxx_2.jpg),避免同路径触发缓存。方案3:手动清理PdfSharp缓存
如果必须使用相同路径的临时文件,可以在每次调用XImage.FromFile前,调用XImage.DeleteCache()清空所有图片缓存,不过该方法会清空所有缓存,执行效率低于前两种方案。
内容的提问来源于stack exchange,提问作者Paolo Punteri
相关产品推荐
相关产品推荐

