You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中PdfiumViewer打开PDF时用iText更新的问题解决

问题:PdfiumViewer锁定PDF文件,导致iText无法修改原文件并更新显示

我开发了一个Windows Forms小型应用,核心需求是打开PDF文件、添加印章后让用户查看更新后的文档,但在更新PDF时遇到了文件占用问题:

当前实现代码

使用PdfiumViewer.PdfRenderer加载并显示文档:

private void LoadPdf(string pdfPath)
{
    pdfDocument = PdfiumViewer.PdfDocument.Load(pdfPath);
    pdfRenderer.Load(pdfDocument);            
}

随后用iText添加印章:

using (PdfReader pdfReader = new PdfReader(pdfPath))
using (PdfWriter pdfWriter = new PdfWriter(pdfPath))
using (iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfReader, pdfWriter))
{
    pdfWriter.SetCloseStream(true);
    Document document = new Document(pdfDoc);

    // 在指定位置添加印章
    Paragraph stamp = new Paragraph("bababa")
        .SetFixedPosition(1, pdfX, pdfY, 50)
        .SetFontSize(12)
        .SetBackgroundColor(iText.Kernel.Colors.ColorConstants.YELLOW);

    document.Add(stamp);
    
}
LoadPdf(pdfPath);

遇到的错误

执行时PdfWriter报错,提示文件被其他进程占用,推测是PdfiumViewer.PdfRenderer锁定了文件。

需求与疑问

我知道可以将盖章后的文档另存为新文件再打开,但这样会重置PDF渲染器的显示状态(比如用户的滚动位置、缩放比例),因此希望直接修改原文件完成操作。

请问:

  • 如何解锁被PdfiumViewer锁定的文件,让iText可以修改原文件?
  • 如果无法实现修改原文件,这类应用的最佳实践是什么?

编辑:尝试MemoryStream方案仍失败

按照建议尝试先将修改后的内容保存到MemoryStream,再写入原文件,但仍出现相同的文件占用错误,错误发生在将MemoryStream写入PDF文件的步骤:

MemoryStream memStream = new MemoryStream();           
using (PdfReader pdfReader = new PdfReader(pdfPath))
using (PdfWriter pdfWriter = new PdfWriter(memStream))
using (iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfReader, pdfWriter))
{
    pdfWriter.SetCloseStream(true);
    Document document = new Document(pdfDoc);

    // 在指定位置添加印章
    Paragraph stamp = new Paragraph("bababa")
        .SetFixedPosition(1, pdfX, pdfY, 50)
        .SetFontSize(12)
        .SetBackgroundColor(iText.Kernel.Colors.ColorConstants.YELLOW);

    document.Add(stamp);
    
}
using (FileStream fileStream = new FileStream(pdfPath, FileMode.Create, FileAccess.Write))
{
    memStream.Position = 0; // 重置流位置到起始处
    memStream.CopyTo(fileStream);
}

内容的提问来源于stack exchange,提问作者Rev1k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:42:40