精华内容
下载资源
问答
  • java html转pdf

    2017-06-14 14:20:40
    java实现html文件转pdf文件 使用pd4ml 无水印 pd4m有点:对html文档格式要求低。 缺点:对某些css元素支持能力有限,比如css:thin 适用于样式简单的html转换
  • java html转pdf工具类

    2016-12-15 10:43:55
    html转pdf工具类,可以直接将html转换成pdf
  • JAVA HTML转pdf

    2016-07-11 17:43:33
    JAVA HTML转pdf,itext转换,已测试成功。所有需要jar已包括
  • 其中包含了:iText-2.0.8.jar和core-render.jar这两个jar包。 ITextRenderer cannot be resolved to a type 错误就是因为缺少core-render.jar这个jar包
  • java实现html转pdf,包含后端代码,html测试页面,pom依赖,jar包,如页面过于复杂需调整页面,有些样式itextpdf不支持,请寻找其它样式替换。
  • 实测真实可用,采用 core-renderer.jar ,iText-2.0.8.jar。开发环境为eclipse,用的话,可以修改下代码中的几个路径
  • html文件转换成pdf文件,并在指定位置添加印章图片
  • java后端实现html转pdf的工具类,pd4ml最新3100pro支持中文版本的jar包,无水印的,包括pd4ml.jar、fonts.jar和sc_css2.jar
  • 1.使用java代码调用压缩包内wkhtmltopdf.exe。 2.写入对应url及其其他参数 3.调用代码即可生成,亲测有效好用 4.内附示例代码
  • 使用itext快速方便的把html文件转为pdf文件,完美的支持中文
  • core-renderer-9176297.jar core-renderer-R8 (1).jar itext-asian-5.2.0.jar itextpdf-5.5.9.jar itext-pdfa-5.5.9.jar itext-xtra-5.5.9.jar xmlworker-5.5.9.jar 你要的jar 这里都有
  • JAVA实现PDF转HTML

    2020-10-29 16:53:08
    该包包含后端代码,转换控件,测试文件,正式项目应用表现正常,注意不能转换水印、印章这类特殊类型,且行且珍惜。
  • html转PDFjava版 )

    千次下载 热门讨论 2015-06-15 20:19:35
    html的规范要求极高,例如:页面中<mate></mate>必须闭合,必须: * * * <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" * ...
  • 最近项目要改做一个需求,需求内容就是做一个批量导出的pdf功能,没接触过,所以在网上搜了很多内容,也碰到很多坑,现在自己总结一下,方便以后项目碰到。 1、首先maven依赖选择 刚开是用的是flying-saucer-pdf,...

    最近项目要改做一个需求,需求内容就是做一个批量导出的pdf功能,没接触过,所以在网上搜了很多内容,也碰到很多坑,现在自己总结一下,方便以后项目碰到。

    1、首先maven依赖选择 刚开是用的是flying-saucer-pdf,但是其中碰到的问题是其中的getBBox问题,原生jar包会存在getBBox(I)问题,因为该依赖会下载flying-saucer-pdf,flying-saucer-core,还有自带的itext2.1.7jar包,导致报错,后来选择flying-saucer-pdf-itext5。

    2、因为客户端访问服务器的时候,如果你选择了文件夹导出,那么会导出在服务器端,而客户端不行,尤其是java的图形化界面JFileChooser,该控件慎重使用。所以后来把原来的开发改掉,现在使用生成pdf然后打包成zip下载。

    3、HTML内部中文与参数中文之间会出很大问题

    4、图片问题

    5、中文包问题iTextAsian问题 路径与iTextpdf包不同步

    最后经过一周的努力终于把整个的过程完成了,现在贴一个小demo。

    MAVEN依赖

              <dependency>
                 <groupId>org.xhtmlrenderer</groupId>
                 <artifactId>flying-saucer-pdf-itext5</artifactId>
                <version>9.1.6</version>
            </dependency>
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.23</version>
            </dependency>

    其中还有到了ant.jar,iText-2.0.8.jar,iTextAsian.jar

    https://download.csdn.net/download/u012832579/10652048 下载链接
    主代码

        @RequestMapping(value = "pdfExport",method =  RequestMethod.GET)
        public void pdfExport(@RequestParam(value = "ids") String ids,Model model,HttpServletRequest request,HttpServletResponse response) throws IOException, DocumentException{
    
            String filePath = customerTaskService.getWorkUrl() + "xwjys/src/main/Webapp/extjs/zip";
            //删除zip包
            File file=new File(filePath+ "/file.zip");
            if(file.exists()){
                file.delete(); 
            }
    
            String path = customerTaskService.getWorkUrl().replace('/', '\\') +"xwjys\\src\\main\\Webapp\\extjs\\zip\\file";
            //删除本地zip以及残余pdf
            customerTaskService.delAllFile(path); //删除完里面所有内容
            String[] idss = ids.split(",");
            System.out.println("生成本地pdf");
            for(String id:idss){
                Model models = getModel(Long.valueOf(id),model);
                customerTaskService.pdfExport(models,filePath,id);
            }
            System.out.println("打包zip进行下载");
            customerTaskService.zipDowload(filePath, request, response);
            System.out.println("下载成功");
        }

    以下代码对应主代码方法调用
    获取本地路径

        //获取项目绝对路径
        public String getWorkUrl(){
            String t=Thread.currentThread().getContextClassLoader().getResource("").getPath(); 
            int num=t.indexOf(".metadata");
            return t.substring(1,num);
        }

    删除上次生成的pdf

        public  boolean delAllFile(String path) {
            boolean flag = false;
            File file = new File(path);
            if (!file.exists()) {
              return flag;
            }
            if (!file.isDirectory()) {
              return flag;
            }
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
               if (path.endsWith(File.separator)) {
                  temp = new File(path + tempList[i]);
               } else {
                   temp = new File(path + File.separator + tempList[i]);
               }
               if (temp.isFile()) {
                  temp.delete();
               }
               if (temp.isDirectory()) {
                  delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件
                  flag = true;
               }
            }
            return flag;
          }

    HTML是一个模板,内容由自己的数据来填
    生成pdf的内容 主要是看自己需要什么,用model来 存、html来取 将数据放在url中,看类型取,在html中用el表达式取 比如这个界面用${grcode.xxx}

     model.addAttribute("qrcode", url);

    比如你也可以把model换成date,然后HTML中用${name}来获取中文

    Map<String,Object> data = new HashMap<String,Object>();
    data.put("name","小红");

    生成pdf 方法 pdfExport

        public void pdfExport(Model model,String filePath,String id)throws IOException {
            //模板
            String HTML = "template_freemarker_fs.html";
            //名称
            String resource = filePath + "/file/" + id +".pdf";
            String content = freeMarkerRender(model, HTML);
            this.createPdf(content, resource);
        }

    合并数据以及模板

        public String freeMarkerRender(Model data, String htmlTmp) {
            Writer out = new StringWriter();
            try {
                // 获取模板,并设置编码方式
                Configuration freemarkerCfg = new Configuration();
                String workUrl = getWorkUrl().replace('/', '\\');
                freemarkerCfg.setDirectoryForTemplateLoading(new File(workUrl+"xwjys\\src\\main\\webapp\\extjs\\templates"));
                freemarkerCfg.setDefaultEncoding("UTF-8");
                freemarkerCfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
                Template template = freemarkerCfg.getTemplate(htmlTmp);
                // 合并数据模型与模板
                template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
                out.flush();
                return out.toString();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            return null;
        }

    本快主要的就是将pdf生成,其中设计图片,图片是在html中,setBaseURL代表的是该图片的绝对路径xxx/src/main/webapp/extjs/images/,如果你还需要别的图片,如果是同级目录的那么直接在html中写该图片的名称

        public void createPdf(String content,String dest) throws IOException{
    
            File file = new File(dest);
            //建立数据输出通道
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ITextRenderer render = new ITextRenderer();
            // 创建字体解析器
            ITextFontResolver fontResolver = render.getFontResolver();
            // 设置字体
            try{
                fontResolver.addFont(getWorkUrl()+ "xwjys/src/main/webapp/extjs/templates/simsun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);         
            }catch(Exception e){
                 e.printStackTrace();
            }
            // 解析html生成pdf
            render.setDocumentFromString(content);
            // 解决图片相对路径的问题
    
            String myUrl = getWorkUrl();
            render.getSharedContext().setBaseURL("file:/"+myUrl+"xwjys/src/main/webapp/extjs/images/bg_bz01.jpg");  
            render.layout();
            try {
                render.createPDF(fileOutputStream);
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            fileOutputStream.flush();
            fileOutputStream.close();
    
        }

    这里写图片描述

    然后开始将该pdf打包成zip 并提供浏览器下载

       public void zipDowload(String filePath,HttpServletRequest request,HttpServletResponse response) throws IOException{
             //打包文件的存放路径                     
           ZipCompressorByAnt  zc = new  ZipCompressorByAnt(filePath+ "/file.zip");
            //需要打包的文件路径
           zc.compress(filePath+ "/file/");
    
           //开始下载
           String userAgent = request.getHeader("USER-AGENT");
           //判断浏览器代理并分别设置响应给浏览器的编码格式
           String finalFileName = null;
           String fileZip = "file.zip";
           if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent,"Trident")){//IE浏览器
               finalFileName = URLEncoder.encode(fileZip,"UTF8");
               System.out.println("IE浏览器");
           }else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
               finalFileName = new String(fileZip.getBytes(), "ISO8859-1");
           }else{
               finalFileName = URLEncoder.encode(fileZip,"UTF8");//其他浏览器
           }
           response.reset();  
           response.setContentType("application/x-octet-stream;charset=utf-8");
           response.setHeader("Content-Disposition" ,"attachment;filename=\"" +finalFileName+ "\"");//下载文件的名称
    
           ServletOutputStream servletOutputStream = null;
           try {
               servletOutputStream = response.getOutputStream();
           } catch (IOException e1) {
               // TODO Auto-generated catch block
               e1.printStackTrace();
           }
           DataOutputStream temps = new DataOutputStream(servletOutputStream);
    
           DataInputStream in = new DataInputStream(
                                   new FileInputStream(getWorkUrl().replace('/', '\\') +"xwjys\\src\\main\\Webapp\\extjs\\zip\\file.zip"));//浏览器下载文件的路径
           byte[] b = new byte[4096];
           try {
               while ( (in.read(b)) != -1) {
               temps.write(b);
           }
               temps.flush();
               response.getOutputStream().flush();
               if(response.getOutputStream()!=null) response.getOutputStream().close();
           } catch (Exception e) {
               e.printStackTrace();
           }finally{
               if(temps!=null) temps.close();
               if(in!=null) in.close();
               servletOutputStream.close();
           }
        }

    ZipCompressorByAnt .java

    package com.smarts.utils.fileupload;
    
    import java.io.File;
    
    import org.apache.tools.ant.Project;
    import org.apache.tools.ant.taskdefs.Zip;
    import org.apache.tools.ant.types.FileSet;
    
    public class ZipCompressorByAnt {
        private File zipFile;  
    
        public ZipCompressorByAnt(String pathName) {  
            zipFile = new File(pathName);  
        }  
    
        public void compress(String srcPathName) {  
            File srcdir = new File(srcPathName);  
            if (!srcdir.exists())  
                throw new RuntimeException(srcPathName + "不存在!");  
    
            Project prj = new Project();  
            Zip zip = new Zip();      
            zip.setProject(prj);  
            zip.setDestFile(zipFile);  
            FileSet fileSet = new FileSet();  
            fileSet.setProject(prj);
            fileSet.setDir(srcdir);  
            //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");  
            //fileSet.setExcludes(...); 排除哪些文件或文件夹  
            zip.addFileset(fileSet);            
            zip.execute();  
        }  
    
    }

    前台js部分代码

    var link= document.createElement('a');
            link.setAttribute("href", "../customertask/pdfExport?ids="+ids.toString());
            link.setAttribute("download", `file.zip`);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);

    template_freemarker_fs.html 支持换行,图片,中文

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta content="text/html; charset=UTF-8"/>
        <title>Title</title>
        <style>
            body{
                font-family:SimSun; 
            }
            .color{
                color: green;
            }
            .pos{
                position:absolute;
                left:200px;
                top:5px;
                width: 200px;
                font-size: 10px;
            }
        </style>
    </head>
    <body>
    <img src="bg_bz01.jpg" width="50px"/>
    <img src="bg_bz02.jpg" width="50px"/>
    <div class="color:red">
         <strong>您好</strong>,   ${curBillInfo.ypName}  中啊是个回复爱国阿三帅哥俺是个啊个啊个十大个十大伽师瓜的阿三个的撒搞定撒个的撒个撒个撒个啊
         个啊大哥 啊高大上搞定撒个
    </div>
    </body>
    </html>
    展开全文
  • java html转pdf 中文乱码

    千次阅读 2017-06-13 15:02:07
    网上关于 html生产pdfjava代码许多,我就不说了。主要是记录一下乱码问题的关键 1、html文件必须是utf-8编码格式的文件。 2、代码中的获取方式也是utf-8的格式。 3、其他的按照别人的教程编写

    网上关于 html生产pdf的java代码许多,我就不说了。主要是记录一下乱码问题的关键
    1、html文件必须是utf-8编码格式的文件。
    2、代码中的获取方式也是utf-8的格式。
    3、其他的按照别人的教程编写

    展开全文
  • Java实现HTML文件转PDF文件

    热门讨论 2013-11-22 08:45:16
    实现思路: 1、通过URL获取当前HMTL页面的内容: URL urls = new URL(url);...4、把设置发了的HTML文件转化成PDF文件 //把HTML文件转化成PDF文件 htmlToPdf2(urlsource, fileName); 下载下来可以直接使用
  • java html转pdf手动分页

    千次阅读 2018-02-02 15:40:43
    com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream...

    方法1:用com.lowagie

    引用jar包:

    compile group:'org.xhtmlrenderer',name:'core-renderer',version:'R8'

    compile group:'com.lowagie',name:'itext',version:'2.0.8' 

    (只能2.0.8版本,其他版本没有getCharBBox(char)方法,只有getCharBBox(int)方法)

    代码:

    import com.lowagie.text.DocumentException;

    import org.w3c.dom.Document;

    import org.xhtmlrenderer.pdf.ITextRenderer;

    import org.xml.sax.SAXException;

     

    import javax.xml.parsers.DocumentBuilder;

    import javax.xml.parsers.DocumentBuilderFactory;

    import javax.xml.parsers.ParserConfigurationException;

    import java.io.ByteArrayInputStream;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

     

     

    public classTest {

     

        public static voidmain(String[] args)

     throwsParserConfigurationException,IOException, SAXException, DocumentException {

            StringBuffer htmlString =new StringBuffer();

     

            htmlString.append("<html>");

            htmlString.append("<head><style>@page{}.pageNext{page-break-after:always;}</style></head>");

     

            htmlString.append("<body>");

            htmlString.append("<div>Hello</div>");

            htmlString.append("<divclass='pageNext'></div>");

            htmlString.append("<div>World</div>");

            htmlString.append("</body></html>");

     

            DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();

            Document doc = builder.parse(newByteArrayInputStream(htmlString.toString().getBytes()));

            ITextRenderer renderer =new ITextRenderer();

            renderer.setDocument(doc,null);

            renderer.layout();

            OutputStream out =new FileOutputStream("D://test.pdf");

            renderer.createPDF(out);

            out.close();

        }

    }

    方法2:用com.itextpdf

    引用jar包:

    compile('com.itextpdf:itextpdf:5.4.2')

    compile('com.itextpdf.tool:xmlworker:5.4.1'

    代码:
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.itextpdf.tool.xml.XMLWorkerFontProvider;
    import com.itextpdf.tool.xml.XMLWorkerHelper;
    import com.itextpdf.tool.xml.html.CssAppliers;
    import com.itextpdf.tool.xml.html.CssAppliersImpl;
    import com.itextpdf.tool.xml.html.Tags;
    import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;

    import java.io.ByteArrayInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.charset.Charset;

    public class Test {

       
    public static void main(String[] args)throws IOException,DocumentException {
            StringBuffer htmlString =
    new StringBuffer();
            htmlString.append(
    "<html>");
            htmlString.append(
    "<body>");
            htmlString.append(
    "<div>Hello</div>");
            htmlString.append(
    "<div style='page-break-before:always'>World</div>");
            htmlString.append(
    "</body></html>");

            Document document =
    new Document();
            PdfWriter writer = PdfWriter.getInstance(document,
    newFileOutputStream("D://test.pdf"));
            document.open();
            InputStream htmlInput =
    new ByteArrayInputStream(htmlString.toString().getBytes("UTF-8"));
           
    // 使用自定义的字体提供器,并将其设置为unicode字体样式
           
    FontsProvider fontProvider = new FontsProvider();
            fontProvider.addFontSubstitute(
    "lowagie","garamond");
            fontProvider.setUseUnicode(
    true);
            CssAppliers cssAppliers =
    new CssAppliersImpl(fontProvider);
            HtmlPipelineContext htmlContext =
    newHtmlPipelineContext(cssAppliers);
            htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
            XMLWorkerHelper.getInstance().getDefaultCssResolver(
    true);

           
    //解析html文件
      
    XMLWorkerHelper.getInstance().parseXHtml(writer,document, htmlInput,null, Charset.forName("UTF-8"), fontProvider);

           
    //关闭流
           
    document.close();
            writer.close();
        }

       
    /**
         *
    内部类,用于解决中文显示乱码问题
         */
       
    private static class FontsProviderextendsXMLWorkerFontProvider {

           
    /**
             *
    构造函数
             */
           
    public FontsProvider(){
               
    super(null,null);
            }

           
    /**
             *
    重载,获取自定义的字体
             *
             * @param
    fontName字体名称
             * @param
    encoding编码信息
             * @param
    size字体大小
             * @param
    style字体风格
             * @return Font
    自定义的字体
             */
           
    @Override
           
    public FontgetFont(finalString fontName, String encoding, float size,finalint style) {
                String fntname = fontName;
               
    if (fntname==null) {
                    fntname =
    "宋体";
                }
               
    if (size ==0) {
                    size =
    4;
                }
               
    return super.getFont(fntname,encoding, size, style);
            }
        }
    }

     


    展开全文
  • html转pdf插件

    2018-09-03 17:41:40
    通过url将页面转为pdf,使用说明见:https://blog.csdn.net/qq_21134557/article/details/82350686
  • html转pdf css控制

    2018-03-09 21:01:30
    html转pdf中css样式解析,解决解析样式出现异常问题,便于html转换为pdf
  • wkhtmltopdf-0.9.9 在linux环境下不依赖高版本的glibc,对glibc升级比较困难的小伙伴很实用
  • java html转pdf 换行使用插入字符

    千次阅读 2018-07-10 11:37:41
    package ... import java.awt.Color; import java.awt.Font; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

    package com.hopechart.common.util;


    import java.awt.Color;
    import java.awt.Font;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Map;


    import javax.servlet.http.HttpServletResponse;
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;










    import com.lowagie.text.DocumentException;
    import com.lowagie.text.pdf.BaseFont;


    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;


    public class GeneratePDFUtil {
    private static final String font = "ex/font/simsun.ttc"; // 字体样式存放路径


    private static Configuration $cfg = null; // 用于模版实例的创建以及缓存


    private static String realpath = ""; // 当前项目所在目录


    private static String encode = "gbk"; // 编码


    /**
    * 同步导出PDF
    * @param response
    * @param data pdf模板中需要的数据集合
    * @param path 导出pdf内容中图表图片的相对路径
    * @param pdfFileName 生成pdf文件名称
    * @param pdfTemplate EL表达式转换模板文件
    * @param dataTemplate PDF转换模板文件
    */
    public synchronized static void syncReportPDF(HttpServletResponse response,
    Map<String, Object> data, String path,String pdfFileName,String pdfTemplate,String dataTemplate) {
    //导出pdf内容中图表图片的相对路径
    realpath = path;
    // 最终输出文件
    String pdfFile = pdfFileName + ".pdf";
    // 动态获取linux和windows下的分隔符
    String separator = System.getProperty("file.separator");
    // 图片文件目录
    String imagePath = "file:///" + realpath + "images" + separator + "menu";

    String template = pdfTemplate;//"WEB-INF/tpl/test_pdf_template.html";
    // PDF转换模板文件
    String template2 = dataTemplate;//"WEB-INF/tpl/test_data_template.html";
    /*// EL表达式转换模板文件
    String template = "WEB-INF/tpl/pdf_template.html";
    // PDF转换模板文件
    String template2 = "WEB-INF/tpl/data_template.html";
    */
    // 格式化HTML
    formatHtml(data, template, template2);
    // 生成PDF
    createPDF(template2, pdfFile, imagePath);
    // 导出PDF
    reportFile(response, pdfFile, "application/pdf");
    }


    /**
    * 格式化HTML页面

    * @param data
    *            pdf文件的转速数据
    * @param template
    *            写好的模板文件
    * @param template2
    *            需要渲染模板文件
    */
    private static void formatHtml(Map<String, Object> data, String template,
    String template2) {
    //初始化FreeMarker配置,创建一个Configuration实例
    $cfg = new Configuration();
    // FileWriter writer = null;
    Writer out = null;
    try {
    //设置FreeMarker的模版文件位置 
    $cfg.setDirectoryForTemplateLoading(new File(realpath));
    //设置解码方式
    $cfg.setDefaultEncoding(encode);
    //使用Configuration实例来加载指定模板
    Template tpl = $cfg.getTemplate(template);
    //设置模板编码
    tpl.setEncoding(encode);
    File file = new File(realpath + template2);
    //新建输出,生成html文件
    out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(file), encode));
    //将数据模型中的值合并到模板文件中,并将结果输出到out中
    tpl.process(data, out);
    } catch (IOException e) {
    e.printStackTrace();
    } catch (TemplateException e) {
    e.printStackTrace();
    } finally {
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }


    /**
    * 生成pdf文件

    * @param template2
    *            导出模板文件
    * @param pdfFile
    *            pdf名称
    * @param imagePath
    *            pdf中图片的相对路径
    */
    private static void createPDF(String template2, String pdfFile,
    String imagePath) {
    StringBuffer html = new StringBuffer();
    BufferedReader reader = null;
    OutputStream os = null;
    try {
    //读取模板文件,并设置指定的编码
    reader = new BufferedReader(new InputStreamReader(
    new FileInputStream(realpath + template2), encode));
    String row = null;
    while ((row = reader.readLine()) != null) {//读取模板每一行
    html.append(row);
    }
    os = new FileOutputStream(realpath+pdfFile);
    //利用renderer来准备数据
    ITextRenderer renderer = new ITextRenderer();
    ITextFontResolver fontResolver = renderer.getFontResolver();
    //设置创建PDF的时候要用的字体,此字体必须要和pdf模板的字体保持一致
    fontResolver.addFont(realpath + font, BaseFont.IDENTITY_H,
    BaseFont.NOT_EMBEDDED);
    renderer.setDocumentFromString(html.toString());
    // 解决图片的相对路径问题
    renderer.getSharedContext().setBaseURL(imagePath);

    renderer.layout();
    renderer.createPDF(os);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (DocumentException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (reader != null) {
    try {
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (os != null) {
    try {
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }


    /**
    * 导出pdf文件
    * @param response
    * @param filename
    * @param type
    */
    public static void reportFile(HttpServletResponse response,
    String filename, String type) {
    // 创建file对象
    File file = new File(realpath+filename);
    // 设置response的编码方式
    response.setContentType(type);
    // 写明要下载的文件的大小
    response.setContentLength((int) file.length());
    OutputStream out = null;
    InputStream in = null;
    try {
    // 设置附加文件名
    filename = new String(filename.getBytes("GB2312"), "ISO_8859_1");
    response.setHeader("Content-Disposition", "attachment;filename="
    + filename);
    // 从response对象中得到输出流,准备下载
    out = response.getOutputStream();
    out = new BufferedOutputStream(out);
    in = new FileInputStream(file);
    int b = 0;
    byte[] buf = new byte[1024];
    while ((b = in.read(buf, 0, buf.length)) != -1) {
    out.write(buf, 0, b);
    }
    out.flush();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (out != null) {
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (in != null) {
    try {
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }


    /**
    * 使用JFreeChart生成报表

    * @param data 获取data指定类型的数据
    * @param tempPath 图片存放路径
    * @param tempPath 图片名称
    */
    public static void createChart(Map<String, Object> data, String tempPath,
    String fileName) {
    //生成的数据图表存放的路径
    realpath = tempPath;
    String path = realpath + "images/pdf/";
    //转速分布数据
    float[] carRevRate = (float[]) data.get("carRevRate");
    // 生成发动机转速分布图
    String[] carx = { "≤700", "≤800", "≤900", "≤1000", "≤1100", "≤1200",
    "≤1300", "≤1400", "≤1500", "≤1600", "≤1800", "≤2000", "≤2200",
    "≤2400", ">2400" };
    if (fileName != null) {//如果指定保存图片的名称则使用指定名称,用于页面显示
    saveAsFile(path + fileName, carx, carRevRate, new String[] {
    "发动机转速分布图", "发动机转速(r/min)", "百分比(%)" }, 11);
    } else {//否则使用默认图片名称,用于导出pdf文件
    saveAsFile(path + "chartBar.png", carx, carRevRate, new String[] {
    "发动机转速分布图", "发动机转速(r/min)", "百分比(%)" }, 11);
    }
    }


    /**
    * 生成JFreeChart,并保存为png图片

    * @param outputPath 图片保存路径
    * @param xText x轴上的刻度 
    * @param xValue 数据
    * @param params 数组[图表名称,横轴单位,纵轴单位]
    * @param fontSize 字体大小
    */
    public static void saveAsFile(String outputPath, String[] xText,
    float[] xValue, String[] params, int fontSize) {
    //创建CategoryDataset对象
    CategoryDataset dataset = createDataset(xText, xValue);
    //根据CategoryDataset生成JFreeChart对象
    JFreeChart chart = createJFreeChart(dataset, params[0], params[1],
    params[2], fontSize);
    FileOutputStream out = null;
    try {
    out = new FileOutputStream(outputPath);
    //保存为PNG文件
    ChartUtilities.writeChartAsPNG(out, chart, 950, 350);
    out.flush();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (out != null) {
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }


    /** 
    * 创建CategoryDataset对象

    * @param xText x轴上的刻度
    * @param xValue 数据
    */
    public static CategoryDataset createDataset(String[] xText, float[] xValue) {
    DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();
    for (int i = 0; i < xText.length; i++) {
    categoryDataset.addValue(xValue[i], "", xText[i]);
    }
    return categoryDataset;
    }


    /** 
    * 根据CategoryDataset生成JFreeChart对象

    * @param categoryDataset CategoryDatase对象
    * @param t 图表名称
    * @param x 横轴单位
    * @param y 纵轴单位
    * @param fontSize 字体大小
    */
    public static JFreeChart createJFreeChart(CategoryDataset categoryDataset,
    String t, String x, String y, int fontSize) {
    JFreeChart jfreechart = ChartFactory.createBarChart(t, x, y,
    categoryDataset, PlotOrientation.VERTICAL, true, false, false);


    TextTitle textTitle = jfreechart.getTitle();
    textTitle.setFont(new Font("宋体", Font.BOLD, 16));//标题


    CategoryPlot plot = jfreechart.getCategoryPlot();


    CategoryAxis domainAxis = plot.getDomainAxis();


    /*------设置X轴坐标上的文字-----------*/
    domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 9));


    /*------设置X轴的标题文字------------*/
    domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));


    NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();


    /*------设置Y轴坐标上的文字-----------*/
    numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN,10));


    /*------设置Y轴的标题文字------------*/
    numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));


    numberaxis.setLabelAngle(Math.PI / 2);
    //numberaxis.setVerticalTickLabels(true);
    //numberaxis.setUpperBound(100);
    //numberaxis.setLowerBound(0);
    //底端legend不显示
    jfreechart.getLegend().setVisible(false);
    //设置网格背景颜色
    plot.setBackgroundPaint(Color.white);
    //设置网格横线颜色
    plot.setRangeGridlinePaint(Color.pink);


    return jfreechart;
    }







     

    }

     

     

     

    数据模板

    test_data_template.html

    <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
    <html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
    <meta http-equiv='Content-Type' content='text/html; charset=gbk' />
    <title></title>
    <style type='text/css'>
    body {
    margin:0px  0px 0  10px;
    padding:0px;
    font-size: 12px;
    font-family: SimSun;
    }
    table{border-collapse:collapse; }
    .Tab{text-align:center;}
    .Tab td{text-align:center;}
    .Tab2{width:560px;height:310px; }
    .Tab2 td{text-align:center;width:54px;}
    .Tab3{table-layout:fixed;BORDER-BOTTOM:#ff39b1 2px solid;BORDER-RIGHT: #ff39b1 2px solid;BORDER-TOP:#ff39b1 2px solid;BORDER-LEFT:#ff39b1 2px solid;}
    .tab4 td{ width:90%; font-size:12px;}


    .fontC{
    font-family:宋体;
    font-size: 30px;
    font-weight: bold;
    }




    </style>
    </head>
    <body>
    <div style="height: 100%;width: 100%;margin-top: 0px;margin-left: 0px;">
    <div style="height: 510px;width: 100%;overflow: auto;">
    <div style="height: 50px;width: 100%;margin-top: 10px;">
    <!-- 标题头 -->

    <div align="center">
    <div style="float: left;font-size:30px;font-weight: bold;">故障单111111111111111</div>
    <div style="float: left;font-size:15px;">
    <div style="margin-top: 15px;">
    (待处理)
    </div>
    </div>
    </div>

    </div>

    </div>
    </div>
    </body>
    </html>

    pdf模板

    <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
    <html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
    <meta http-equiv='Content-Type' content='text/html; charset=gbk' />
    <title></title>
    <style type='text/css'>
    body {
    margin:0px  0px 0  10px;
    padding:0px;
    font-size: 12px;
    font-family: SimSun;
    }
    table{border-collapse:collapse; }
    .Tab{text-align:center;}
    .Tab td{text-align:center;}
    .Tab2{width:560px;height:310px; }
    .Tab2 td{text-align:center;width:54px;}
    .Tab3{table-layout:fixed;BORDER-BOTTOM:#ff39b1 2px solid;BORDER-RIGHT: #ff39b1 2px solid;BORDER-TOP:#ff39b1 2px solid;BORDER-LEFT:#ff39b1 2px solid;}
    .tab4 td{ width:90%; font-size:12px;}


    .fontC{
    font-family:宋体;
    font-size: 30px;
    font-weight: bold;
    }




    </style>
    </head>
    <body>
    <div style="height: 100%;width: 100%;margin-top: 0px;margin-left: 0px;">
    <div style="height: 510px;width: 100%;overflow: auto;">
    <div style="height: 50px;width: 100%;margin-top: 10px;">
    <!-- 标题头 -->

    <div align="center">
    <div style="float: left;font-size:30px;font-weight: bold;">445678941</div>
    <div style="float: left;font-size:15px;">
    <div style="margin-top: 15px;">
    (${transfer.countNum})
    </div>
    </div>
    </div>

    </div>
    <!-- 判断为空如果为空则不显示  有数值则显示 -->
    ${transfer.onlineNum!''}






    </div>
    </div>
    </body>
    </html>

     

     

     

     

     

     

    代码解决换行问题代码调用插入分行字符

    /**
         * 插入方法
         * 
         * @param num
         *            每隔几个字符插入一个字符串(中文字符)
         * @param splitStr
         *            待指定字符串
         * @param str
         *            原字符串
         * @return 插入指定字符串之后的字符串
         * @throws UnsupportedEncodingException
         */
        public static String addStr(int num, String splitStr, String str) throws UnsupportedEncodingException {
            StringBuffer sb = new StringBuffer();
            String temp = str;

            int len = str.length();
            while (len > 0) {
                int idx = getEndIndex(temp, num);
                sb.append(temp.substring(0, idx + 1)).append(splitStr);
                temp = temp.substring(idx + 1);
                len = temp.length();
            }

            return sb.toString();
        }

        /**
         * 两个数字/英文
         * 
         * @param str
         *            字符串
         * @param num
         *            每隔几个字符插入一个字符串
         * @return int 最终索引
         * @throws UnsupportedEncodingException
         */
        public static int getEndIndex(String str, double num) throws UnsupportedEncodingException {
            int idx = 0;
            double val = 0.00;
            // 判断是否是英文/中文
            for (int i = 0; i < str.length(); i++) {
                if (String.valueOf(str.charAt(i)).getBytes("UTF-8").length >= 3) {
                    // 中文字符或符号
                    val += 1.00;
                } else {
                    // 英文字符或符号
                    val += 0.50;
                }
                if (val >= num) {
                    idx = i;
                    if (val - num == 0.5) {
                        idx = i - 1;
                    }
                    break;
                }
            }
            if (idx == 0) {
                idx = str.length() - 1;
            }
            return idx;
        }

    展开全文
  • HTML转pdf工具类

    2018-07-28 13:22:38
    pd4ml转pdf实用性好,支持解决中文乱码问题,对HTML的要求不是太严。
  • java word转pdfhtml

    2018-11-16 11:48:48
    利用poi 把office转化为html,利用jacob把office转化为pdfhtml
  • 如何解决Java运用ITextRenderer将html转pdf 英文单词过长不换行问题??
  • java pdf转html

    2019-08-12 01:48:58
    NULL 博文链接:https://wu1g119.iteye.com/blog/2281017
  • 搜索了好多篇例子,算是强拼硬凑成现在的样子,还算比较满意吧。 此包中包含可测试成功代码,关联模板、字体文件、jar等 希望能帮助到大家。 这篇文章的作者蛮厉害,有不少借鉴。 ...
  • java html转pdf pd4ml

    热门讨论 2012-04-25 17:26:33
    用pd4ml将html文件pdf文件,保留html的css样式。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,799
精华内容 34,319
关键字:

java的html转pdf

java 订阅