ITextSharp - 创建PDF文件后,它停留在IIS工作进程中,无法移动

时间:2014-03-05 14:38:15

标签: c# .net iis-7.5 itextsharp

我有一个代码,使用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;
}

1 个答案:

答案 0 :(得分:1)

当我们并行处理具有8个请求的应用程序时,它不起作用,因为生成合并PDF文件名的逻辑基于将以下表达式附加到固定字符串文字:

DateTime.Now.ToString("yyyyMMdd_hhmmss_fffffff")

这是在加载时生成重复的文件名,因此出现文件卡在进程中。使用Guid.NewGuid()代替上面解决了这个问题。

这完全不是对象没有被妥善处理掉或任何其他iTextSharp问题。