我的网络方法在我的%temp%文件夹中创建一个pdf文件,该文件有效。然后,我想使用下面的代码向该文件添加一些自定义字段(meta)。
班级PdfStamper
生成IOException
,无论我使用其.Close()
方法还是using
块刚刚结束。仍然保留文件句柄的过程是webdev Web服务器本身(我在VS2010 SP1中调试)。
private string AddCustomMetaData(string guid, int companyID, string filePath)
{
try
{
PdfReader reader = new PdfReader(filePath);
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
PdfStamper st = new PdfStamper(reader, fs);
Dictionary<string, string> info = reader.Info;
info.Add("Guid", guid);
info.Add("CompanyID", companyID.ToString());
st.MoreInfo = info;
st.Close();
}
reader.Close();
return guid;
}
catch (Exception e)
{
return e.Message;
}
}
无论我尝试什么,它都会在st.Close();
处抛出异常,更确切地说:
进程无法访问文件'C:\ Users [my 名] \ AppData \本地的\ Temp \ 53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf” 因为它正被另一个进程使用。
要么我忽略了一些显而易见的事情,要么PdfStamper
课程出现问题我还没有意识到。使用的itextsharp的版本是5.3.3.0和5.4.0.0,问题是相同的。
非常感谢任何见解。
编辑:我目前正在“编码”这个问题,但我还没有找到任何解决方案。
答案 0 :(得分:16)
问题在于,当您正在阅读文件时,您正在写入文件。与将所有数据“加载”到内存中的某些文件类型(JPG,PNG等)不同,iTextSharp将数据作为流读取。您需要使用两个文件并在最后交换它们,或者您可以通过将PdfReader
绑定到文件的字节数组来强制iTextSharp“加载”第一个文件。
PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
答案 1 :(得分:1)
我建议您在打开文件时使用FileShare enumerator
,因此请尝试使用None sharing
File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
答案 2 :(得分:0)
首次保存文件时,请尝试.Dispose()PDF阅读器(或用于创建它的任何内容)
答案 3 :(得分:0)
如果您觉得它对您可行,请尝试此解决方案 - 一旦webmethod在Temp文件夹中创建文件,您需要复制该文件并将其粘贴到具有不同名称的其他位置或相同位置,并将新复制的文件路径传递给您的PDF读者。