想象一下,在使用PHP将SVG转换为JPG时不使用自定义字体
我在尝试将SVG转换为JPG图像时遇到自定义字体无法渲染的问题.我正在使用为SVG文本元素定义的font-family =“Lobster”.
我的服务器设置如下: > CentOS 6.5(32位) 我正在测试的PHP代码,但不起作用.我正在尝试使用自定义字体龙虾. //Setup SVG to be read by Imagick. $SVG = '<?xml version="1.0" encoding="utf-8"?>'; $SVG .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'; $SVG .= '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="158px" height="92px" viewBox="0 0 158 92" enable-background="new 0 0 158 92" xml:space="preserve">'; $SVG .= '<text transform="matrix(1 0 0 1 32 58)" font-family="Lobster" font-style="normal" font-size="20px" font-weight="400">Lobster</text>'; $SVG .= '</svg>'; $image = new Imagick(); //Convert SVG to JPG $image->readImageBlob($SVG); $image->setImageFormat("jpeg"); //Save the thumbnail. $save_path = '/home/username/lobster.jpg'; $image->writeImage($save_path); echo '<img src="lobster.jpg" alt="" /><br />'; 产生以下图像: 我尝试过的: 我创建了一个位于/home/username/.magick/type.xml的type.xml文件,其中包含Lobster字体定义,如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE typemap [ <!ELEMENT typemap (type)+> <!ELEMENT type (#PCDATA)> <!ELEMENT include (#PCDATA)> <!ATTLIST type name CDATA #REQUIRED> <!ATTLIST type fullname CDATA #IMPLIED> <!ATTLIST type family CDATA #IMPLIED> <!ATTLIST type foundry CDATA #IMPLIED> <!ATTLIST type weight CDATA #IMPLIED> <!ATTLIST type style CDATA #IMPLIED> <!ATTLIST type stretch CDATA #IMPLIED> <!ATTLIST type format CDATA #IMPLIED> <!ATTLIST type metrics CDATA #IMPLIED> <!ATTLIST type glyphs CDATA #REQUIRED> <!ATTLIST type version CDATA #IMPLIED> <!ATTLIST include file CDATA #REQUIRED> ]> <typemap> <type format="ttf" name="Lobster" fullname="Lobster" family="Lobster" glyphs="/home/username/fonts/Lobster/Lobster.ttf" style="normal" stretch="normal" weight="400" /> </typemap> 我在/usr/lib/ImageMagick-6.5.4/config/type.xml文件中包含了一个直接包含,如下所示: <typemap> <include file="type-ghostscript.xml" /> <include file="/home/username/.magick/type.xml" /> </typemap> 使用$image-> queryfonts()输出字体时;方法,我可以看到列表中定义的龙虾字体.例如,这个: $image = new Imagick(); $fonts = $image->queryfonts(); foreach($fonts as $font) { echo $font . '<br />'; } 返回此: [...] Hershey-Plain-Triplex-Regular Hershey-Script-Complex-Regular Hershey-Script-Simplex-Regular Lobster MeriendaOne NewCenturySchlbk-Bold NewCenturySchlbk-BoldItalic NewCenturySchlbk-Italic NewCenturySchlbk-Roman [...etc] 另外,我相信ImageMagick正在使用它自己的内部SVG渲染器. shell命令: convert -list format | grep SVG 返回: MSVG SVG rw+ ImageMagick's own SVG internal renderer SVG SVG rw+ Scalable Vector Graphics (RSVG 2.26.0) SVGZ SVG rw+ Compressed Scalable Vector Graphics (RSVG 2.26.0) 关于为什么这不起作用的任何想法? 解决方法
我在使用Imagemagick将SVG转换为PNG时遇到了同样的问题,但无法使用该方法使其工作.我以某种方式能够使用docraptor获得我需要的结果:
DocRaptor.createAndDownloadDoc("YOUR_API_KEY",{ test: true,// test documents are free,but watermarked type: "pdf",document_content: document.getElementById('container_of_svg').innerHTML }) 只需确保在container_of_svg元素中添加字体声明,如下所示,并确保为字体添加绝对URL: @font-face { font-family: 'DaimlerCS-Demi'; src: url("https://staging.xxx.com/xx/fonts/xx/FontCS-Demi.eot") } page { size: 21.16cm 15.87cm; padding: 1cm; margin:0; background: #E6E6E6; } 请在这里查看他们的文件:https://docraptor.com/documentation/jquery 注意:docraptor不是免费的,但如果您的客户可以支付费用,我认为它是一个可靠的选择. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |