iText7 WmfImage из байтового массива генерирует IO Exception - PullRequest
0 голосов
/ 06 июня 2019

Может кто-нибудь подтвердить, что это ошибка?

Загрузка файла 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;
    }

1 Ответ

1 голос
/ 06 июня 2019

При условии, что этот источник: https://github.com/itext/itext7/blob/develop/kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/wmf/WmfImageData.java

Да, я могу подтвердить, что конструктор, который принимает byte[], ошибочно ссылается на поле базового класса url без инициализации этого поля.

Я оставлю вопрос о том, как настроить сообщество разработчиков, работающих над этим проектом, поскольку они больше знакомы с внутренней работой изображений WMF. Однако, если я правильно читаю их ReadImageType(url) функцию, то она использует первые 8 байтов в качестве дескриптора типа.

...