【发布时间】:2016-02-12 11:59:51
【问题描述】:
我构建了两个 .Net 应用程序来创建 pdf 电子保修。为了创建 pdf,我使用与 OpenCart 集成的 Web API 2.0 服务,一切正常。为了填写 pdf,我创建了第二个应用程序 - ASP.NET Web Forms,这是锁定 pdf 文件的问题。
当我打开一个文件并填写一些字段时,然后将信息保存到数据库 - 一切都很好。但是,如果我想在同一个 pdf 抛出异常上添加其他信息:
System.IO.IOException:进程无法访问文件“...\AllWarranties\2016\2\000077.pdf”,因为它正被另一个进程使用。
只有当应用程序在服务器上时才会发生这种情况!什么时候在本地机器上没有问题。我研究并发现打开应用程序时会启动 w3wp.exe 进程。如果我终止此进程,则 pdf 将被解锁。我在应用程序轮询中将空闲超时设置为 1 分钟,但这不是解决方案。
问题是:lock pdf 的问题在哪里?是在过程中还是在我身上?也许我没有关闭一些东西。
我使用 iTextSharp 来填充 pdf。
使用 MemoryStream 编辑代码:
string pdfDirectory = @"C:\Projects\Amco\EWarranty\EWarranty" + currentFilePath.FilePath;
MemoryStream inputMemoryStream = new MemoryStream();
using (FileStream fs = File.OpenRead(pdfDirectory))
{
inputMemoryStream.SetLength(fs.Length);
fs.Read(inputMemoryStream.GetBuffer(), 0, (int)fs.Length);
inputMemoryStream.Seek(0, SeekOrigin.Begin);
}
PdfReader pdfReader = new PdfReader(inputMemoryStream);
using (Stream inputImageStream = new FileStream(@"C:\Projects\Amco\EWarranty\pechatAMCO.png", FileMode.Open, FileAccess.Read, FileShare.Read))
using (MemoryStream outputStream = new MemoryStream())
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
if (currentServiceMap.FailureNumber == 0)
{
var pdfContentByte = pdfStamper.GetOverContent(3);
Image image = Image.GetInstance(inputImageStream);
image.ScaleToFit(150, 150);
image.SetAbsolutePosition(140, 425);
pdfContentByte.AddImage(image);
}
// Some other else if statements ...
AcroFields pdfFormFields = pdfStamper.AcroFields;
BaseFont cyrillicFont = BaseFont.CreateFont(@"C:\Windows\Fonts\Arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
pdfFormFields.AddSubstitutionFont(cyrillicFont);
// first fail
if (txt_First_Adoption_Date.Text != "")
{
pdfFormFields.SetField("firstAdoptionDate", txt_First_Adoption_Date.Text);
}
if (txt_First_Failure.Text != "")
{
pdfFormFields.SetField("firstFailure", txt_First_Failure.Text);
}
if (txt_First_Return_Date.Text != "")
{
pdfFormFields.SetField("firstReturnDate", txt_First_Return_Date.Text);
}
// Second, third and so on failds ...
warrantyService.UpdateServiceMapByAdmin(CurrentSessions.warrantyNumber, txt_First_Adoption_Date.Text, txt_First_Failure.Text, "", txt_First_Return_Date.Text, txt_Second_Adoption_Date.Text, txt_Second_Failure.Text,
"", txt_Second_Return_Date.Text, txt_Third_Adoption_Date.Text, txt_Third_Failure.Text, "", txt_Third_Return_Date.Text, txt_Fourth_Adoption_Date.Text, txt_Fourth_Failure.Text,
"", txt_Fourth_Return_Date.Text, txt_Fifth_Adoption_Date.Text, txt_Fifth_Failure.Text, "", txt_Fifth_Return_Date.Text, (currentServiceMap.FailureNumber + 1));
pdfStamper.FormFlattening = false;
}
byte[] pdfContent = outputStream.ToArray();
File.WriteAllBytes(pdfDirectory, pdfContent);
}
pdfReader.Close();
inputMemoryStream.Close();
【问题讨论】:
标签: c# asp.net pdf itextsharp