Может кто-нибудь подтвердить, что это ошибка?
Загрузка файла 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 и преобразовать ее в байтовый массив 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
.Он пытается проверить, является ли аргумент правильным изображением WMF, но делает это, пытаясь загрузить байты из URI, который не существует.
Мое предложение для исправления заключается в добавлении следующей функции в WmfImageDataи изменив одну строку в конструкторе с ReadImageType(url)
на ReadImageType(bytes)
.
private static byte[] ReadImageType(byte[] bytes) {
if (bytes.Length > 1) {
return new byte[] { bytes[0], bytes[1] };
}
return null;
}