精华内容
下载资源
问答
  • 而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML...
  • java 实现html模板导出pdf的方式

    千次阅读 2013-12-14 13:27:22
    要把HTML页面转换成PDF或者tiff图片等其他形式,目前tiff还是一头雾水,如果各位大师有真的可行的想法(不要是别人那边抄的,百度最近搜索的质量严重的打击了我对国货的信心。)希望能够告诉我,先谢了。 言归正传。...

    http://www.open-open.com/lib/view/open1341881830588.html

    最近在工作中遇到了一个很囧的事情。要把HTML页面转换成PDF或者tiff图片等其他形式,目前tiff还是一头雾水,如果各位大师有真的可行的想法(不要是别人那边抄的,百度最近搜索的质量严重的打击了我对国货的信心。)希望能够告诉我,先谢了。
    言归正传。所以,我就做了把HTML转换成PDF的形式。目前可以完美支持一比一转换,下面就把我的解决方案贴出来。
    首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML页面或者懒得写FreeMarker模板的话。可以直接看下一段。
    由于他们已经写好了HTML页面,而且显示已经很完美了。那我要做的就是能完美解析HTML+CSS的PDF生成工具。这时候flying-saucer进入了我的选择范围中。
    http://code.google.com/p/flying-saucer/
    上面是网址,这个工具托管在GoogleCode上面,作者做他们能够做下面的工作:
    Flying Saucer takes XML or XHTML and applies CSS 2.1-compliant stylesheets to it, in order to render to PDF (via iText), images, and on-screen using Swing or SWT。
    不难看出工作原理,就是解析XML或者XHTML并且包括css样式表,并且用Swing或者SWT的组件生成PDF的功能。这解决了页面的显示问题。IText自身的一个很严重的问题就是解析CSS有很大的问题。而这个解决了。下面就是用Flying Saucer来实现的代码:

    01 public boolean convertHtmlToPdf(String inputFile, String outputFile)
    02     throws Exception {
    03          
    04         OutputStream os = new FileOutputStream(outputFile);    
    05         ITextRenderer renderer = new ITextRenderer();    
    06         String url = new File(inputFile).toURI().toURL().toString();
    07         
    08         renderer.setDocument(url);  
    09          
    10         // 解决中文支持问题    
    11         ITextFontResolver fontResolver = renderer.getFontResolver();   
    12         fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);    
    13         //解决图片的相对路径问题
    14         renderer.getSharedContext().setBaseURL("file:/D:/");
    15         renderer.layout();   
    16         renderer.createPDF(os); 
    17          
    18         os.flush();
    19         os.close();
    20         return true;
    21     }

    上面这段代码是这样的,输入一个HTML地址URL = inputFile,输入一个要输出的地址,就可以在输出的PDF地址中生成这个PDF。

    注意事项:

    1.输入的HTML页面必须是标准的XHTML页面。页面的顶上必须是这样的格式:

    1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2 <html xmlns="http://www.w3.org/1999/xhtml">


    并且HTML页面的语法必须是非常严谨的,所有标签都必须闭合等等(由于flying-Saucer做了XML解析的工作,不严谨会报错的。),这是对页面的第一个要求。

    2.要用到图片的地方写相对路径的形式,比如:

    1 <img src="a.jpg" alt="323" width="252" height="80" />

    而它的图片位置则必须在Java代码中指定。

    renderer.getSharedContext().setBaseURL("file:/D:/");

    也有另一种方法就是直接在<img>标签中写绝对路径。

    3.Flying-Saucer在解析tiff格式的图片的时候会报错。具体原因我还没找到。希望大家能够指点我。

    4.如果在页面中有中文字体的话。必须在HTML代码中的样式中写上某种字体的css,并且必须是用英文的,然后在Java代码中写上对应的文件位置。

    ITextFontResolver fontResolver = renderer.getFontResolver();

               fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

    上面的方法是添加了宋体。也可以添加其他字体。

    以上就是解决方案。

    下面给出这几个包的下载地址。大家可以直接下载。


    下载地址,猛点我吧!

    http://blog.sina.com.cn/s/blog_59d6717c0100p7xr.html   一个现成的例子,可能跟更加 简单明了


    http://huangronaldo.iteye.com/blog/1555917  资料比较全面


    展开全文
  • Java实现HTML页面转PDF(iText+FreeMarker)

    千次阅读 2019-01-11 16:11:38
    Java实现HTML页面转PDF(iText+FreeMarker) 由于需求需要,但是又不会操作,从网上找了一大堆,都发现有点坑,可能我这份也有点坑,但是希望能给你一个思路。 一开始找的是word模板----&gt;word----&gt;pdf,...

    Java实现HTML页面转PDF(iText+FreeMarker)

    由于需求需要,但是又不会操作,从网上找了一大堆,都发现有点坑,可能我这份也有点坑,但是希望能给你一个思路。
    一开始找的是word模板---->word---->pdf,走完流程步,发现最后下载的是pdf版的xml文件
    找了很多方法,发现都没什么解决方式
    OpenOffice 是无效的,其他的没测试
    如果本来是word文档就能转换成pdf

    • 中文重叠不换行问题:设置字体大小

    • 参考项目 ,忘了是从那个大佬哪里找到的,基于这个项目做了些修改调整

    • 这个项目是无bug的版本,但是不满足我司的复杂需求

    实现流程

    • 写好word文档,图片放到服务器上
    • 将word转成html 推荐地址
    • 修改html头部代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta name="generator" content="Aspose.Words for .NET 15.1.0.0" />
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    </head>
    
    • 数据替换
    <tr style="height:10.35pt">
         <td style="padding-left:5.4pt; padding-right:5.4pt; vertical-align:top">
             <p style="font-size:10.5pt; line-height:120%; margin:0pt; orphans:0; widows:0">
                 <span style="font-family:微软雅黑; font-size:10.5pt">性别:${gender}</span>
             </p>
         </td>
         <td style="padding-left:5.4pt; padding-right:5.4pt; vertical-align:top">
             <p style="font-size:10.5pt; line-height:120%; margin:0pt 3.25pt 0pt 0pt; orphans:0; widows:0">
                 <span style="font-family:微软雅黑; font-size:10.5pt">年龄:${age}岁</span>
             </p>
         </td>
         <td colspan="2" style="padding-left:5.4pt; padding-right:5.4pt; vertical-align:top">
             <p style="font-size:10.5pt; line-height:120%; margin:0pt; orphans:0; widows:0">
                 <span style="font-family:微软雅黑; font-size:10.5pt">所在城市:${city}</span>
             </p>
         </td>
     </tr>
    

    注意事项

    • 所有的html标签都要有结束标签 例如 img 要加 /
    • 使用上面word转成html 会自动添加

    引入依赖

    <!--pdf生成工具类-->
     <!--pdf生成 itext-->
     <dependency>
         <groupId>com.itextpdf</groupId>
         <artifactId>itextpdf</artifactId>
         <version>5.4.2</version>
     </dependency>
     <dependency>
         <groupId>com.itextpdf.tool</groupId>
         <artifactId>xmlworker</artifactId>
         <version>5.4.1</version>
     </dependency>
     <dependency>
         <groupId>com.itextpdf</groupId>
         <artifactId>itext-asian</artifactId>
         <version>5.2.0</version>
     </dependency>
     <dependency>
         <groupId>org.xhtmlrenderer</groupId>
         <artifactId>flying-saucer-pdf</artifactId>
         <version>9.0.3</version>
     </dependency>
     <dependency>
         <groupId>be.jacobsvanroy</groupId>
         <artifactId>spring-sql-unit</artifactId>
         <version>0.8</version>
     </dependency>
    

    代码

    import com.itextpdf.text.Document;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.itextpdf.tool.xml.XMLWorkerHelper;
    import lombok.extern.slf4j.Slf4j;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    public class PdfUtils {
    	/**
         * 生成PDF到输出流中(ServletOutputStream用于下载PDF)
         *
         * @param ftlPath  ftl模板文件的路径(不含文件名)
         * @param data     输入到FTL中的数据
         * @param response HttpServletResponse
         * @return
         */
        public static void exportToResponse(String ftlPath, Object data, String title,
                                            HttpServletResponse response) {
            String html = FreeMarkerUtil.getContent(ftlPath, data);
            String pdf = title + ".pdf";
            File file = null;
            InputStream fin;
            try {
                file = HtmlToPDF(html, pdf);
                fin = new FileInputStream(file);
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/pdf");
                // 设置浏览器以下载的方式处理该文件名
                String fileName = title + ".pdf";
                response.setHeader("Content-Disposition", "attachment;filename="
                        .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
                OutputStream out = response.getOutputStream();
                // 缓冲区
                byte[] buffer = new byte[512];
                int bytesToRead;
                // 通过循环将读入的Word文件的内容输出到浏览器中
                while ((bytesToRead = fin.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                if (file != null) {
                    // 删除临时文件
                    file.delete();
                }
            }
        }
        /**
         * html转pdf
         *
         * @param html
         * @param pdf
         * @return
         */
        public static File HtmlToPDF(String html, String pdf) {
            File file = new File(pdf);
            try {
                Document document = new Document(PageSize.LETTER);
                PdfWriter pdfWriter = PdfWriter.getInstance(document,
                        new FileOutputStream(pdf));
                document.open();
    
                XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
                worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(html.getBytes()), null, new AsianFontProvider());
                document.close();
            } catch (
                    Exception e) {
                e.printStackTrace();
            }
            return file;
        }
      }
    
    • 字体设置
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.tool.xml.XMLWorkerFontProvider;
    
    public class AsianFontProvider extends XMLWorkerFontProvider {
    
        @Override
        public Font getFont(final String fontname, final String encoding,
                            final boolean embedded, final float size, final int style,
                            final BaseColor color) {
            BaseFont bf = null;
            try {
                bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Font font = new Font(bf, size, style, color);
            font.setColor(color);
            return font;
        }
    }
    
    • 加载模板
    package info.yuying.utils.pdf;
    
    import com.google.common.collect.Maps;
    import freemarker.cache.FileTemplateLoader;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateExceptionHandler;
    import org.apache.commons.lang.StringUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.Map;
    
    public class FreeMarkerUtil {
    
        private static final String WINDOWS_SPLIT = "\\";
    
        private static final String UTF_8 = "UTF-8";
    
        private static Map<String, FileTemplateLoader> fileTemplateLoaderCache = Maps.newConcurrentMap();
    
        private static Map<String, Configuration> configurationCache = Maps.newConcurrentMap();
    
        public static Configuration getConfiguration(String templateFilePath) {
            if (null != configurationCache.get(templateFilePath)) {
                return configurationCache.get(templateFilePath);
            }
            Configuration config = new Configuration(Configuration.VERSION_2_3_25);
            config.setDefaultEncoding(UTF_8);
            config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            config.setLogTemplateExceptions(false);
            FileTemplateLoader fileTemplateLoader = null;
            if (null != fileTemplateLoaderCache.get(templateFilePath)) {
                fileTemplateLoader = fileTemplateLoaderCache.get(templateFilePath);
            }
            try {
                fileTemplateLoader = new FileTemplateLoader(new File(templateFilePath));
                fileTemplateLoaderCache.put(templateFilePath, fileTemplateLoader);
            } catch (IOException e) {
                e.printStackTrace();
            }
            config.setTemplateLoader(fileTemplateLoader);
            configurationCache.put(templateFilePath, config);
            return config;
    
        }
    
    
        /**
         * @description 获取模板
         */
        public static String getContent(String fileName, Object data) {
            String templatePath = getPDFTemplatePath(fileName);
            String templateFileName = getTemplateName(templatePath);
            String templateFilePath = getTemplatePath(templatePath);
            if (StringUtils.isEmpty(templatePath)) {
                return "templatePath can not be empty!";
            }
            try {
                Template template = getConfiguration(templateFilePath).getTemplate(templateFileName);
                StringWriter writer = new StringWriter();
                template.process(data, writer);
                writer.flush();
                return writer.toString();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }
    
    
        private static String getTemplatePath(String templatePath) {
            if (StringUtils.isEmpty(templatePath)) {
                return "";
            }
            if (templatePath.contains(WINDOWS_SPLIT)) {
                return templatePath.substring(0, templatePath.lastIndexOf(WINDOWS_SPLIT));
            }
            return templatePath.substring(0, templatePath.lastIndexOf("/"));
        }
    
        private static String getTemplateName(String templatePath) {
            if (StringUtils.isEmpty(templatePath)) {
                return "";
            }
            if (templatePath.contains(WINDOWS_SPLIT)) {
                return templatePath.substring(templatePath.lastIndexOf(WINDOWS_SPLIT) + 1);
            }
            return templatePath.substring(templatePath.lastIndexOf("/") + 1);
        }
    
        /**
         * @param fileName PDF文件名    (hello.pdf)
         * @return 匹配到的模板名
         * @description 获取PDF的模板路径,
         * 默认按照PDF文件名匹对应模板
         */
        public static String getPDFTemplatePath(String fileName) {
            String classpath = PdfUtils.class.getClassLoader().getResource("").getPath();
            //模板存放位置
            String templatePath = classpath + "/templates";
            File file = new File(templatePath);
            if (!file.isDirectory()) {
                return "PDF模板文件不存在,请检查templates文件夹!";
            }
            String pdfFileName = fileName.substring(0, fileName.lastIndexOf("."));
            File defaultTemplate = null;
            File matchTemplate = null;
            for (File f : file.listFiles()) {
                if (!f.isFile()) {
                    continue;
                }
                String templateName = f.getName();
                if (templateName.lastIndexOf(".ftl") == -1) {
                    continue;
                }
                if (defaultTemplate == null) {
                    defaultTemplate = f;
                }
                if (StringUtils.isEmpty(fileName) && defaultTemplate != null) {
                    break;
                }
                templateName = templateName.substring(0, templateName.lastIndexOf("."));
                if (templateName.toLowerCase().equals(pdfFileName.toLowerCase())) {
                    matchTemplate = f;
                    break;
                }
            }
            if (matchTemplate != null) {
                return matchTemplate.getAbsolutePath();
            }
            if (defaultTemplate != null) {
                return defaultTemplate.getAbsolutePath();
            }
            return null;
        }
    }
    
    
    展开全文
  • 将其文件对应的转换成HTML文件,以便在网页上能够浏览学习 下边主要针对word,pdf和txt文本文件进行转换 一:Java实现将word转换为html 1:引入依赖 fr.opensagres.xdocreport fr.opensagres.xdocreport.document 1.0.5...
    19da6439395ea75beef6531fa1294101.png

    引言:

    最近公司在做一个教育培训学习及在线考试的项目,本人主要从事网络课程模块,主要做课程分类,课程,课件的创建及在线学习和统计的功能,因为课件涉及到多种类型,像视频,音频,图文,外部链接及文档类型.其中就涉及到一个问题,就是文档型课件课程在网页上的展示和学习问题,因为要在线统计学习的课程,学习的人员,学习的时长,所以不能像传统做法将文档下载到本地学习,那样就不受系统控制了,所以最终的方案是,在上传文档型课件的时候,将其文件对应的转换成HTML文件,以便在网页上能够浏览学习

    下边主要针对word,pdf和txt文本文件进行转换


    一:Java实现将word转换为html

    1:引入依赖

    fr.opensagres.xdocreport  fr.opensagres.xdocreport.document  1.0.5fr.opensagres.xdocreport   org.apache.poi.xwpf.converter.xhtml   1.0.5org.apache.poi  poi  3.12org.apache.poi  poi-scratchpad  3.12

    2:代码demo

    package com.svse.controller;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.converter.PicturesManager;import org.apache.poi.hwpf.converter.WordToHtmlConverter;import org.apache.poi.hwpf.usermodel.PictureType;import org.apache.poi.xwpf.converter.core.BasicURIResolver;import org.apache.poi.xwpf.converter.core.FileImageExtractor;import org.apache.poi.xwpf.converter.core.FileURIResolver;import org.apache.poi.xwpf.converter.core.IURIResolver;import org.apache.poi.xwpf.converter.core.IXWPFConverter;import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;import org.apache.poi.xwpf.usermodel.XWPFDocument;/** * word 转换成html */public class TestWordToHtml {    public static  final String STORAGEPATH="C://works//files//";    public static  final String IP="192.168.30.222";    public static  final String PORT="8010";    public static void main(String[] args) throws IOException, TransformerException, ParserConfigurationException {        TestWordToHtml wt=new TestWordToHtml();        //wt.Word2003ToHtml("甲骨文考证.doc");        wt.Word2007ToHtml("甲骨文考证.docx");    }           /**     * 2003版本word转换成html     * @throws IOException     * @throws TransformerException     * @throws ParserConfigurationException     */    public void Word2003ToHtml(String fileName) throws IOException, TransformerException, ParserConfigurationException {               final String imagepath = STORAGEPATH+"fileImage/";//解析时候如果doc文件中有图片  图片会保存在此路径        final String strRanString=getRandomNum();        String filepath =STORAGEPATH;        String htmlName =fileName.substring(0, fileName.indexOf("."))+ "2003.html";        final String file = filepath + fileName;        InputStream input = new FileInputStream(new File(file));        HWPFDocument wordDocument = new HWPFDocument(input);        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());        //设置图片存放的位置        wordToHtmlConverter.setPicturesManager(new PicturesManager() {            public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {                File imgPath = new File(imagepath);                if(!imgPath.exists()){//图片目录不存在则创建                    imgPath.mkdirs();                }                                File file = new File(imagepath +strRanString+suggestedName);                try {                    OutputStream os = new FileOutputStream(file);                    os.write(content);                    os.close();                } catch (FileNotFoundException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }                                return  "http://"+IP+":"+PORT+"//uploadFile/fileImage/"+strRanString+suggestedName;               // return imagepath +strRanString+suggestedName;            }        });                //解析word文档        wordToHtmlConverter.processDocument(wordDocument);        Document htmlDocument = wordToHtmlConverter.getDocument();                File htmlFile = new File(filepath +strRanString+htmlName);        OutputStream outStream = new FileOutputStream(htmlFile);                DOMSource domSource = new DOMSource(htmlDocument);        StreamResult streamResult = new StreamResult(outStream);        TransformerFactory factory = TransformerFactory.newInstance();        Transformer serializer = factory.newTransformer();        serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");        serializer.setOutputProperty(OutputKeys.INDENT, "yes");        serializer.setOutputProperty(OutputKeys.METHOD, "html");                serializer.transform(domSource, streamResult);        outStream.close();                System.out.println("生成html文件路径:"+ "http://"+IP+":"+PORT+"//uploadFile/"+strRanString+htmlName);    }    /**     * 2007版本word转换成html     * @throws IOException     */    public void Word2007ToHtml(String fileName) throws IOException {               final String strRanString=getRandomNum();                String filepath = STORAGEPATH+strRanString;        String htmlName =fileName.substring(0, fileName.indexOf("."))+ "2007.html";        File f = new File(STORAGEPATH+fileName);          if (!f.exists()) {              System.out.println("Sorry File does not Exists!");          } else {              if (f.getName().endsWith(".docx") || f.getName().endsWith(".DOCX")) {                  try {                    // 1) 加载word文档生成 XWPFDocument对象                      InputStream in = new FileInputStream(f);                      XWPFDocument document = new XWPFDocument(in);                            // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录)                      File imageFolderFile = new File(filepath);                      XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile));                      options.setExtractor(new FileImageExtractor(imageFolderFile));                      options.URIResolver(new IURIResolver() {                        public String resolve(String uri) {                            //http://192.168.30.222:8010//uploadFile/....                            return "http://"+IP+":"+PORT+"//uploadFile/"+strRanString +"/"+ uri;                        }                    });                                        options.setIgnoreStylesIfUnused(false);                      options.setFragment(true);                                            // 3) 将 XWPFDocument转换成XHTML                      OutputStream out = new FileOutputStream(new File(filepath + htmlName));                      IXWPFConverter converter = XHTMLConverter.getInstance();                    converter.convert(document,out, options);                    //XHTMLConverter.getInstance().convert(document, out, options);                      System.out.println("html路径:"+"http://"+IP+":"+PORT+"//uploadFile/"+strRanString+htmlName);                } catch (Exception e) {                    e.printStackTrace();                }                        } else {                  System.out.println("Enter only MS Office 2007+ files");              }          }      }       /**     *功能说明:生成时间戳     *创建人:zsq     *创建时间:2019年12月7日 下午2:37:09     *     */     public static String getRandomNum(){         Date dt = new Date();         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");           String str=sdf.format(dt);         return str;     }        }


    二:Java实现将Pdf转换为html
    1: 引入依赖

    net.sf.cssbox            pdf2dom            1.7org.apache.pdfbox            pdfbox            2.0.12org.apache.pdfbox            pdfbox-tools            2.0.12

    2:代码Demo

    public class PdfToHtml {  /*    pdf转换html     */    public void pdfToHtmlTest(String inPdfPath,String outputHtmlPath)  {       // String outputPath = "C:worksfilesZSQ保密知识测试题库.html";    9        //try() 写在()里面会自动关闭流        try{            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outputHtmlPath)),"utf-8"));            //加载PDF文档            //PDDocument document = PDDocument.load(bytes);            PDDocument document = PDDocument.load(new File(inPdfPath));            PDFDomTree pdfDomTree = new PDFDomTree();            pdfDomTree.writeText(document,out);        } catch (Exception e) {            e.printStackTrace();        }    }    public static void main(String[] args) throws IOException {        PdfToHtml ph=new PdfToHtml();        String pdfPath="C:worksfiles武研中心行政考勤制度.pdf";        String outputPath="C:worksfiles武研中心行政考勤制度.html";        ph.pdfToHtmlTest(pdfPath,outputPath);  }}


    三:Java实现将TXT转换为html

    /*     * txt文档转html       filePath:txt原文件路径       htmlPosition:转化后生成的html路径    */    public static void txtToHtml(String filePath, String htmlPosition) {        try {            //String encoding = "GBK";            File file = new File(filePath);            if (file.isFile() && file.exists()) { // 判断文件是否存在                InputStreamReader read = new InputStreamReader(new FileInputStream(file), "GBK");                // 考虑到编码格式                BufferedReader bufferedReader = new BufferedReader(read);                // 写文件                FileOutputStream fos = new FileOutputStream(new File(htmlPosition));                OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");                BufferedWriter bw = new BufferedWriter(osw);                String lineTxt = null;                while ((lineTxt = bufferedReader.readLine()) != null) {                    bw.write("   "+lineTxt + "");                }                bw.close();                osw.close();                fos.close();                read.close();            } else {                System.out.println("找不到指定的文件");            }        } catch (Exception e) {            System.out.println("读取文件内容出错");            e.printStackTrace();        }    }

    作者:zsq_fengchen

    原文网址:https://www.cnblogs.com/zhaosq/p/12069087.html

    来源:博客园

    展开全文
  • java html转pdf

    2019-08-16 13:54:54
    项目需要实现自定义pdf模板,上网找了些资料实现了这个功能 参考文档: https://my.oschina.net/960823/blog/1588166 https://my.oschina.net/u/3557716/blog/3023788/print maven依赖: <dependency>...

    项目需要实现自定义pdf模板,上网找了些资料实现了这个功能

    参考文档:

    https://my.oschina.net/960823/blog/1588166

    https://my.oschina.net/u/3557716/blog/3023788/print

     

    maven依赖:

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.9</version>
    </dependency>
    
    <dependency>
        <groupId>org.xhtmlrenderer</groupId>
        <artifactId>flying-saucer-pdf-itext5</artifactId>
        <version>9.0.3</version>
    </dependency>

    PdfUtil.java

    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    
    import com.alibaba.fastjson.JSONObject;
    import com.itextpdf.text.pdf.BaseFont;
    
    /***
     * pdf工具类
     */
    public class PdfUtil {
    	/**
    	 * 将HTML转成PD格式的文件。html文件的格式比较严格
    	 * @param body body内容
    	 * @param os 输出流
    	 * @throws Exception
    	 */
    	public static void convertHtmlToPdf(String body, OutputStream os) throws Exception {
    		body = filterHtml(body);
    		ITextRenderer renderer = new ITextRenderer();
    		String content = "<!DOCTYPE html [ <!ENTITY nbsp \"&#160;\">] >" + "<html>" + "	<head>"
    				+ "		<style type=\"text/css\">" + "			body {" + "				font-family: SimSun;"
    				+ "				background: none;" + "				margin-left: auto;"
    				+ "				margin-right: auto;" + "			}" + "			p {"
    				+ "				margin: 5px 0;" + "			}" + "		</style>" + "	</head>" + "	<body>" + body
    				+ "	</body>" + "</html>" + "";
    
    		renderer.setDocumentFromString(content);
    
    		// step 3 解决中文支持
    		ITextFontResolver fontResolver = renderer.getFontResolver();
    		if ("linux".equals(getCurrentOperatingSystem())) {
    			fontResolver.addFont("/usr/share/fonts/chiness/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    		} else {
    			fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    		}
    		renderer.layout();
    		renderer.createPDF(os);
    		os.flush();
    		os.close();
    		System.out.println("create pdf done!!");
    	}
    
    	/***
    	 * 获取系统环境
    	 * @return
    	 */
    	public static String getCurrentOperatingSystem() {
    		String os = System.getProperty("os.name").toLowerCase();
    		System.out.println("---------当前操作系统是-----------" + os);
    		return os;
    	}
    
    	/***
    	 * 过滤html中的不规则文本
    	 * @param content
    	 */
    	private static String filterHtml(String content) {
    		return content.replace("<br>", "<br/>");
    	}
    
    	/***
    	 * 将html转成pdf 并输出到outputstream中
    	 * @param content  body正文
    	 * @param valueMap 占位符解析的值map
    	 * @param os 输出流
    	 * @throws Exception
    	 */
    	public static void convertHtmlToPdfOutStream(String content, Map<String, Object> valueMap, OutputStream os)
    			throws Exception {
    		content = PlaceholderResolver.resolveByMap(content, valueMap);
    		convertHtmlToPdfOutStream(content, os);
    	}
    
    	public static void convertHtmlToPdfOutStream(String content, OutputStream os) throws Exception {
    		PdfUtil.convertHtmlToPdf(content, os);
    	}
    	
    	/***
    	 * 下载文件-测试方法
    	 * @param os response的OutputStream
    	 * @throws Exception
    	 */
    	public static void test(OutputStream os) throws Exception {
    		String content = "<p style=\"text-align: center;\"><span style=\"font-size: 24px;\"><strong>测试模板</strong></span></p>\r\n" + 
    				"		<p><span style=\"font-size: 14px;\">尊敬的<span style=\"font-size: 14px; color: rgb(255, 0, 0);\">${userName}</span>:</span></p>\r\n" + 
    				"		<p style=\"text-indent: 2em;\"><span style=\"font-size: 14px;\">恭喜你中了100元大奖</span></p>\r\n" + 
    				"		<p style=\"text-align: right; text-indent: 0em;\"><span style=\"font-size: 14px;\">${date}</span></p>\r\n" + 
    				"		<p>&#8203;<br></p>";
    		JSONObject map = new JSONObject();
    		map.put("userName", "testAdmin");
    		map.put("date", new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss").format(new Date()));
    		content = PlaceholderResolver.resolveByMap(content, map);
    		convertHtmlToPdfOutStream(content, os);
    	}
    	
    	/***
    	 * 生成本地pdf文件
    	 * @param args
    	 * @throws Exception
    	 */
    	public static void main(String[] args) throws Exception {
    		String pdfFile = "d:/log/testoone2.pdf";
    		String content = "<body style=\"cursor: text;\">\r\n"
    				+ "		<p style=\"text-align: center;\"><span style=\"font-size: 24px;\">测试模板</span></p>\r\n"
    				+ "		<p><span style=\"font-size: 14px;\">尊敬的<span style=\"font-size: 14px; color: rgb(255, 0, 0);\">${userName}</span>:</span></p>\r\n"
    				+ "		<p><span style=\"font-size: 14px;\">&nbsp;&nbsp;&nbsp;&nbsp;&#8203;恭喜你中了100元大奖<br></span></p>\r\n"
    				+ "		<p><span style=\"font-size: 14px;\"><br></span></p>\r\n"
    				+ "		<p style=\"text-align: right;\"><span style=\"font-size: 14px;\">&#8203;2019年8月16日&nbsp;&nbsp;&nbsp;&nbsp;&#8203;</span></p>\r\n"
    				+ "	</body>";
    		JSONObject map = new JSONObject();
    		map.put("userName", "testAdmin");
    		content = PlaceholderResolver.resolveByMap(content, map);
    		OutputStream os = new FileOutputStream(pdfFile);
    		convertHtmlToPdfOutStream(content, os);
    	}
    }

    PlaceholderResolver.java

    import java.util.Map;
    import java.util.Properties;
    import java.util.function.Function;
    import java.util.stream.Stream;
    
    /**
     * 占位符解析器
     * @author meilin.huang
     * @version 1.0
     */
    public class PlaceholderResolver {
        /**
         * 默认前缀占位符
         */
        public static final String DEFAULT_PLACEHOLDER_PREFIX = "${";
    
        /**
         * 默认后缀占位符
         */
        public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}";
    
        /**
         * 占位符前缀
         */
        private static String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX;
    
        /**
         * 占位符后缀
         */
        private static String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX;
    
        /**
         * 解析带有指定占位符的模板字符串,默认占位符为前缀:${  后缀:}<br/><br/>
         * 如:template = category:${}:product:${}<br/>
         * values = {"1", "2"}<br/>
         * 返回 category:1:product:2<br/>
         * @param content 要解析的带有占位符的模板字符串
         * @param values   按照模板占位符索引位置设置对应的值
         * @return
         */
        public static String resolve(String content, String... values) {
            int start = content.indexOf(placeholderPrefix);
            if (start == -1) {
                return content;
            }
            //值索引
            int valueIndex = 0;
            StringBuilder result = new StringBuilder(content);
            while (start != -1) {
                int end = result.indexOf(placeholderSuffix);
                String replaceContent = values[valueIndex++];
                result.replace(start, end + placeholderSuffix.length(), replaceContent);
                start = result.indexOf(placeholderPrefix, start + replaceContent.length());
            }
            return result.toString();
        }
    
        /**
         * 解析带有指定占位符的模板字符串,默认占位符为前缀:${  后缀:}<br/><br/>
         * 如:template = category:${}:product:${}<br/>
         * values = {"1", "2"}<br/>
         * 返回 category:1:product:2<br/>
         *
         * @param content 要解析的带有占位符的模板字符串
         * @param values   按照模板占位符索引位置设置对应的值
         * @return
         */
        public static String resolve(String content, Object[] values) {
            return resolve(content, Stream.of(values).map(String::valueOf).toArray(String[]::new));
        }
    
        /**
         * 根据替换规则来替换指定模板中的占位符值
         * @param content  要解析的字符串
         * @param rule  解析规则回调
         * @return
         */
        public static String resolveByRule(String content, Function<String, String> rule) {
            int start = content.indexOf(placeholderPrefix);
            if (start == -1) {
                return content;
            }
            StringBuilder result = new StringBuilder(content);
            while (start != -1) {
                int end = result.indexOf(placeholderSuffix, start);
                //获取占位符属性值,如${id}, 即获取id
                String placeholder = result.substring(start + placeholderPrefix.length(), end);
                //替换整个占位符内容,即将${id}值替换为替换规则回调中的内容
                String replaceContent = placeholder.trim().isEmpty() ? placeholder : rule.apply(placeholder);
                result.replace(start, end + placeholderSuffix.length(), replaceContent);
                start = result.indexOf(placeholderPrefix, start + replaceContent.length());
            }
            return result.toString();
        }
    
        /**
         * 替换模板中占位符内容,占位符的内容即为map key对应的值,key为占位符中的内容。<br/><br/>
         * 如:content = product:${id}:detail:${did}<br/>
         *    valueMap = id -> 1; pid -> 2<br/>
         *    经过解析返回 product:1:detail:2<br/>
         *
         * @param content  模板内容。
         * @param valueMap 值map
         * @return   替换完成后的字符串。
         */
        public static String resolveByMap(String content, final Map<String, Object> valueMap) {
            return resolveByRule(content, placeholderValue -> String.valueOf(valueMap.get(placeholderValue)));
        }
    
        /**
         * 根据properties文件替换占位符内容
         * @param content
         * @param properties
         * @return
         */
        public static String resolveByProperties(String content, final Properties properties) {
            return resolveByRule(content, placeholderValue -> properties.getProperty(placeholderValue));
        }
    }

    TestController.java   测试下载controller

    import java.io.OutputStream;
    import java.net.URLEncoder;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RequestMapping("/testHtmlToPdf")
    public class TestController {
        
        @GetMapping("/getPdf")
        public void getPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String fileName = URLEncoder.encode("模板.pdf", "UTF-8");
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            
            OutputStream os = response.getOutputStream();
            PdfUtil.test(os);
            return;
        }
    }

    展开全文
  • Java html转PDF

    千次阅读 2016-06-15 14:11:29
    于是我就到网上搜索资料,看看是否能够html转PDF。 果然搜到了很多案例,当然很多一样的啦。 这里我将处理demo时遇到的问题和解决方案都大概说下吧! 下面我下贴出demo: public static boolean convertHtmlToPdf...
  • 由于项目中要求将HTML页面转换成pdf,itext的确是java开源组件的第一选择。不过itext也有局限,itext不支持css样式格式,就是要自己写模板,后来用了Flying Saucer,它也是基于iText的,支持CSS2,后来项目要求支持...
  • 相关文章: Java PDF工具类(一)itextpdf | 根据设置好的PDF模板填充PDF(文字和图片). 这里使用的是wkhtmltopdf工具,可用于THML图片或PDF。 wkhtmltopdf官方网站下载地址:...
  • 基于SpringBoot使用Thymeleaf+iText实现html(带图片)转pdf文件 1.导入依赖 <!-- Thymeleaf 模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>...
  • Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片)相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚).参考文章:...
  • java利用wkhtmltopdf实现html转化pdf

    千次阅读 2017-06-30 11:21:21
    最近做项目涉及到了合同的签订,原来用的wordxml格式的ftl模板转doc来完成的合同的签署,但是想在公司新需求需要以html格式的模板可以在线编辑合同,这样原来的模式就已经不适合了,在网上查了查,结果发现了...
  • Java生成PDF文档

    2019-12-04 13:16:44
    利用java实现excel转pdf文件 JAVA语言实现excel转pdf文件 Itext+POI将Excel转换为PDF 直接根据数据生成pdf Java生成PDF文档 iText使用PDF模板一 java根据模板导出pdf 动态生成数据太麻烦。 java根据模板HTML...
  • 大体操作是维护一份模板,再通过给这份模板中的变量赋予指定的值,最后调用转换接口,实现Word文档的生成。 本文主要讲述的是通过Freemarker生成Word文档。包括生成doc文档和docx文档。 二、什么是Freemarker? ...
  • java 生成pdf文档

    2017-02-15 20:58:34
    目前实现:将word转换为html文件,然后以html文件为模板生成pdf文档 存在问题:转换为html后许多标签无法识别,需要检查标签是否匹配、闭合等。找问题耗时耗力。 解决方案:直接将word转换为pdf类型的模板...
  • PDF文件方案准备html模板转pdf 难点:1. 每次变化都要找设计师;2. html样式很难控制(个人不擅长);3.html转pdf样式难以控制word模板转pdf 难点:1. 合适插件的选择;2. 中文的处理最终选择,word模板模式实现步骤...
  • 目中遇到个根据html转Java的功能,在java中我们itext可以快速的实现pdf打印下载的功能,在itext中我们一般有以下三中方式实现 配置pdf模板,通过Adobe Acrobat 来设置域最后通过代码将数据填充进去 通过FreeMarker...
  • IText生成PDF

    千次阅读 2017-02-06 17:17:42
    一、场景在做单位OA项目的时候有个功能,合同打印的功能,之前的想法是打印PDF。既然是打印PDF就需要用到PDF插件,java比较常用方便的...3、html转PDF 这三种方法各有千秋,从我试验的顺序开始说起1、绘制适用场景:
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • Java资源包01

    2016-08-31 09:16:25
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包101

    2016-07-13 10:11:08
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

java实现html模板转pdf

java 订阅