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 进行结合。
    快去使用下。
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/Alandre/p/3415928.html
Copyright © 2011-2022 走看看