Преобразование RVML в SVG с использованием XSLT в C # - PullRequest
2 голосов
/ 06 мая 2011

У меня есть веб-приложение на C #, которое генерирует SVG-код с использованием RaphaelJS , который затем мне нужно преобразовать в PNG для общей совместимости среди пользователей (см. Также мой предыдущий вопрос здесь )

Проблема в том, что вместо кода SVG, который кажется нормой, Internet Explorer производит код RVML. Мое решение успешно работает в Firefox и других браузерах с помощью утилиты командной строки Inkscape для преобразования простого SVG-файла в PNG. Но Inkscape не будет конвертировать из RVML.

Итак, следующая логичная вещь, которую нужно сделать, кроме переписывания моего приложения, чтобы избежать RahaelJs, - преобразовать RVML в SVG перед запуском его через Inkscape. Для этого я нашел эту статью и использовал пример кода в верхней части страницы. XSL-файл, который я использовал для преобразования RVML-файла, - это файл, используемый VectorConverter , который вы можете скачать и просмотреть.

Я должен упомянуть, что ошибок времени выполнения нет - все файлы выводятся в нужном месте, то есть XML -> SVG из преобразования XSLT на стороне сервера и SVG -> PNG из преобразования Inkscape.

Чтобы подвести итог ситуации, при просмотре через Firefox - это нормально - при просмотре через Internet Explorer, файл SVG, созданный преобразованием XML-> SVG, выводит действительный файл SVG, но без фактического содержимого внутри тегов SVG. Мой вопрос заключается в том, имел ли кто-либо еще успех в выполнении этой задачи, или у кого-нибудь есть какие-либо предложения относительно того, что я делаю неправильно?

Спасибо

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Да, мы сделали то же самое на одном из наших проектов. Проблема в том, что VML, сгенерированный RapahelJS, должен быть немного изменен, чтобы соответствовать схеме VectorConverter (кстати, мы использовали схему, включенную во 2-ю версию этого инструмента). Вот изменения, которые мы делали до фактического преобразования:

string clearedVml = new Regex("<rvml.*/rvml:group>")
    .Match(rafaelOutputVml)
    .Value
    .Replace("rvml:", "v:")
    .Replace("class=rvml", "")
    .Replace("filterMatrix", "");

После этого результат преобразования должен быть вставлен в следующую разметку:

        private const string vmlFormat = 
@"
<?xml version=""1.0""?>
<HTML xmlns:v = ""urn:schemas-microsoft-com:vml"" xmlns=""http://www.w3.org/1999/xhtml"">

<HEAD>
<STYLE>v\:* {{
    BEHAVIOR: url(#VMLRender)
}}
</STYLE>
</HEAD>
<BODY>
{0}
</BODY>
</HTML>
";
...
var sReader = new StringReader( String.Format( vmlFormat ,clearedVml ).Trim() );

и только теперь необходимо выполнить фактическое преобразование в SVG.

Надеюсь, это поможет

2 голосов
/ 02 сентября 2011

Я тоже сделал это в своем проекте!Ответ Андрея мне очень помог, но, как и в случае с оригинальным постером, у меня также были проблемы с текстом, которого не было в финальном PNG.Я выяснил, что проблема в том, что для каждого текста Рафаэль генерирует текстовый путь в VML, но путь представляет собой строку размера 1. Когда выполняется перевод в SVG, в SVG создается текстовый путь.Тем не менее, текст не появляется, потому что текстовый путь очень маленький (размер 1).Чтобы решить эту проблему, мне пришлось вручную изменить XSLT в Vector Converter, чтобы генерировать только элемент text в полученном SVG, вместо textpath .Затем я изменил файл varie.xsl в шаблоне "elemento-textpath".У меня также была другая проблема: мои прямоугольники в финальном SVG не были окрашены.Мне пришлось изменить XSLT, чтобы исправить это тоже.Надеюсь это поможет!Я думаю, что проще сначала перевести VML в SVG, а затем экспортировать в PNG, чем пытаться сгенерировать новый PNG из переменной бумаги Рафаэля, как некоторые решения, которые я видел в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...