Как преобразовать файл SVG в файл EMF в C#

определенно можно преобразовать SVG в EMF, например этот сайт. Интересно, можно ли добиться этого преобразования в C#?


обновление:

Я пытался читать файл SVG с помощью SVG.NET и привлечь его к Graphics объект, затем попытался экспортировать Image Как Метафайл .расширение emf (я следовал инструкции здесь:GDI+ / C#: Как сохранить изображение как EMF?). Чтение было сделано успешно, и изображение было экспортировано как .ЭДС. Однако, когда я открыл .emf в PowerPoint не может быть сгруппирован, что указывает на то, что информация о чертеже этого файла на самом деле не была сброшена правильно.

обновление 2:

Теперь он экспортирует ungroup-able .ЭДС, но разгруппировка показывает очень плохой результат. Я использовал следующий код для создания .emf:

private void OpenPictureButtonClick(object sender, EventArgs e)
{
    var openFileDialog = new OpenFileDialog();
    openFileDialog.ShowDialog();

    _svgDoc = SvgDocument.Open(openFileDialog.FileName);

    RenderSvg(_svgDoc);
}

private void SavePictureClick(object sender, EventArgs e)
{
    var saveFileDialog = new SaveFileDialog {Filter = "Enhanced Meta File | *.Emf"};
    saveFileDialog.ShowDialog();

    var path = saveFileDialog.FileName;
    var graphics = CreateGraphics();
    var img = new Metafile(path, graphics.GetHdc());
    var ig = Graphics.FromImage(img);

    _svgDoc.Draw(ig);

    ig.Dispose(); img.Dispose(); graphics.ReleaseHdc(); graphics.Dispose();
}

private void RenderSvg(SvgDocument svgDoc)
{
    svgImageBox.Image = svgDoc.Draw();
}

1 ответов


у меня была та же проблема, но поиск не дал никаких результатов.
Наконец, я закончил с моим собственным простым решением ниже. Я использовал SVG.NET.

public static byte[] ConvertToEmf(string svgImage)
{
    string emfTempPath = Path.GetTempFileName();
    try
    {
        var svg = SvgDocument.FromSvg<SvgDocument>(svgImage);
        using (Graphics bufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
        {
            using (var metafile = new Metafile(emfTempPath, bufferGraphics.GetHdc()))
            {
                using (Graphics graphics = Graphics.FromImage(metafile))
                {
                    svg.Draw(graphics);
                }
            }
        }

        return File.ReadAllBytes(emfTempPath);
    }
    finally
    {
        File.Delete(emfTempPath);
    }
}

сначала я создаю временный файл. Тогда я использую Draw(Graphics) метод сохранения emf в нем. И, наконец, я прочитал байты из temp-файла.
Не пытайтесь использовать MemoryStream на Metafile. К сожалению, это не работает.