iText 7 - PdfReader 构造函数中的解析异常意外关闭输入流

问题描述

升级到适用于 .NET 的最新版 iText (7.1.15 -> 7.1.16) 后,我遇到了一个问题。

请参阅下面的示例代码

Stream pdfStream = GetPdfStream(...);

try
{
    IRandomAccessSource randomAccessSource = new RandomAccessSourceFactory().CreateSource(pdfStream);
    ReaderProperties readerProperties = new ReaderProperties
    {
        // ...
    };

    using (var pdfReader = new PdfReader(randomAccessSource,readerProperties))
    {
        pdfReader.SetCloseStream(false);

        // do things with pdfReader
    }
}
catch
{
    // ...
}

// reuse pdfStream somewhere else

在这种情况下,如果无法解析文件,我会收到异常(预期):

iText.IO.IOException: PDF header not found.
   at iText.Kernel.Pdf.PdfReader.GetoffsetTokeniser(IRandomAccessSource byteSource)
   at iText.Kernel.Pdf.PdfReader..ctor(IRandomAccessSource byteSource,ReaderProperties properties)

但作为一个意想不到的副作用,它也会关闭输入流,这在以前的版本 (7.1.15) 中没有发生。因为异常发生在 PdfReader 构造函数中,所以它还不能到达 pdfReader.SetCloseStream。

有什么办法可以防止 PdfReader 关闭外部提供的输入流?或者任何将采用“leaveOpen”参数 like .NET StreamReader does 的新构造函数 API 的机会。

解决方法

该错误已在 7.2.0-SNAPSHOT7.1.17-SNAPSHOT 版本中修复。 您可以使用以下 Maven 配置从 iText Artifactory 获取这些版本:

<repositories>
  <repository>
    <id>itext-snapshot</id>
    <name>iText Repository - snapshots</name>
    <url>https://repo.itextsupport.com/snapshot</url>
  </repository>
<repositories>

请注意,与 7.2.0-SNAPSHOT 相比,7.1.16-SNAPSHOT 版本包含重大更改,因为与 7.1.x 行相比,7.2.x 行被视为重大升级。