我有一个代码,使用ITextSharp库将一定数量的PDF文件合并为一个PDF文件。
代码工作正常,每次我在visual studio中调试代码时都会创建单个pdf文件。对于特定数量的此类请求,它也可以正常工作。但是,当我在250个此类请求的自动化测试用例中运行它时,由于生成的单个PDF文件尚未从IIS工作进程中释放,因此250个请求中的2个或3个失败。
当我尝试使用2000个请求的测试用例时,由于生成的文件卡在IIS进程中,这些2000个请求中有7个失败。
我尝试过关闭/释放所有对象。请帮我找出错误。这是代码:
List<PdfReader> pdfReaders = new List<PdfReader>();
int totalPageCount = 0;
Document document = null;
PdfWriter pdfWriter = null;
try
{
document = new Document();
pdfWriter = PdfWriter.GetInstance(document, new FileStream(destinationFilePath, FileMode.Create));
document.Open();
PdfContentByte contentByte = pdfWriter.DirectContent;
PdfImportedPage page = null;
int rotation = 0;
foreach (string filePath in sourceFiles)
{
PdfReader pdfReader = new PdfReader(filePath);
pdfReaders.Add(pdfReader);
totalPageCount = pdfReader.NumberOfPages;
//iterate throw each page of current source pdf file
for (int currentPageNumber = 1; currentPageNumber <= totalPageCount; currentPageNumber++)
{
document.SetPageSize(pdfReader.GetPageSizeWithRotation(currentPageNumber));
document.NewPage();
page = pdfWriter.GetImportedPage(pdfReader, currentPageNumber);
rotation = pdfReader.GetPageRotation(currentPageNumber);
if (rotation == 90 || rotation == 270)
{
contentByte.AddTemplate(page, 0, -1f, 1f, 0, 0, pdfReader.GetPageSizeWithRotation(currentPageNumber).Height);
}
else
{
contentByte.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
}
}
}
finally
{
//close the document
if (document != null && document.IsOpen())
{
document.Close();
document = null;
foreach (var p in pdfReaders)
{
p.Close();
}
pdfWriter.Close();
}
}
正如所建议的那样,我已经使用PdfCopy更新了代码,但是当我并行发送8个请求以获得总共2000个请求时,我仍然缺少一些请求,但错误相同:
使用PDFCOPY的更新代码:
Document document = null;
PdfReader reader = null;
PdfCopy pdfCopy = null;
PdfImportedPage importedPage = null;
try
{
using (document = new Document())
{
if (metadata != null)
{
AddMetadata(document, metadata);
}
using (pdfCopy = new PdfCopy(document, new FileStream(destinationFilePath, FileMode.Create)))
{
document.Open();
foreach (var file in sourceFiles)
{
using (reader = new PdfReader(file))
{
for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
{
document.SetPageSize(reader.GetPageSizeWithRotation(pageNumber));
importedPage = pdfCopy.GetImportedPage(reader, pageNumber);
pdfCopy.AddPage(importedPage);
}
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
答案 0 :(得分:1)
当我们并行处理具有8个请求的应用程序时,它不起作用,因为生成合并PDF文件名的逻辑基于将以下表达式附加到固定字符串文字:
DateTime.Now.ToString("yyyyMMdd_hhmmss_fffffff")
这是在加载时生成重复的文件名,因此出现文件卡在进程中。使用Guid.NewGuid()代替上面解决了这个问题。
这完全不是对象没有被妥善处理掉或任何其他iTextSharp问题。