在从 SQL 表中获取 SVG 代码并将其传递到 Batik 以对其进行转码(显示 PNG)之间存在一些我不明白的事情。
如果我运行下面的 CF 代码,我会收到错误:无法显示图像,因为它包含错误。这是其中任何一个产生的唯一错误。
我还使用返回 true 的 isXML() 测试了表中的值。
但如果我:
- 取消注释第 1 节,
- 复制 CFDUMP 生成的 SVG 代码,
- 在第 2 节中将该 SVG 代码粘贴回 CFSET 中,
- 并重新注释掉评论部分 1
然后 PNG 按预期显示在浏览器中。在 CFDUMP 中显示 SVG 代码,然后手动将其粘贴到代码中以某种方式(神秘地)使用它的过程会改变它,因此它可以工作......
我尝试了各种变化。当它在 CFDUMP 中显示 SVG 代码时,ColdFusion 似乎在做一些我不理解的事情(或者可能是 SQL 的某种字符集问题?)。
有人知道这可能是什么吗?我受阻了。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<CFQUERY NAME="getSketch">
SELECT sketch_svg AS svg
FROM sketch
WHERE ordID = 1
</CFQUERY>
<cfset svg = Replace(getSketch.svg,'"','','all')>
<!--- Commented-out Section 1
<cfset svg = Replace(svg,"'","''",'all')>
<cfset svg = Replace(svg,"##","####",'all')>
<CFDUMP var="#svg#" abort>
--->
<!--- Commented-out Section 2
<cfset svg = '[Manually paste SVG code from CFDUMP here...]'>
--->
<!--- The following takes the svg code and displays it as a PNG in the browser - This works fine if the SVG code is okay...) --->
<cfscript>
context = getPageContext();
context.setFlushOutput(false);
response = context.getResponse().getResponse();
response.setContentType("image/png");
transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
inputStream = createObject("java", "java.io.StringBufferInputStream").init(svg);
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(inputStream);
outputStream = response.getOutputStream();
output = createObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(outputStream);
transcoder.transcode(input, output);
output.close();
outputStream.close();
</cfscript>