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
相关产品推荐
相关产品推荐

