zoukankan      html  css  js  c++  java
  • 解决iText2.0.8+freemark导出pdf不支持base64的解决办法

    转换工具类

    public class B64ImgReplacedElementFactory implements ReplacedElementFactory {  
      
        /** 
         * 实现createReplacedElement 替换html中的Img标签 
         *  
         * @param c 上下文 
         * @param box 盒子 
         * @param uac 回调 
         * @param cssWidth css宽 
         * @param cssHeight css高 
         * @return ReplacedElement 
         */  
        public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,  
                int cssWidth, int cssHeight) {  
            Element e = box.getElement();  
            if (e == null) {  
                return null;  
            }  
            String nodeName = e.getNodeName();  
            // 找到img标签  
            if (nodeName.equals("img")) {  
                String attribute = e.getAttribute("src");  
                FSImage fsImage;  
                try {  
                    // 生成itext图像  
                    fsImage = buildImage(attribute, uac);  
                } catch (BadElementException e1) {  
                    fsImage = null;  
                } catch (IOException e1) {  
                    fsImage = null;  
                }  
                if (fsImage != null) {  
                    // 对图像进行缩放  
                    if (cssWidth != -1 || cssHeight != -1) {  
                        fsImage.scale(cssWidth, cssHeight);  
                    }  
                    return new ITextImageElement(fsImage);  
                }  
            }  
      
            return null;  
        }  
      
        /** 
         * 将base64编码解码并生成itext图像 
         *  
         * @param srcAttr 属性 
         * @param uac 回调 
         * @return FSImage 
         * @throws IOException io异常 
         * @throws BadElementException BadElementException 
         */  
        protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,  
                BadElementException {  
            FSImage fsImage;  
            if (srcAttr.startsWith("data:image/")) {  
                String b64encoded = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(),  
                        srcAttr.length());  
                // 解码  
                byte[] decodedBytes = Base64.decode(b64encoded);  
      
                fsImage = new ITextFSImage(Image.getInstance(decodedBytes));  
            } else {  
                fsImage = uac.getImageResource(srcAttr).getImage();  
            }  
            return fsImage;  
        }  
      
        /** 
         * 实现remove 
         *  
         * @param e 元素 
         */  
        public void remove(Element e) {  
        }  
      
        /** 
         * 实现reset 
         */  
        public void reset() {  
        }  
      
        /** 
         * 实现setFormSubmissionListener 
         *  
         * @param formsubmissionlistener 监听 
         */  
        public void setFormSubmissionListener(FormSubmissionListener formsubmissionlistener) {  
        }  
    }  
    ITextRenderer 调用转换工具类
    ITextRenderer renderer = new ITextRenderer();  
    SharedContext sharedContext = renderer.getSharedContext();  
    // 解决base64图片支持问题  
    sharedContext.setReplacedElementFactory(new B64ImgReplacedElementFactory());  
    sharedContext.getTextRenderer().setSmoothingThreshold(0);  
    renderer.setDocumentFromString(strFileContent);  

     原文地址:http://blog.csdn.net/rangerkriby/article/details/17439705

  • 相关阅读:
    类数组对象与arguments
    bind的模拟实现
    new的模拟实现
    call和apply的模拟实现
    参数按值传递
    闭包
    执行上下文
    ECMAScript规范解读this
    缓存使用-8、redis的缓存穿透和缓存雪崩
    缓存使用-7、Redis 为什么是单线程的
  • 原文地址:https://www.cnblogs.com/oskyhg/p/7256323.html
Copyright © 2011-2022 走看看