zoukankan      html  css  js  c++  java
  • Java 动态生成 PDF 文件

    每片文章前来首小诗:

       今日夕阳伴薄雾,印着雪墙笑开颜。我心仿佛出窗前,浮在半腰望西天。  --泥沙砖瓦浆木匠

    需求:

    项目里面有需要java动态生成 PDF 文件,提供下载。今天我找了下有关了,系统得学习了解下。

    开源的 iText 库使得 PDF 的创建变得轻松易行。下面介绍下  

    方案:

    -----------------------

     iText V5.X.X 版

    -----------------------

    第一步学习:

    了解下:

    • com.itextpdf.text.Document 是用于生成 PDF 文档的主要类。
    • com.itextpdf.text.pdf.PdfWriter 是一个 PDF 编写器。
    • 下面罗列下常用:
    • com.itextpdf.text.Paragraph:此类表示一个缩进的段落。
    • com.itextpdf.text.Chapter:此类表示 PDF 文档中的一章。使用 Paragraph 作为标题、int 作为章节编号来创建该类。
    • com.itextpdf.text.Font:此类包含一种字体的所有规范,比如字体集、字号、样式和颜色。各种字体都在此类中声明为静态常量。
    • com.itextpdf.text.List:此类表示一个列表,反过来,该列表又包含许多 ListItems
    • com.itextpdf.text.pdf.PDFPTable:这是一个表格,可放在一个绝对位置上,也可作为类 Table 添加到文档中。
    • com.itextpdf.text.Anchor:一个 Anchor 可能是一个引用,或是一个引用的目标。

    这里我用的是这两个包,我分享下。

    链接: http://pan.baidu.com/s/1koKaq 密码:q2vy

    清单1. 实例化文档对象
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);

    第 一个参数是页面大小。接下来的几个参数分别是左边距、右边距、上边距和下边距。此文档的类型还未定义。它依赖于您创建的编写器类型。对于我们的样例,我们 选择 com.itextpdf.text.pdf.PdfWriter。其他编写器包括 HtmlWriter、RtfWriter、XmlWriter 等。它们的名称说明了它们的实际用途。

    清单2. 创建 PdfWriter 对象
    PdfWriter writer = PdfWriter.getInstance(document, 
    
    new FileOutputStream("C:\Test.pdf"));
    
    document.open();

    第一个参数是文档对象的引用,第二个参数是输出将写入的文件的绝对名称。接下来,我们打开文档开始编写。

    现 在,我们将在文档的第一页上添加一些文本。任何文本都借助 com.itextpdf.text.Paragraph 来进行添加。您可使用您的文本以及字体、颜色、字号等默认设置创建一个默认段落。否则,您可提供自己的字体。 在本文中,我们还将讨论 PDF 文档的定位符(链接)。在此 PDF 中,我们使用 backToTop 作为链接。当单击 backToTop 链接时,它会将您带到文档的第一页。您需要将该文本设置为第一页的定位目标。让我们看看如何将定位目标和字体设置到所添加的段落中。

     
    清单3. 创建段落对象
    Anchor anchorTarget = new Anchor("ccccccccccccccccc");
          anchorTarget.setName("bbbbbbbbbbbbbbbb");
          Paragraph paragraph1 = new Paragraph();
    
          paragraph1.setSpacingBefore(50);
    
          paragraph1.add(anchorTarget);
          document.add(paragraph1);
    
    document.add(new Paragraph("aaaaaaaaaaaaaaaaaaaaaa", 
    
    FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,    new CMYKColor(0, 255, 0, 0))));

     显示了清单 3 中的代码的样例输出。要关闭文档,将 document.close(); 添加到清单 3 中的代码末尾。

    这就是一个简单的pdf 生成了。

    第二步学习:

    细心的同学们,详细可以看帮助文档。

    链接: http://pan.baidu.com/s/15n2BX 密码:kary

    第三步学习:

    再细心的同学,会问“干嘛用 aaaaaa bbbbbb cccccc”。中文呢?

    这时候我们,需要解决。用帮助jar。我上面给你们分享了。

    下面给个案例(超级简单)。

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Paragraph;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class makePDF {
    
        /**
         * @param args
         * @throws DocumentException
         * @throws FileNotFoundException
         */
        public static void main(String[] args) throws FileNotFoundException,
                DocumentException {
            // TODO Auto-generated method stub
            Document document = new Document(PageSize.A4, 50, 50, 50, 50);// 是用于生成
            PdfWriter writer = PdfWriter.getInstance(document,
                    new FileOutputStream("D:\pdftest.pdf"));
            document.open();
            Paragraph par = new PDFParagraph("你好");// 此类表示段落。
            par.add("这是我们第一个pdftext。");
            document.add(par);
            document.close();
        }
    
    }
    
    class PDFParagraph extends Paragraph {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public PDFParagraph(String content) {
            super(content, getChineseFont());
        }
    
        private static final Font getChineseFont() {
            
            Font FontChinese = null;
            try {
                BaseFont bfChinese = BaseFont.createFont("STSong-Light",
                        "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                FontChinese = new Font(bfChinese, 12, Font.NORMAL);
            } catch (DocumentException de) {
                System.err.println(de.getMessage());
            } catch (IOException ioe) {
                System.err.println(ioe.getMessage());
            }
            return FontChinese;
        }
    }

    下面仔细解释下:

     Paragraph par = new PDFParagraph("你好");// 此类表示一个缩进的段落。
    -->调用方法:
    PDFParagraph(String content)
    -->
    super(content, getChineseFont());//实现父类,成功创造出我们需要的 段落。
    -->
    getChineseFont()//中文帮助jar帮我们解决,中文显示。

    总结:
      iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。
    快去使用下。
  • 相关阅读:
    "Hello world" of ML
    数据读进set,进行后处理
    从csv文件读取数据到二维vector
    logistic regression
    Probabilistic interpretation
    python3 批量管理Linux服务器 下发命令与传输文件
    Redis 主从复制、读写分离(基于docker)
    Springboot 整合Redis
    Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 106.xx.xxx229:6379
    docker 创建redis容器以及redis命令笔记
  • 原文地址:https://www.cnblogs.com/Alandre/p/3415928.html
Copyright © 2011-2022 走看看