Проблема с динамическим формированием изображений SVG

Я пытаюсь написать сценарий на стороне сервера (PHP) для генерации изображения SVG на основе пользовательского ввода. Я использую следующий код:

<?php echo '<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <head><meta http-equiv="Content-Type" content="svg+xml" /></head> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> </svg>'; ?> 

Я где-то читал, что тип MIME должен быть svg + xml, поэтому я попытался установить его в виде содержимого, как вы можете видеть выше. Правильный код получен Firefox, но изображение не отображается. Кто-нибудь знает, что здесь изменить?

Solutions Collecting From Web of "Проблема с динамическим формированием изображений SVG"

Согласно SVG-странице в wikipedia , SVG должен быть представлен как image/svg+xml .
См. Также: 1.2 Тип SVG MIME, расширение имени файла и тип файла Macintosh

Следующая мета:

 <meta http-equiv="Content-Type" content="svg/xml" /> 

Не определяет способ доставки контента с сервера – это больше способ предоставить эту информацию для HTML-страниц, когда вы не можете определить способ ее обслуживания …
И я не уверен, что мета-элемент действителен в спецификациях SVG – я позволю вам проверить, что ^^

Здесь вам нужно отправить HTTP-заголовок с вашего сервера, указав тип содержимого ваших данных.

Это делается с использованием функции header PHP; в твоем случае :

 header('Content-type: image/svg+xml'); echo '<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> </svg>'; 

Заметка :

  • Я удалил теги <meta> и <head> ; не уверен, что <head> должен быть удален, но, поскольку он был пуст ….
  • Я добавил вызов функции header
  • Красный круг SVG правильно отображается firefox – так что, похоже, работает 😉

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

Просто сказал, что это:

 <?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <head><title>test</title></head> <body> <svg:svg id="display" width="500" heigth="500" viewBox="0 0 500 500"> <svg:rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg:svg> </body> </html> 

будет работать так же, как это:

 <?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>test</title></head> <body> <svg id="display" width="500" heigth="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg> </body> </html> 

Вы можете судить сами, что более читаемо / чисто. Если вы используете много svg-фрагментов, тогда в некоторых случаях может возникнуть смысл помещать объявления xmlns в корневой элемент html, как в первом примере.

Недавно мне удалось использовать svg в документе xhtml.

 <?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <head><title>test</title></head> <body> <svg:svg id="display" width="500" heigth="500" viewBox="0 0 500 500"> <svg:rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg:svg> </body> </html> 

Хитрость заключалась в использовании префикса svg: для каждого элемента. Он должен знать, что пространство имен должно быть правильно проанализировано браузером.

Затем я осветил библиотеку Javascript Raphael http://raphaeljs.com/, которая очень легко обрабатывает объекты svg.

Я надеюсь, что это помогает