C# 使用iTextSharp将WMF添加到PDF

C# 使用iTextSharp将WMF添加到PDF,c#,itextsharp,C#,Itextsharp,我完全无法使用iTextSharp将WMF文件转换成PDF。我特别想使用WMF,因为它是一个基于向量的文件 我的WMF文件来自一个控件 重现这一点的代码非常简单 创建新的Windows窗体项目 将图表控件添加到Form1中 然后添加以下代码: 添加这个using指令 using iTS = iTextSharp.text; 并将以下代码添加到Form1.cs文件中: private void Form1_Load(object sender, EventArgs e) { Docume

我完全无法使用iTextSharp将WMF文件转换成PDF。我特别想使用WMF,因为它是一个基于向量的文件

我的WMF文件来自一个控件

重现这一点的代码非常简单

  • 创建新的Windows窗体项目
  • 将图表控件添加到Form1中
  • 然后添加以下代码:
  • 添加这个using指令

    using iTS = iTextSharp.text;
    
    并将以下代码添加到Form1.cs文件中:

    private void Form1_Load(object sender, EventArgs e)
    {
        Document pdfDoc = new Document();
        PdfWriter.GetInstance(pdfDoc, new FileStream(@"D:\dev\Test\TestPdfCreation\TestPdfCreation\bin\Debug\test.pdf", FileMode.Create));
    
        MemoryStream mimg1 = new MemoryStream();
        chart1.SaveImage(mimg1, ImageFormat.Wmf);
        mimg1.Seek(0, SeekOrigin.Begin);
        iTS.Image img1 = iTS.Image.GetInstance(mimg1);
        pdfDoc.Add(img1);
        pdfDoc.Close();
    }
    
    我收到的错误是: 发生异常。字节数组不是可识别的图像格式


    使用iTextSharp 5.0.5.

    您可以尝试直接构建它,而不是调用createImage:

    Image img = new ImgWMF( bytes );
    
    尽管查看代码,我发现您会得到一个不同的异常:

            InputMeta in = new InputMeta(is);
            if (in.readInt() != 0x9AC6CDD7) {
                throw new BadElementException(errorID + " is not a valid placeable windows metafile.");
            }
    
    这里的关键点可能是“可放置”。我对WMF不太熟悉,但您可能会找到另一种
    ImageFormat
    或其他什么

    是的。看起来可放置的WMF是Aldus不久前提出的。下面是一个关于将WMF转换为iText可以使用的东西的问题:


    这个特殊的问题与渐变填充有关。

    您可以尝试直接构建它,而不是调用createImage:

    Image img = new ImgWMF( bytes );
    
    尽管查看代码,我发现您会得到一个不同的异常:

            InputMeta in = new InputMeta(is);
            if (in.readInt() != 0x9AC6CDD7) {
                throw new BadElementException(errorID + " is not a valid placeable windows metafile.");
            }
    
    这里的关键点可能是“可放置”。我对WMF不太熟悉,但您可能会找到另一种
    ImageFormat
    或其他什么

    是的。看起来可放置的WMF是Aldus不久前提出的。下面是一个关于将WMF转换为iText可以使用的东西的问题:


    这个特殊的问题与渐变填充有关。

    我使用的WMF文件没有任何问题,但我是从磁盘加载的。你们能把它写到磁盘上,然后按路径加载,看看它是否有效吗?我想知道内存流是否有问题。再看一看,似乎有两种不同类型的WMF文件。Windows 3.0版本的前六个字节是
    01 00 09 00 03
    02 00 09 00 03
    。但是当我从AdobeIllustrator制作WMF时,我得到
    D7CDC69A
    作为前4个字节。后者对我来说适用于iTextSharp。我使用的WMF文件没有任何问题,但我是从磁盘加载的。你们能把它写到磁盘上,然后按路径加载,看看它是否有效吗?我想知道内存流是否有问题。再看一看,似乎有两种不同类型的WMF文件。Windows 3.0版本的前六个字节是
    01 00 09 00 03
    02 00 09 00 03
    。但是当我从AdobeIllustrator制作WMF时,我得到
    D7CDC69A
    作为前4个字节。后者是我在iTextSharp上的工作原理。我编辑了上面的帖子,并添加了工作解决方案代码。。。不知道编辑到哪里去了。@我真的很想了解你发布的工作解决方案。我不知道我发布的原始代码去了哪里,但解决方案是认识到图表控件生成的是EMF文件而不是WMF文件,我需要转换它。我必须使用Win32 Api调用来实现这一点:GdipEmfToWmfBits。希望有帮助!我编辑了上面的帖子并添加了工作解决方案代码。。。不知道编辑到哪里去了。@我真的很想了解你发布的工作解决方案。我不知道我发布的原始代码去了哪里,但解决方案是认识到图表控件生成的是EMF文件而不是WMF文件,我需要转换它。我必须使用Win32 Api调用来实现这一点:GdipEmfToWmfBits。希望有帮助!