C#iTextSharp:进程无法访问该文件,因为它正被另一个进程使用

C#iTextSharp:进程无法访问该文件,因为它正被另一个进程使用,c#,itextsharp,C#,Itextsharp,我正在使用iTextSharp从模板生成一个pdf文件,填充此代码部分中的每个字段: PdfReader pdfReader = new PdfReader(templatePath); try { using (FileStream newFileStream = new FileStream(newFilePath, FileMode.Create)) { usin

我正在使用iTextSharp从模板生成一个pdf文件,填充此代码部分中的每个字段:

        PdfReader pdfReader = new PdfReader(templatePath);
        try
        {
            using (FileStream newFileStream = new FileStream(newFilePath, FileMode.Create))
            {
                using (PdfStamper stamper = new PdfStamper(pdfReader, newFileStream))
                {
                    // fill each field
                    AcroFields pdfFormFields = stamper.AcroFields;
                    foreach (KeyValuePair<string, string> entry in content)
                    {
                        if (!String.IsNullOrEmpty(entry.Value))
                            pdfFormFields.SetField(entry.Key, entry.Value);
                    }

                    //The below will make sure the fields are not editable in
                    //the output PDF.
                    stamper.FormFlattening = true;
                    stamper.Close();
                }                    
            }
        }
        finally
        {
            pdfReader.Close();
        }
此时会发生错误

foreach (Documento item in docs)
{                                      
           string fileName = item.FilePath;
           pdfReader = new PdfReader(fileName); // IOException
           // some other operations ...                    
}
编辑:按照建议使用Process monitor,我可以看到并没有我预期的close-CloseFile操作。这可能是问题的根源吗


这件事我已经坚持了好几个小时了,非常感谢您的帮助。

我也有同样的问题。这帮了大忙

“您的问题是,您正在写入一个文件,同时也在读取该文件。与将所有数据“加载”到内存中的某些文件类型(JPG、PNG等)不同,iTextSharp将数据作为流读取。您需要使用两个文件并在最后交换它们,或者您可以强制iTextSharp“加载”“通过将PdfReader绑定到文件的字节数组来创建第一个文件。”


参考:克里斯·哈斯对

的回答和我有同样的问题。这帮了我很大的忙

“您的问题是,您正在写入文件,同时也在读取文件。与将所有数据“加载”到内存中的某些文件类型(JPG、PNG等)不同,iTextSharp将数据作为流读取。您要么需要使用两个文件并在最后交换它们,要么可以通过将PdfReader绑定到文件的字节数组来强制iTextSharp“加载”第一个文件。”


参考:Cris Haas对

可能重复的问题的回答您是否尝试使用源代码进行调试(它们可用)?不要使用FileMon查看文件句柄?是否在Adobe Reader中打开了任何PDF文件?某些应用程序在打开文件时会锁定文件进行编辑。另一个要点是:关闭
stamper
pdfReader
,但不关闭
newFileStream
使用
应将其处理掉,这样它可能不会被删除有什么区别吗?@LNyarla,
PdfStamper
可以绑定到
Stream
的任何子类,因此mkl的意思是使用
MemoryStream
而不是
FileStream
,只需使用
MemoryStream
上的
ToArray()
将PDF作为字节数组抓取即可。此外,您还会看到
Close()
经常被调用,但正如您所指出的,mkl回应说,它是不需要的。这只是“如果您打开了某个东西,您应该关闭它”思想的产物(我总是这样做),但您可以跳过它。您是否尝试过使用源代码进行调试(它们是可用的)?不要使用FileMon查看文件句柄?是否在Adobe Reader中打开了任何PDF文件?某些应用程序在打开文件时会锁定文件进行编辑。另一个要点是:关闭
stamper
pdfReader
,但不关闭
newFileStream
使用
应将其处理掉,这样它可能不会被删除有什么区别吗?@LNyarla,
PdfStamper
可以绑定到
Stream
的任何子类,因此mkl的意思是使用
MemoryStream
而不是
FileStream
,只需使用
MemoryStream
上的
ToArray()
将PDF作为字节数组抓取即可。此外,您还会看到
Close()
经常被调用,但正如您所指出的,mkl回应说,它是不需要的。这只是“如果你打开了某个东西,你应该关闭它”思维的产物(我总是这样做),但你可以跳过它。
foreach (Documento item in docs)
{                                      
           string fileName = item.FilePath;
           pdfReader = new PdfReader(fileName); // IOException
           // some other operations ...                    
}
PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));