我通过tika获取pdf文档的内容并将其发送到solr以通过coldfusion中的xml请求对其进行索引9这是我的代码。
<cfset gatt = new getallthetexts.textextractor()>
<cfset result= gatt.read(pdfpath)>
<cfset content = xmlFormat(result.text)>
<!---escape unicode characters--->
<cfset p= createObject("java","java.util.regex.Pattern").compile("[^\\u0009\\u000A\\u000D\u0020-\\uD7FF\\uE000-\\uFFFD\\u10000-\\u10FFF]+")>
<cfset p.matcher(content).replaceAll("")>
<cfxml variable="xml">
<add>
<field name="content">#content#</field>
</add>
</cfxml>
现在我面临以下错误:
十进制表示必须紧跟在a中的“&amp;#”后面 字符参考。
我在以下链接中使用了示例来获取pdf的内容: https://github.com/cfjedimaster/getallthetexts/blob/master/test1.cfm
任何人都可以帮我解决这个问题。
答案 0 :(得分:1)
符号0xb表示U + 000B,在HTML和XML 1.0中禁止使用。在Ascii中,0xb代表VERTICAL TABULATION。我根本不应该使用HTML或XML。结论取决于这个角色出现的背景。
答案 1 :(得分:1)
您的代码未显示您使用content
执行的操作,这是关键位!
您使用的是哪个版本的ColdFusion?当你提出问题时,请务必指明这一点。
但无论如何,我可以对答案采取行动。
xmlFormat()
有错误(就像你看到的那样!),所以这不是最好的选择,所以它没有声称根据你的问题清理低端角色。
这就是文档(xmlFormat()
)中的所有内容,它应该是您的第一个停靠点,包含这样的问题。
建议使用encodeForXml()
,这将正确处理此问题。
使用底层Java库,CF10的encodeFor~()
函数就足够了。一切都在这里:OWASP Java !Encoder Project。我最近没有必要使用这个代码,所以没有一个例子,但这一切看起来都很直接。试一试,如果遇到麻烦:提出一个新问题:我会找一些时间仔细看看。
答案 2 :(得分:0)
我正在按照亚当建议更新我的答案。现在我使用owasp为xml编码文本。
我从以下链接下载了最新版本的OWASP jar文件: https://www.owasp.org/index.php/OWASP_Java_Encoder_Project
我使用javaloader加载jar文件,这里是具有使用OWASP将文本解析为XML的函数的组件。
component {
public function init() {
variables.javaloader = new javaloader.JavaLoader().init([getDirectoryFromPath(getCurrentTemplatePath()) & 'encoder.jar'],true);
return this;
}
public function parseTextForXML(required string inputText) {
esapi=variables.javaloader.create('org.owasp.esapi.ESAPI');
esapiEncoder = esapi.encoder();
return esapiEncoder.encodeForXML(inputText);
}
}
并使用CDATA功能解决了我的问题。这是代码:
<cfset gatt = new getallthetexts.textextractor()>
<cfset encoderObj = new encoder()>
<cfset result= gatt.read(pdfpath)>
<cfset content = encoderObj.parseTextForXML(result.text)>
<cfxml variable="xml">
<add>
<field name="content"><![CDATA[#content#]]></field>
</add>
</cfxml>