生成 PDF 全攻略【1】初体验

简介:

     经历过多少踩坑,翻看过多少类似博客,下载过多少版本的Jar,才能摸索出正确的代码书写方式,才能实现项目经理需求分析书中的功能点。

     本文借一次 JavaEE 生成PDF的颠簸的实现过程,描述中小公司程序员的坎坷成长之路。

     俺上面只所以将成熟大公司排除在外的原因是,大公司一般都有成熟的产品线和技术积淀。

     至少会有完善的建构师团队,有像扫地神僧那样的牛人隐士......

     公司中初级程序员遇到问题,能找到以前实现过的类似功能的代码作为参照,也能咨询技术经理。

     小公司是没有这种福分的,就像昨天早晨"生成PDF"需求到,工期一天,明日要给客户看。

     第一反应是找谷歌,关键字 "Java生成PDF",博客不是一般的多,下面简述几种实现方式和实现过程中遇到的问题。

     (目录已列在上面,通过搜索引擎进来的小伙伴,看看上面列表中是否有能解决你问题的,有点到相应的小节,没有就关闭看下一条搜索记录吧....)

1.IText 生成复杂PDF

    谷歌中占比例最大的Java 生成PDF实现类库,也是许多技术博客中涉及到技术,官网:http://itextpdf.com/

    开源中国中的介绍:http://www.oschina.net/p/itext,好嘞,既然都推荐那就采用这类库看看。

    下载 Jar 也是琳琅满目,让你挑花眼,从 2.1--5.5 应有尽有,有些论坛下载东西还需要注册o(︶︿︶)o 唉。

    这里采用的是最新的版本 5.5,仔细阅读下别人的技术博客或者是官方文档,编码起来确实不是很费劲。笔者将业务抽象实现的类如下:

复制代码
public class createSimplePDF {
    private Font FontChinese;
    public void simplePDF() {
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            FontChinese = new Font(bfChinese, 12, Font.NORMAL);
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream("F:\\Garbage\\Hello simplePDF.pdf"));
            document.open();

            PdfPTable table = new PdfPTable(4);
            table.addCell(getCell("姓名", 1, 1));
            table.addCell(getCell("", 1, 1));
            table.addCell(getCell("编号", 1, 1));
            table.addCell(getCell("", 1, 1));

            table.addCell(getCell("部门", 1, 1));
            table.addCell(getCell("", 1, 1));
            table.addCell(getCell("岗位名称", 1, 1));
            table.addCell(getCell("", 1, 1));

            table.addCell(getCell("到职日期", 1, 1));
            table.addCell(getCell("", 1, 1));
            table.addCell(getCell("预定离职日期", 1, 1));
            table.addCell(getCell("", 1, 1));

            table.addCell(getCell("事由", 1, 3));
            table.addCell(getCell("", 3, 3));

            table.addCell(getCell("部门意见", 1, 3));
            table.addCell(getCell("", 3, 3));
            document.add(table);
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private PdfPCell getCell(String cellValue, int colspan, int rowSpan) {
        PdfPCell cell = new PdfPCell();
        try {
            cell = new PdfPCell(new Phrase(cellValue, FontChinese));
            cell.setRowspan(rowSpan);
            cell.setColspan(colspan);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cell;
    }
}
复制代码

2.IText添加对中文的支持

   愉快的将代码编写完成,生成后中文不见了,注意是不见了,不是乱码。

   仔细观察报错,发现IText需要添加另外itext-asian.jar去支持中文,那就添加吧。

   因为自己IText使用的是最新的5.5版本,导致其他低版本的 itext-asian.jar 无法支持(具体原因是5.0以上的itext包名发生了变化),抛出的错误如下:

   Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized

   最终在一篇博客中寻获解决方法,尝试后奏效,就是上述代码中:

 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
 FontChinese = new Font(bfChinese, 12, Font.NORMAL);

  笔者这里将最新的IText.jar 和 配套的中文支持  itext-asian.jar,放置百度云盘,节省其他同学找 Jar 时间。

  云盘地址:http://pan.baidu.com/s/1bqs4km  提取密码: 99eg

  最终实现的截图如下:

  其实项目中最终要实现的表格的样子比这个复杂的多,80%花费时间主要是在调整样式,编译输出--->看样式,到这里其实需求已经能够实现了。

  笔者也是用这种方式实现的,毕竟是给客户演示的。

  这里要感谢的是这位博主的博客,里面有详细的IText 设置段落,标题,表格,加密..........只要你能在生成PDF想到的,这里面基本上都有。

  博客地址:http://rensanning.iteye.com/blog/1538689

3.iTextRenderer(Flying Saucer) HTML转PDF

  Flying saucer 做为HTML渲染PDF的开源项目(老外起名字我也是醉了,想起一出是一出,HTML 渲染 PDF起个"飞行器")。

  其中的核心类 iTextRenderer 支持将HTML生成PDF。

  iTextRenderer 在依赖 iText 的基础上,单独实现了HTML渲染PDF,基本上能实现 CSS 2.1的整体性,并且完全符合 W3C 规范。

  如果采用这种方式,编译输出调整样式什么的,就让它见鬼去吧。

  具体的流程如下图:

  

     这才是高大上的解决方案有木有,模版引擎现在也是玲琅满目(freemark,velocity.......),具体看你们项目吧。

     这样就不用为繁琐的样式发愁了,定义模版前端查看,注入数据,生成PDF,核心代码:

复制代码
                ITextRenderer iTextRenderer = new ITextRenderer();
                iTextRenderer.getFontResolver().addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                iTextRenderer.setDocument(new File(currWebcontentPath + reviewHtmlPath).toURI().toString());
                iTextRenderer.layout();
                String pdfName = getPdfName(testVO);
                OutputStream fileOutputStream = new FileOutputStream(currWebcontentPath + pdfPath + pdfName);
                iTextRenderer.createPDF(fileOutputStream);
                iTextRenderer.finishPDF();
复制代码

    这里面需要解决的问题还有生成的HTML存放的位置,然后就是跳转到下载页面了,如果你是JavaEE后端开发,这些问题应该都难不到你。


本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5233243.html,如需转载请自行联系原作者

相关文章
|
7月前
|
数据可视化 Android开发
XMind 2021 v11.1.2破解版使用方法
XMind 2021 v11.1.2破解版使用方法
135 0
|
28天前
|
存储 Docker 容器
Star 8.3k!强烈推荐这款强大的 PDF 文件处理工具,PDF处理它全包了!
Star 8.3k!强烈推荐这款强大的 PDF 文件处理工具,PDF处理它全包了!
|
2月前
|
知识图谱
Obsidian使用初体验
Obsidian使用初体验
49 0
SketchUp2020免费中文完整版官网2021教程模型库下载
SketchUp2022 WIN10 64位安装步骤: 1.先使用“百度网盘客户端”下载SU22_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,然后找到SketchUpProFull-2022.exe,鼠标右击选择【以管理员身份运行】 2.选择软件安装路径,默认安装在C盘,点击【更改】可修改软件安装路径,注意:安装路径文件夹名称不能含有中文字符!小编这里将软件安装在D盘SU2022文件夹下,然后点击【安装】 温馨提示:请记住软件安装路径,后续操作需要用到。 3.正在安装中,这个过程中大概需要10分钟左右的时间,请耐心等待… 4.安装结束,点击【完成】 5.返回软件初始安装包
SketchUp2020免费中文完整版官网2021教程模型库下载
|
算法
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
1955 0
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
|
iOS开发 MacOS
XMind 2022 使用教程
XMind 2022的安装 XMind 2022的使用 XMind 最新版 思维导图的安装使用 思维导图 XMind 2022的下载 XMind 2022 XMind 2022 Win/Mac 强大的思维导图软件
XMind 2022 使用教程
|
存储 弹性计算 Java
我的阿里云初体验
经过同学的推荐,参加了阿里云的“飞天加速计划·高校学生在家实践 ”,首次体验了阿里云的ECS服务器,整体来说使用体验非常好,也非常推荐大家来使用ECS服务器。
162 0
我的阿里云初体验
|
XML Java API
手把手教你使用Java开发在线生成pdf文档
在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票、订单的库存打印单、各种电子签署合同等等,以方便用户查看、打印或者下载。
手把手教你使用Java开发在线生成pdf文档
|
开发工具
基于neovim和latex beamer宏包搭建免费ppt制作工具
## beamer和powerpoint的不同 我们经常需要用ppt这一形式来展示我们的工作成果,但众所周知,微软的powerpoint是收费软件,且价格不菲,wps的画图功能能用,但需要保存成其他格式,比如pdf时。 是需要收费的。而基于latex的beamer宏包,我们可以使用编辑器写latex代码,用latex的编译工具编译成适合展示的ppt。当然ppt是pdf形式的,并
380 0
|
数据库管理
Creo:Creo2.0安装实例教程之图文详细攻略
Creo:Creo2.0安装实例教程之图文详细攻略
Creo:Creo2.0安装实例教程之图文详细攻略