You need to enable JavaScript to run this app. PdfSharp调用XImage.FromFile读取同文件名新存图片出现重复问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 12:54:05