来自字节数组的 iText7 WmfImage 抛出 IO 异常
iText7 WmfImage from byte array throws IO Exception
有人可以确认这是一个错误吗?
从文件加载 WMF 文件作为 WmfImage(参见代码,方法 1)有效,但从字节数组加载它(方法 2)失败。
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// Method 1: WmfImageData from file (works).
WmfImageData imageData1 = new WmfImageData("test.wmf");
PdfFormXObject xObject1 = new PdfFormXObject(imageData1, pdf);
document.Add(new Image(xObject1));
// Method 2: WmfImageData from byte[] (fails).
byte[] wmfBytes = File.ReadAllBytes("test.wmf");
WmfImageData imageData2 = new WmfImageData(wmfBytes);
PdfFormXObject xObject2 = new PdfFormXObject(imageData2, pdf);
document.Add(new Image(xObject2));
document.Close();
在我的例子中,第二种方法很有用,因为我可以生成 Microsoft Chart 并将其转换为 WMF 字节数组,然后将其放入 PDF 中,而无需先将其保存到文件中。
方法 2 抛出此错误:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=itext.io
StackTrace:
at iText.IO.Util.UrlUtil.OpenStream(Uri url) in itext7-dotnet\itext\itext.io\itext\io\util\UrlUtil.cs:line 73
at iText.Kernel.Pdf.Canvas.Wmf.WmfImageData.ReadImageType(Uri source) in itext7-dotnet\itext\itext.kernel\itext\kernel\pdf\canvas\wmf\WmfImageData.cs:line 94
at iText.Kernel.Pdf.Canvas.Wmf.WmfImageData..ctor(Byte[] bytes) in itext7-dotnet\itext\itext.kernel\itext\kernel\pdf\canvas\wmf\WmfImageData.cs:line 76
原因似乎是构造函数在 iText.Kernel.Pdf.Canvas.Wmf.WmfImageData
class 中接受了一个字节数组。它会尝试检查参数是否是正确的 WMF 图像,但这样做是通过尝试从不存在的 URI 加载字节。
我的修复建议是在 WmfImageData class 中添加以下函数,并将构造函数中的一行从 ReadImageType(url)
更改为 ReadImageType(bytes)
。
private static byte[] ReadImageType(byte[] bytes) {
if (bytes.Length > 1) {
return new byte[] { bytes[0], bytes[1] };
}
return null;
}
是的,我可以确认采用 byte[]
的构造函数错误地引用了基础 class 字段 url
,而该字段未被初始化。
我将把如何修复的问题留给从事该项目的开发人员社区,因为他们更熟悉 WMF 图像的内部工作原理。但是,如果我正确地阅读了它们的 ReadImageType(url)
函数,那么它将使用前 8 个字节作为类型描述符。
有人可以确认这是一个错误吗?
从文件加载 WMF 文件作为 WmfImage(参见代码,方法 1)有效,但从字节数组加载它(方法 2)失败。
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// Method 1: WmfImageData from file (works).
WmfImageData imageData1 = new WmfImageData("test.wmf");
PdfFormXObject xObject1 = new PdfFormXObject(imageData1, pdf);
document.Add(new Image(xObject1));
// Method 2: WmfImageData from byte[] (fails).
byte[] wmfBytes = File.ReadAllBytes("test.wmf");
WmfImageData imageData2 = new WmfImageData(wmfBytes);
PdfFormXObject xObject2 = new PdfFormXObject(imageData2, pdf);
document.Add(new Image(xObject2));
document.Close();
在我的例子中,第二种方法很有用,因为我可以生成 Microsoft Chart 并将其转换为 WMF 字节数组,然后将其放入 PDF 中,而无需先将其保存到文件中。
方法 2 抛出此错误:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=itext.io
StackTrace:
at iText.IO.Util.UrlUtil.OpenStream(Uri url) in itext7-dotnet\itext\itext.io\itext\io\util\UrlUtil.cs:line 73
at iText.Kernel.Pdf.Canvas.Wmf.WmfImageData.ReadImageType(Uri source) in itext7-dotnet\itext\itext.kernel\itext\kernel\pdf\canvas\wmf\WmfImageData.cs:line 94
at iText.Kernel.Pdf.Canvas.Wmf.WmfImageData..ctor(Byte[] bytes) in itext7-dotnet\itext\itext.kernel\itext\kernel\pdf\canvas\wmf\WmfImageData.cs:line 76
原因似乎是构造函数在 iText.Kernel.Pdf.Canvas.Wmf.WmfImageData
class 中接受了一个字节数组。它会尝试检查参数是否是正确的 WMF 图像,但这样做是通过尝试从不存在的 URI 加载字节。
我的修复建议是在 WmfImageData class 中添加以下函数,并将构造函数中的一行从 ReadImageType(url)
更改为 ReadImageType(bytes)
。
private static byte[] ReadImageType(byte[] bytes) {
if (bytes.Length > 1) {
return new byte[] { bytes[0], bytes[1] };
}
return null;
}
是的,我可以确认采用 byte[]
的构造函数错误地引用了基础 class 字段 url
,而该字段未被初始化。
我将把如何修复的问题留给从事该项目的开发人员社区,因为他们更熟悉 WMF 图像的内部工作原理。但是,如果我正确地阅读了它们的 ReadImageType(url)
函数,那么它将使用前 8 个字节作为类型描述符。