6

我的网络方法在我的 %temp% 文件夹中创建了一个 pdf 文件,并且可以正常工作。然后我想使用下面的代码向该文件添加一些自定义字段(元)。

无论我使用它的方法还是块刚刚结束,该类PdfStamper都会生成一个。仍然保留文件句柄的进程是 webdev Web 服务器本身(我在 VS2010 SP1 中调试)。IOException.Close()using

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 username]\AppData\Local\Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf”,因为它正被另一个进程使用。

要么是我忽略了一些明显的事情,要么是PdfStamper我尚未意识到的课程存在问题。使用的 itextsharp 版本是 5.3.3.0 和 5.4.0.0,问题是一样的。

任何见解将不胜感激。

编辑:我目前正在“围绕”这个问题进行编码,但我还没有找到任何解决方案。

4

4 回答 4

20

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

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
于 2013-03-26T13:56:40.043 回答
1

我建议你在FileShare enumerator打开文件时使用,所以尝试用None sharing

   File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
于 2013-03-25T14:53:44.333 回答
0

首次保存文件时尝试 .Dispose() 您的 PDF 阅读器(或用于创建它的任何工具)

于 2013-03-25T14:51:09.987 回答
0

如果您认为它对您可行,请尝试此解决方案 - 一旦 web 方法在 Temp 文件夹中创建文件,您需要复制文件并将其粘贴到其他位置或具有不同名称的相同位置,并将新复制的文件路径传递给您的 PDF 阅读器。

于 2013-03-25T15:34:12.013 回答