使用iTEXT生成PDF

4 篇文章 2 订阅
2 篇文章 1 订阅

在此之前我曾发布过一篇关于Java实现导出PDF的文章,那篇文章需要事先建好模板,设置好模板变量然后才导出,这样的模板比较适合导出一些格式固定好的内容。而今天这篇文章采用iTEXT导出PDF,不需要模板,可直接在java代码里设置好内容和样式,扩展性灵活性很强。

先看一下导出效果:
在这里插入图片描述
首先导入依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

代码,内容看似多,其实不复杂。

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;

@Slf4j
@RestController
@RequestMapping("/exportPDF")
public class ExportPDFController {
	
	/**
     * 订单PDF导出
     * @param
     * @return
     */
    @GetMapping("exportOrder")
    public JSONObject exportOrder(HttpServletResponse response){
		//创建文件
        Document document = new Document();
        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        //建立一个书写器
        PdfWriter writer = PdfWriter.getInstance(document, ba);
        response.reset();
        //打开文件
        document.open();
        //中文字体,解决中文不能显示问题
        BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        Font blackFont = new Font(bfChinese);
        blackFont.setColor(BaseColor.BLACK);
        // new Font(bfChinese)中加参数6表示字体的大小,什么都不加表示默认的大小
        Font blackFontB = new Font(bfChinese,6);
        blackFontB.setColor(BaseColor.BLACK);

		//添加内容
        // document.add(new Paragraph("表格",blackFont));
        
        // 创建一个表格 8代表这个表格有8列
		PdfPTable table1 = new PdfPTable(8);
		table1.setWidthPercentage(100); // 表格宽度100%填充
		// 设置每一列的宽度
		float[] columnWidths1= new float[]{6f, 8f, 6f, 10f, 10f, 10f, 8f, 10f};
		table1.setWidths(columnWidths1);
		// 获取这个表格的行数,用来向表格中添加数字
		ArrayList<PdfPRow> listRow1 = table1.getRows();

		PdfPCell cells0[]= new PdfPCell[8];
		// 设置第一行第一列的内容
		cells0[0] = new PdfPCell(new Paragraph("车龄", blackFont));
        cells0[0].setVerticalAlignment(Element.ALIGN_MIDDLE);  //水平居中
        cells0[0].setHorizontalAlignment(Element.ALIGN_CENTER);  // 垂直居中
        cells0[0].setFixedHeight(30f);  //行高
        cells0[1] = new PdfPCell(new Paragraph(" ", blackFont));
        cells0[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[1].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[1].setFixedHeight(30f);
        cells0[2] = new PdfPCell(new Paragraph("类型", blackFont));
        cells0[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[2].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[2].setFixedHeight(30f);
        cells0[3] = new PdfPCell(new Paragraph(model, blackFontB));
        cells0[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[3].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[3].setFixedHeight(30f);
        cells0[4] = new PdfPCell(new Paragraph("应收", blackFont));
        cells0[4].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[4].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[4].setFixedHeight(30f);
        cells0[5] = new PdfPCell(new Paragraph(totalPay, blackFont));
        cells0[5].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[5].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[5].setFixedHeight(30f);
        cells0[6] = new PdfPCell(new Paragraph("实付", blackFont));
        cells0[6].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[6].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[6].setFixedHeight(30f);
        cells0[7] = new PdfPCell(new Paragraph(actualPay, blackFont));
        cells0[7].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells0[7].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells0[7].setFixedHeight(30f);
        // 将以上每一列的内容加到第一行中
        PdfPRow pdfPRow0 = new PdfPRow(cells0);
        listRow1.add(pdfPRow0);
        // 新的一行
		PdfPCell cells1[]= new PdfPCell[8];
        cells1[0] = new PdfPCell(new Paragraph("车架号", blackFont));
        cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells1[0].setFixedHeight(22f);
        cells1[1] = new PdfPCell(new Paragraph("34324ws", blackFont));
        cells1[1].setFixedHeight(22f);
        cells1[2] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[2].setFixedHeight(22f);
        cells1[3] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[3].setFixedHeight(22f);
        cells1[4] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[4].setFixedHeight(22f);
        cells1[5] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[5].setFixedHeight(22f);
        cells1[6] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[6].setFixedHeight(22f);
        cells1[7] = new PdfPCell(new Paragraph(" ", blackFont));
        cells1[7].setFixedHeight(22f);
        // 合并列(从第二列开始,向后合并,共合并7列)
        cells1[1].setColspan(7);
        PdfPRow pdfPRow1 = new PdfPRow(cells1);
        listRow1.add(pdfPRow1);

		// 第二个table
		PdfPTable table2 = new PdfPTable(4);
        float[] columnWidths2= new float[]{20f, 15f, 20f, 15f};
        table2.setWidths(columnWidths2);
        table2.setWidthPercentage(100); // 宽度100%填充
        
        ArrayList<PdfPRow> listRow2 = table2.getRows();
        PdfPCell cells201[]= new PdfPCell[4];
        cells201[0] = new PdfPCell(new Paragraph("项目", blackFont));
        cells201[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells201[0].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells201[0].setFixedHeight(22f);
        cells201[1] = new PdfPCell(new Paragraph("售价", blackFont));
        cells201[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells201[1].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells201[1].setFixedHeight(22f);
        cells201[2] = new PdfPCell(new Paragraph("材料", blackFont));
        cells201[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells201[2].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells201[2].setFixedHeight(22f);
        cells201[3] = new PdfPCell(new Paragraph("成本", blackFont));
        cells201[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
        cells201[3].setHorizontalAlignment(Element.ALIGN_CENTER);
        cells201[3].setFixedHeight(22f);
        PdfPRow pdfPRow2 = new PdfPRow(cells201);
        listRow2.add(pdfPRow2);
        // 循环向表格添加数据(添加了3行)
        for(int i = 0; i < 3; i++){
			PdfPCell cells301[]= new PdfPCell[4];
            cells301[0] = new PdfPCell(new Paragraph("水泥灰",blackFont));
            cells301[0].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells301[0].setFixedHeight(22f);
            cells301[1] = new PdfPCell(new Paragraph("8000.00", blackFont));
            cells301[1].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells301[1].setFixedHeight(22f);
            cells301[2] = new PdfPCell(new Paragraph(" ", blackFont));
            cells301[2].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells301[2].setFixedHeight(22f);
            cells301[3] = new PdfPCell(new Paragraph(" ", blackFont));
            cells301[3].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells301[3].setFixedHeight(22f);
            PdfPRow pdfPRow301= new PdfPRow(cells301);
            listRow2.add(pdfPRow301);
		}
		// 添加空白行
		for(int i = 0; i < 27; i++){
            // 列表底部留出空白
            PdfPCell cells302[]= new PdfPCell[4];
            cells302[0] = new PdfPCell(new Paragraph(" ",blackFont));
            cells302[0].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells302[0].setFixedHeight(22f);
            cells302[1] = new PdfPCell(new Paragraph(" ", blackFont));
            cells302[1].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells302[1].setFixedHeight(22f);
            cells302[2] = new PdfPCell(new Paragraph(" ", blackFont));
            cells302[2].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells302[2].setFixedHeight(22f);
            cells302[3] = new PdfPCell(new Paragraph(" ", blackFont));
            cells302[3].setHorizontalAlignment(Element.ALIGN_CENTER);
            cells302[3].setFixedHeight(22f);
            PdfPRow pdfPRow302= new PdfPRow(cells302);
            listRow2.add(pdfPRow302);
        }

		// 把表格加入容器中
		document.add(table1);
        document.add(table2);
        //关闭文档
        document.close();
        //关闭书写器
        writer.close();
        
		// 告诉浏览器这是一个附件 直接下载
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(("订单"+".pdf").getBytes("utf-8"),"ISO8859-1") + "\"");
        response.setDateHeader("Expires", (System.currentTimeMillis() + 1000));
        response.setContentLength(ba.size());
        OutputStream out = response.getOutputStream();
        ba.writeTo(out);
        out.flush();
		return null;
	}
}

到此为止一个表格就导出为PDF了,样式可以自己设置,内容也可以根据业务层添加。然后去浏览器访问该接口,浏览器会自己下载该PDF文件
如果想了解更多制作表格的属性可去看我的iTEXT专栏

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值