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

posted @ 2020-07-10 16:16  不列颠剑圣  阅读(698)  评论(0编辑  收藏  举报