gpt4 book ai didi

Java 到 Coldfusion SVG 到 PDF

转载 作者:行者123 更新时间:2023-12-01 11:42:09 27 4
gpt4 key购买 nike

我正在尝试将下面的代码转换为 Coldfusion。我目前陷入如何将“Transformer Transformer = TransformerFactory.newInstance().newTransformer()”行转换为 Coldfusion 的困境。谁能帮忙转换一下这段代码吗?

使用 Transformer = loader.create("javax.xml.transform.TransformerFactory").newInstance().newTransformer(); 时收到的错误消息

将 org.apache.xalan.processor.TransformerFactoryImpl 类型的对象转换为 javax.xml.transform.TransformerFactory 时出错,无法转换为不兼容的类型。这通常表明 Java 中存在编程错误,尽管它也可能意味着您尝试以与设计不同的方式使用外来对象。org.apache.xalan.processor.TransformerFactoryImpl 无法转换为 javax.xml.transform.TransformerFactory

    Document svgXmlDoc = ...

File svgFile = File.createTempFile("graphic-", ".svg");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source2 = new DOMSource(svgXmlDoc);
FileOutputStream fOut = new FileOutputStream(svgFile);
try { transformer.transform(source2, new StreamResult(fOut)); }
finally { fOut.close(); }

// Convert the SVG into PDF
File outputFile = File.createTempFile("result-", ".pdf");
SVGConverter converter = new SVGConverter();
converter.setDestinationType(DestinationType.PDF);
converter.setSources(new String[] { svgFile.toString() });
converter.setDst(outputFile);
converter.execute();

这是到目前为止我的代码。

<cfscript>
paths = arrayNew(1);
paths[1] = expandPath("jar\avalon-framework-impl-4.2.0.jar");
paths[2] = expandPath("jar\batik-all-1.7.jar");
paths[3] = expandPath("jar\commons-io-1.3.1.jar");
paths[4] = expandPath("jar\commons-logging-1.0.4.jar");
paths[5] = expandPath("jar\fop-0.9.5.jar");
paths[6] = expandPath("jar\apache-log4j-1.2.15.jar");
paths[7] = expandPath("jar\xml-apis-ext.jar");
paths[8] = expandPath("jar\xmlgraphics-commons-1.3.1.jar");
paths[8] = expandPath("jar\javax.xml-1.3.4.jar");

loader = createObject("component", "javaloader.JavaLoader").init(paths);

destinationtype = loader.create("org.apache.batik.apps.rasterizer.DestinationType");
svgconverter = loader.create("org.apache.batik.apps.rasterizer.SVGConverter");


// SVG available as a DOM object (created programatically by my program)
svgXmlDoc = '<svg><text y="3.58in" x="1.5000in" id="fooddesc1" text-anchor="start" alignment-baseline="baseline">This is a test.</text></svg>';

// Save this SVG into a file (required by SVG -> PDF transformation process)
f = loader.create("java.io.File");
svgFile = f.createTempFile("graphic-", ".svg");
transformer = loader.create("javax.xml.transform.TransformerFactory");
source2 = loader.create("javax.xml.transform.dom.DOMSource").init(svgXmlDoc);
fOut = loader.create("java.io.FileOutputStream").init(svgFile);
</cfscript>

最佳答案

看起来您正在翻译的代码来自 this thread 。我建议改用已接受的答案。比较简单一点。但是,您不需要使用 JavaLoader,因为您运行的是 CF11。从CF10开始,撕裂Mark Mandel's JavaLoader.cfc被烘焙到CF中。应用程序可以使用this.javaSettings动态加载jar在 Application.cfc 中。最简单的选择是将所有 jar 放在单独的目录中,并在应用程序设置中指向该路径。然后您可以使用 createObject() 加载任何类。

   this.javaSettings = {LoadPaths = [ "/path/to/jars_folder/" ]};

示例:

transcoder = createObject("java", "org.apache.fop.svg.PDFTranscoder").init();

// load text into a reader and create the source input
svgText = '<svg xmlns="http://www.w3.org/2000/svg"><text y="3.58in" x="1.5000in" id="fooddesc1" text-anchor="start" alignment-baseline="baseline">This is a test.</text></svg>';
reader = createObject("java", "java.io.StringReader").init(svgText);
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(reader);

// for demo purposes, create a unique file name
outPath = ExpandPath("./"& createUUID() &".pdf");
fos = createObject("java", "java.io.FileOutputStream").init(outPath);
output = createObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(fos);

transcoder.transcode(input, output);
// ALWAYS close the stream
fos.close();

上面的简单示例是在 CF10 下使用以下 jar 进行测试的,所以 YMMV。

  • avalon-framework-4.2.0.jar
  • commons-io-1.3.1.jar
  • batik-all-1.7.jar
  • fop-0.9.5.jar
  • xmlgraphics-commons-1.3.1.jar
  • xml-apis-ext-1.3.04.jar


<小时/>

原始异常

Error casting an object of type org.apache.xalan.processor.TransformerFactoryImpl cannot be cast to javax.xml.transform.TransformerFactory

我不完全确定是什么导致了 ClassCastException。我怀疑这是某种类加载器问题。 CF 已经与您正在加载的几个库捆绑在一起。至少有一个核心 jar 包含 TransformerFactory 的另一个版本。在 CF10 下,如果省略 javax.xml-1.3.4.jar(和 commons-logging-1.0.4.jar),错误就会消失。因此,不知何故,各个部分在自定义类加载器下不能很好地协同工作。这就是为什么当你打电话 TransformerFactory.newInstance() 时事情就会爆炸。 。但是,由于您实际上并不需要该类,因此我没有进一步研究它......

更新:

FWIW,该错误肯定是由类加载器冲突引起的。如果省略 javax.xml-1.3.4.jar (和 commons-logging-1.0.4.jar),原始代码可以正常工作。

如果您查看 TransformerFactory.newInstance() 的源代码您可以看到对 FactoryFinder.find() 的调用它根据条件引用不同的类加载器。由于 CF 已经包含 javax.xml.* 包,我怀疑某些对象是由 CF 的类加载器创建的,即 org.apache.xalan.processor.TransformerFactoryImpl ,而其他人即 TransformerFactory由不同的类加载器(即 JavaLoader)创建。

类加载器是 notoriously finicky 。您必须遵循某些规则,否则一个类加载器创建的对象将无法被另一个类加载器识别 - 即使它们代表完全相同的类。这似乎就是这里正在发生的事情。您可能可以摆弄父级或上下文类加载器来解决它,但在这种情况下,省略 javax.xml-1.3.4.jar 会更简单。

话虽如此……我认为您根本不需要 TransformerFactory 代码。听起来您已经有了一个有效的 SVG 字符串。只需将其保存到一个文件 FileWrite()并继续处理其余的代码。

关于Java 到 Coldfusion SVG 到 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29438482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com