字节数组中的iText7 WmfImage引发IO异常

时间:2019-06-06 17:47:09

标签: c# pdf pdf-generation itext7 wmf

有人可以确认这是一个错误吗?

可以从文件中将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类中接受字节数组。它会尝试检查该参数是否为正确的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 个答案:

答案 0 :(得分:1)

假设此来源: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个字节作为类型描述符。