问题描述
升级到适用于 .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-SNAPSHOT
和 7.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 行被视为重大升级。