【问题标题】:Adding a WMF to a PDF using iTextSharp使用 iTextSharp 将 WMF 添加到 PDF
【发布时间】:2011-02-08 16:43:44
【问题描述】:

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

我的 WMF 文件来自 Chart 控件。

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

  1. 创建一个新的 Windows 窗体项目。
  2. 在 Form1 上添加一个图表控件。
  3. 然后添加以下代码:

使用指令添加这个

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();
}

我收到的错误是: 发生 IOException。字节数组不是可识别的图像格式。

使用 iTextSharp 5.0.5。

【问题讨论】:

  • 我使用 WMF 文件没有任何问题,但我是从磁盘加载它。您可以将其写入磁盘并通过路径加载它以查看是否有效吗?我想知道内存流是否有问题。
  • 再进一步看,似乎有两种不同类型的 WMF 文件。 Windows 3.0 版本具有01 00 09 00 00 0302 00 09 00 00 03 作为前六个字节。但是当我从 Adob​​e Illustrator 制作 WMF 时,我得到 D7 CD C6 9A 作为前 4 个字节。后者对我来说适用于 iTextSharp。

标签: c# itextsharp


【解决方案1】:

您可以尝试直接构建它而不是调用 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 可以使用的东西的问题:

http://itext-general.2136553.n4.nabble.com/WMF-file-doesn-t-display-correctly-td2283480.html

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

【讨论】:

  • 我编辑了上面的帖子并添加了有效的解决方案代码......不确定编辑去了哪里。
  • @Clever 我真的很想了解您发布的工作解决方案。你会在某个地方拥有它吗?
  • 我不知道我发布的原始代码去了哪里,但解决方案是意识到图表控件正在生成 EMF 文件而不是 WMF 文件,并且我需要转换它.我必须使用 Win32 Api 调用来执行此操作:GdipEmfToWmfBits。希望有帮助!
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 2015-05-07
  • 2011-05-06
  • 2013-02-09
  • 2013-02-10
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多