Tika转换PDF至HTML时<li>标签长内容被截断问题求助
问题描述
使用Apache Tika将PDF文档转换为HTML时,整体转换正常,但当列表项(<li>标签)内容超过254字符时,内容会被截断并追加...。该问题在tika-app-2.6.0.jar与tika-app-2.7.0.jar版本中均存在,转换代码如下:
public static void main(String[] args) throws IOException, TransformerConfigurationException, SAXException, TikaException { byte[] file = Files.toByteArray(new File("src/main/java/test/test.pdf")); AutoDetectParser tikaParser = new AutoDetectParser(); ByteArrayOutputStream out = new ByteArrayOutputStream(); SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler handler = factory.newTransformerHandler(); handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html"); handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes"); handler.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8"); handler.setResult(new StreamResult(out)); ExpandedTitleContentHandler handler1 = new ExpandedTitleContentHandler(handler); tikaParser.parse(new ByteArrayInputStream(file), handler1, new Metadata()); System.out.println(new String(out.toByteArray(), "UTF-8")); }
解决方案
这个问题是因为Tika的PDFParser默认对列表项设置了254字符的长度限制,只需调整PDFParserConfig的配置即可解决:
- 创建
PDFParserConfig实例,通过setMaxListItemLength方法设置更大的长度值(比如Integer.MAX_VALUE来取消限制) - 将配置绑定到
AutoDetectParser上
修改后的代码如下:
public static void main(String[] args) throws IOException, TransformerConfigurationException, SAXException, TikaException { byte[] file = Files.toByteArray(new File("src/main/java/test/test.pdf")); // 初始化PDF解析配置,调整列表项最大长度 PDFParserConfig pdfParserConfig = new PDFParserConfig(); // 设为Integer.MAX_VALUE取消长度限制,也可根据需求设置具体数值 pdfParserConfig.setMaxListItemLength(Integer.MAX_VALUE); AutoDetectParser tikaParser = new AutoDetectParser(); // 将配置应用到解析器 tikaParser.setPDFParserConfig(pdfParserConfig); ByteArrayOutputStream out = new ByteArrayOutputStream(); SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler handler = factory.newTransformerHandler(); handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html"); handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes"); handler.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8"); handler.setResult(new StreamResult(out)); ExpandedTitleContentHandler handler1 = new ExpandedTitleContentHandler(handler); tikaParser.parse(new ByteArrayInputStream(file), handler1, new Metadata()); System.out.println(new String(out.toByteArray(), "UTF-8")); }
调整后,长列表项就不会再被截断。如果不需要完全取消限制,也可以根据实际业务场景设置合适的长度阈值。
内容的提问来源于stack exchange,提问作者sohel shaikh
相关产品推荐
相关产品推荐

