itextpdf JAVA 输出PDF文档

使用JAVA生成PDF的时候,还是有些注意事项需要处理的。

第一、中文问题,默认的itext是不支持中文的,想要支持,需要做些处理。

  1、直接引用操作系统的中文字体库支持,由于此方案限制性强,又绑定了操作系统,所以此处不做实现,有兴趣可在网上搜索看看。

  2、引用itext-asian.jar包的字体支持,代码稍后上。

第二、表格中的设置,特别是上中下,左中右,不同的对象有不同的枚举实现,刚入手很容易混淆。其外是前景色,背景色,表格颜色等等。

第三、输出图片,很容易报错。、

package com.itext.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BarcodeQRCode;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class T {

    private static String path = "docs/"; // 生成PDF后的存放路径

    public static void main(String[] args) {
        T t = new T();
        t.initPDF(initData());
    }

    /**
     * 初始化PDF
     *
     * @param apis
     */
    public void initPDF(List<Api> apis) {
        File folder = new File(path);
        if (!folder.exists())
            folder.mkdirs(); // 创建目录
        Document doc = null;
        try {
            // 中文字体,要有itext-asian.jar支持(默认的itext.jar是不支持中文的)
            BaseFont bfchinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Rectangle pageSize = new Rectangle(PageSize.A4); // 页面大小设置为A4
            doc = new Document(pageSize, 20, 20, 40, 40); // 创建doc对象并设置边距
            PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(folder.getAbsolutePath() + File.separator + "API文档.pdf"));
            writer.setPageEvent(new SdkPdfPageEvent());
            doc.open();
            doc.addAuthor("Ares-xby");
            doc.addSubject("SDK附属API文档");
            doc.addTitle("API文档");
            BaseColor borderColor = new BaseColor(90, 140, 200);
            BaseColor bgColor = new BaseColor(80, 130, 180);
            for (Api api : apis) {
                PdfPTable table = new PdfPTable(4);
                // table.setWidthPercentage(100); // 设置table宽度为100%
                // table.setHorizontalAlignment(PdfPTable.ALIGN_CENTER); // 设置table居中显示
                for (int i = 0; i < api.getParams().size(); i++) {
                    if (i == 0) {
                        // row 1
                        table.addCell(createCell("API", bfchinese, borderColor, bgColor));
                        table.addCell(createCell(api.getApiName(), 12, bfchinese, 3, null, borderColor, bgColor));
                        // row 2
                        table.addCell(createCell("描述", bfchinese, borderColor));
                        table.addCell(createCell(api.getApiDesc(), 12, bfchinese, 3, null, borderColor));
                    } else {
                        table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, Paragraph.ALIGN_RIGHT, borderColor));
                        table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, null, borderColor));
                        table.addCell(createCell(api.getParams().get(i).getParamType(), 10, bfchinese, null, null, borderColor));
                        table.addCell(createCell(api.getParams().get(i).getParamDesc(), 10, bfchinese, null, null, borderColor));
                    }
                }
                doc.add(table);
            }
            // 二维码
            BarcodeQRCode qrcode = new BarcodeQRCode("http://www.baidu.com", 1, 1, null);
            Image qrcodeImage = qrcode.getImage();
            qrcodeImage.setAbsolutePosition(10, 600);
            qrcodeImage.scalePercent(200);
            doc.add(qrcodeImage);
            doc.close();
            System.out.println("init pdf over.");
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (doc != null)
                doc.close();
        }

    }

    public static List<Api> initData() {
        List<Api> list = new ArrayList<Api>();
        for (int i = 0; i < 100; i++) {
            Api api = new Api();
            api.setApiName("api-" + i);
            api.setApiDesc("描述-" + i);
            int paramSize = new Random().nextInt(20);
            List<Params> paramList = new ArrayList<Params>();
            for (int j = 0; j < paramSize; j++) {
                Params param = new Params();
                param.setParamName("param-" + i + "-" + j);
                param.setParamType("paramType-" + i + "-" + j);
                param.setParamDesc("描述-" + i + "-" + j);
                paramList.add(param);
            }
            api.setParams(paramList);
            list.add(api);
        }
        System.out.println("init data over. size=" + list.size());
        return list;
    }

    // 用於生成cell
    private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor) {
        return createCell(text, 12, font, null, null, borderColor, null);
    }

    // 用於生成cell
    private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor, BaseColor bgColor) {
        return createCell(text, 12, font, null, null, borderColor, bgColor);
    }

    // 用於生成cell
    private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor) {
        return createCell(text, fontsize, font, colspan, align, borderColor, null);
    }

    /**
     * 用於生成cell
     *
     * @param text
     *            Cell文字内容
     * @param fontsize
     *            字体大小
     * @param font
     *            字体
     * @param colspan
     *            合并列数量
     * @param align
     *            显示位置(左中右,Paragraph对象)
     * @param borderColor
     *            Cell边框颜色
     * @param bgColor
     *            Cell背景色
     * @return
     */
    private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor, BaseColor bgColor) {
        Paragraph pagragraph = new Paragraph(text, new Font(font, fontsize));
        PdfPCell cell = new PdfPCell(pagragraph);
        cell.setFixedHeight(20);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 上中下,Element对象
        if (align != null)
            cell.setHorizontalAlignment(align);
        if (colspan != null && colspan > 1)
            cell.setColspan(colspan);
        if (borderColor != null)
            cell.setBorderColor(borderColor);
        if (bgColor != null)
            cell.setBackgroundColor(bgColor);
        return cell;
    }

    /**
     * SDK中PDF相关的PageEvent
     */
    class SdkPdfPageEvent extends PdfPageEventHelper {

        @Override
        public void onStartPage(PdfWriter writer, Document document) {
            // 水印(water mark)
            PdfContentByte pcb = writer.getDirectContent();
            pcb.saveState();
            BaseFont bf;
            try {
                bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                pcb.setFontAndSize(bf, 36);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.2f);
            pcb.setGState(gs);

            pcb.beginText();
            pcb.setTextMatrix(60, 90);
            pcb.showTextAligned(Element.ALIGN_LEFT, "XX公司有限公司", 200, 300, 45);

            pcb.endText();
            pcb.restoreState();
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            // 页眉、页脚
            PdfContentByte pcb = writer.getDirectContent();
            try {
                pcb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED), 10);
            } catch (Exception e) {
                e.printStackTrace();
            } // 支持中文字体
            pcb.saveState();
            try {
                // pcb.addImage()方法要在pcb.beginText();pcb.endText();之外调用,
                // 否则生成的PDF打开时会报错: An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem.
                // byte[] b = new byte[10 * 1024];
                // int i = getClass().getResourceAsStream("logo.png").read(b);
                Image image = Image.getInstance("logo.png");
                image.setAbsolutePosition(document.left(), document.top(-5)); // 设置图片显示位置
                image.scalePercent(12);                                       // 按照百分比缩放
                pcb.addImage(image);
            } catch (BadElementException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            pcb.beginText();

            // Header
            float top = document.top(-15);
            pcb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "XX开放平台API文档", document.right(), top, 0);
            // Footer
            float bottom = document.bottom(-15);
            pcb.showTextAligned(PdfContentByte.ALIGN_CENTER, "第 " + writer.getPageNumber() + " 页", (document.right() + document.left()) / 2, bottom, 0);

            pcb.endText();

            pcb.restoreState();
            pcb.closePath();
        }

        @Override
        public void onCloseDocument(PdfWriter writer, Document document) {
            PdfContentByte pcb = writer.getDirectContent();
            try {
                pcb.beginText();
                pcb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED), 10); // 支持中文字体
                pcb.showText(writer.getPageNumber() - 1 + "页");
                pcb.endText();
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            pcb.closePath();
        }
    }

    /**
     * POJO
     */
    static class Api {

        private String apiName;
        private String apiDesc;
        private List<Params> params;

        public String getApiName() {
            return apiName;
        }

        public void setApiName(String apiName) {
            this.apiName = apiName;
        }

        public String getApiDesc() {
            return apiDesc;
        }

        public void setApiDesc(String apiDesc) {
            this.apiDesc = apiDesc;
        }

        public List<Params> getParams() {
            return params;
        }

        public void setParams(List<Params> params) {
            this.params = params;
        }
    }

    /**
     * POJO
     */
    static class Params {

        private String paramName;
        private String paramType;
        private String paramDesc;

        public String getParamName() {
            return paramName;
        }

        public void setParamName(String paramName) {
            this.paramName = paramName;
        }

        public String getParamType() {
            return paramType;
        }

        public void setParamType(String paramType) {
            this.paramType = paramType;
        }

        public String getParamDesc() {
            return paramDesc;
        }

        public void setParamDesc(String paramDesc) {
            this.paramDesc = paramDesc;
        }
    }

}

  

时间: 2024-10-11 17:51:16

itextpdf JAVA 输出PDF文档的相关文章

Servlet输出PDF文档方法

概述 Java Servlet 编程可以很方便地将 HTML 文件发送到客户端的 Web 浏览器.然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF.Microsoft Word 和 Micorsoft Excel 等.事实上这些非 HTML 格式只要能用 MIME 类型表示,就可以利用 servlet 来发送.本文将以 PDF为例,向你介绍如何使用 servlet 传送非 HTML 格式文件及该文件是如何在服务器端用Java生成的. 你只要将文件写到servlet 的输出

java导出pdf文档

java导出pdf文档,多是iText实现的,可以创建pdf文档,并向文档写入内容. 1 导入包:itext-2.0.6.jar       itext必须使用的包. iTextAsian.jar      向pdf写入中文必须的包. 2 代码: package com.exp.pdf; import java.awt.Color; import java.io.FileOutputStream; import com.lowagie.text.Document; import com.lowa

Java生成PDF文档(表格、列表、添加图片等)

需要的两个包及下载地址: (1)iText.jar:http://download.csdn.net/source/296416 (2)iTextAsian.jar(用来进行中文的转换):http://download.csdn.net/source/172399 代码如下: 1 import java.awt.Color; 2 import java.io.FileOutputStream; 3 import com.lowagie.text.Cell; 4 import com.lowagi

Java操作PDF文档

1.文档内容的基本格式设置 示例代码: public class Pdf05C { public static void main(String[] args) { Document document = new Document(); try { PdfWriter.getInstance(document, new FileOutputStream("C:\\005.pdf")); document.open(); BaseFont font = BaseFont.createFo

[开源框架推荐]Icepdf:纯java的pdf文档的提取和转换库

ICEpdf 是一个轻量级的开源 Java 语言的 PDF 类库.通过 ICEpdf 可以用来浏览.内容提取和转换 PDF 文档,而无须一些本地PDF库的支持. 可以用来做什么? 1.从pdf文件中提取所有的文字或信息,比如给pdf文档做摘要 2.把pdf转换成图片,这个功能非常的棒,比如给pdf文件做缩略图或者直接做一个纯js的pdf阅读器. 3.pdf文档的分页打印和信息搜索. 4.pdf中添加.修改或删除批注信息. 在pdf到图片转换方面,最好的开源产品. 官方地址:http://www.

java读取pdf文档

import java.io.*;import org.pdfbox.pdmodel.PDDocument;import org.pdfbox.pdfparser.PDFParser;import org.pdfbox.util.PDFTextStripper; public class PDFReader {  public static String file_path = "F:/pdf/网易技术部的MySQL中文资料.pdf"; // 获取PDF内纯文本信息 public St

Java 在PDF文档中绘制图形

本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等. 使用工具:Free Spire.PDF for Java(免费版) Jar文件导入: 步骤1:将安装包中lib文件夹下的两个文件复制到程序中新建的文件夹中(这里在程序中可新建一个文件夹并命名为Lib) 步骤2:复制文件后,将两个添加引用到程序:选中这两个jar文件,点击鼠标右键,选择"Build

java生成PDF文档

依赖jar包:iText-2.1.7.jar.iTextAsian.jar.itext-rtf-2.1.7.jar 代码如下: package com.servlet; import java.awt.Color; import java.io.FileOutputStream; import java.text.DecimalFormat; import java.util.Arrays; import java.util.HashSet; import java.util.List; imp

常用PDF文档开发库

C++库: 1,PDF类库 PoDoFo   http://podofo.sourceforge.net/  PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析.修改和创建 PDF 文 2,Xpdf http://www.foolabs.com/xpdf/download.html   Xpdf是一个开放源代码的PDF档案浏览器,Xpdf 可解码LZW压缩格式并阅读加密的PDF文件 3,PDF生成工具 Poppler http://poppler.free