itext html转pdf 报错 Invalid ICC Profile Data
Html 转Pdf 时部分图片有问题导致转换失败
报错信息
java.lang.IllegalArgumentException: Invalid ICC Profile Data at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:781) at com.lowagie.text.Jpeg.processParameters(Unknown Source) at com.lowagie.text.Jpeg.<init>(Unknown Source) at com.lowagie.text.Image.getInstance(Unknown Source) at org.xhtmlrenderer.pdf.ITextUserAgent.getImageResource(ITextUserAgent.java:67) at org.xhtmlrenderer.pdf.ITextReplacedElementFactory.createReplacedElement(ITextReplacedElementFactory.java:57) at org.xhtmlrenderer.render.BlockBox.calcDimensions(BlockBox.java:674) at org.xhtmlrenderer.render.BlockBox.calcDimensions(BlockBox.java:628) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:763) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.layout.Layer.layoutAbsoluteChild(Layer.java:714) at org.xhtmlrenderer.layout.Layer.layoutAbsoluteChildren(Layer.java:687) at org.xhtmlrenderer.layout.Layer.finish(Layer.java:673) at org.xhtmlrenderer.layout.LayoutContext.popLayer(LayoutContext.java:231) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:844) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.layout.LayoutUtil.layoutFloated(LayoutUtil.java:79) at org.xhtmlrenderer.layout.InlineBoxing.processOutOfFlowContent(InlineBoxing.java:847) at org.xhtmlrenderer.layout.InlineBoxing.layoutContent(InlineBoxing.java:287) at org.xhtmlrenderer.render.BlockBox.layoutInlineChildren(BlockBox.java:938) at org.xhtmlrenderer.render.BlockBox.layoutChildren(BlockBox.java:919) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:802) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.layout.LayoutUtil.layoutFloated(LayoutUtil.java:79) at org.xhtmlrenderer.layout.InlineBoxing.processOutOfFlowContent(InlineBoxing.java:847) at org.xhtmlrenderer.layout.InlineBoxing.layoutContent(InlineBoxing.java:287) at org.xhtmlrenderer.render.BlockBox.layoutInlineChildren(BlockBox.java:938) at org.xhtmlrenderer.render.BlockBox.layoutChildren(BlockBox.java:919) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:802) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:293) at org.xhtmlrenderer.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:271) at org.xhtmlrenderer.layout.BlockBoxing.layoutContent(BlockBoxing.java:89) at org.xhtmlrenderer.render.BlockBox.layoutChildren(BlockBox.java:922) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:802) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:293) at org.xhtmlrenderer.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:271) at org.xhtmlrenderer.layout.BlockBoxing.layoutContent(BlockBoxing.java:89) at org.xhtmlrenderer.render.BlockBox.layoutChildren(BlockBox.java:922) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:802) at org.xhtmlrenderer.render.BlockBox.layout(BlockBox.java:732) at org.xhtmlrenderer.pdf.ITextRenderer.layout(ITextRenderer.java:209) at com.chsc.pdf.test.generate(test.java:56) at com.chsc.pdf.test.main(test.java:95)
进入源码后可以看到具体报错情况
原因:图片自身属性与jar内要求不一致,重新写入图片就可以了
在生成pdf前将html内图片重写
/** * 重写图片 * @param filePath 图片地址 * @throws IOException */ public static void rest(String filePath) throws IOException { File srcImageFileGood = new File(filePath); JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(filePath)); BufferedImage image = decoder.decodeAsBufferedImage(); ImageIO.write(image, "JPEG", srcImageFileGood); } /** * 获取页面内所有img * @param htmlStr * @return */ public static List<String> getImgSrc(String htmlStr) { String img = ""; Pattern p_image; Matcher m_image; List<String> pics = new ArrayList<String>(); Set<String> sets = new HashSet<String>(); String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>"; p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE); m_image = p_image.matcher(htmlStr); while (m_image.find()) { img = img + "," + m_image.group(); // Matcher m = // Pattern.compile("src=\"?(.*?)(\"|>|\\s+)").matcher(img); //匹配src Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img); while (m.find()) { if(m.group(1).startsWith("http")){ sets.add(m.group(1)); } } } pics.addAll(sets); return pics; }
参考地址 :https://blog.csdn.net/iteye_16625/article/details/81959115