我有一个代码,可以使用ITextSharp库将一定数量的PDF文件合并为一个PDF文件。
代码运行良好,每次我在visualstudio中调试代码时,它都会创建一个pdf文件。它也适用于一定数量的此类请求。但是,当我在250个此类请求的自动测试用例中运行它时,由于生成的单个PDF文件尚未从IIS Worker Process发布,这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;
}
当我们用8个并行请求加载应用程序时,它不起作用,因为生成Merged PDF文件名的逻辑是基于将以下表达式附加到固定字符串文本:
DateTime.Now.ToString("yyyyMMdd_hhmmss_fffffff")
这在加载时会生成重复的文件名,因此文件在加载过程中似乎被卡住了。使用Guid.NewGuid()代替上面的解决了这个问题。
这根本不是物体没有得到妥善处理或任何其他iTextSharp问题。