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