java生成pdf文件并打印

一、前言

  前几天,需要实现打印下载报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。

  二、iText简介

  iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

  iText的安装非常方便,在http://itextpdf.com/ 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

项目中需要引入的jar包:

<!-- itext方式导出pdf -->
		<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>

三、建立第一个PDF文档

  用iText生成PDF文档需要5个步骤:

  ①建立com.lowagie.text.Document对象的实例。
  // 创建文本对象
        Document document = new Document();
         //横向,这个可以自己根据实际情况看需不需要,我的是竖着放不下,只能横向展示
         Rectangle pageSize = new Rectangle(PageSize.A4.getHeight(), PageSize.A4.getWidth());
         pageSize.rotate();
         document.setPageSize(pageSize);

  ②创建书写器(Writer)对象
        PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
        writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);

  ③打开文档。
  document.open(); 

  ④向文档中添加内容。
  // 设置PDF ,即确定了表格的列数
        //设置宽度
        float[] widths = { 200, 200, 300, 500, 300, 300, 300, 300, 300, 300, 300,300,400,300,500,200,500,400,300};
        //表格处理   创建表格时必须指定表格的列数
        PdfPTable table = new PdfPTable(widths);
        table.setLockedWidth(true);
        table.setTotalWidth(800);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);

        // 设置PDF表格标题
        pdfTitle(table);
        //制表单位等信息设置
        pdfTitle1(table,financeBatchId);
        //表头
        pdfTitle2(table);
        // 设置PDF表格内容
        pdfContent(table, financeBatchId);
        // 设置PDF合计
        pdfSubtotal(table, countDetails);
        //底部四个人名
        pdfDown(table,financeBatchId);

       // pdf文档中加入table
        document.add(table);

  ⑤关闭文档。
  document.close(); 

看代码:

@Override
	public void printPayment(HttpServletResponse response, Integer financeBatchId) throws Exception {
		List<BatchDetails> batchDetailsList=batchDetailsRepo.findByFinanceBatchId(financeBatchId);
		//个人合计
		CountDetails countDetails=ExcelUtil.subTotalCountDetails1(batchDetailsList);
		// 创建文本对象
		Document document = new Document();
	     //横向
	     Rectangle pageSize = new Rectangle(PageSize.A4.getHeight(), PageSize.A4.getWidth());
	     pageSize.rotate();
	     document.setPageSize(pageSize);
		//创建书写器(Writer)对象
		PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
		writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
		document.open();
		// 设置PDF ,即确定了表格的列数
		//设置宽度
		float[] widths = { 200, 200, 300, 500, 300, 300, 300, 300, 300, 300, 300,300,400,300,500,200,500,400,300};
		//表格处理   创建表格时必须指定表格的列数
		PdfPTable table = new PdfPTable(widths);
		table.setLockedWidth(true);
		table.setTotalWidth(800);//550
		table.setHorizontalAlignment(Element.ALIGN_CENTER);
		// 设置PDF表格标题
		pdfTitle(table);
		//制表单位等信息设置
		pdfTitle1(table,financeBatchId);
		//表头
		pdfTitle2(table);
		// 设置PDF表格内容
		pdfContent(table, financeBatchId);
		// 设置PDF合计
		pdfSubtotal(table, countDetails);
		//底部四个人名
		pdfDown(table,financeBatchId);
		// pdf文档中加入table
		document.add(table);
		document.close();
		response.setHeader("content-Type", "application/pdf");
	}
/**
	 * 设置标题
	 * @param table
	 * @throws Exception
	 */
	private void pdfTitle(PdfPTable table) throws Exception {
		String titleContent1= "*****************业务个人支付明细表";
		// 表格的单元格
		PdfPCell cell = new PdfPCell();
		// 向单元格中插入数据
		// new Paragraph()是段落的处理,可以设置段落的对齐方式,缩进和间距。
		cell.setPhrase(new Paragraph(titleContent1, getPdfChineseFont1()));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER);
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
		cell.setMinimumHeight(30);//设置表格行高   
		cell.setBorderWidth(0f);//去除表格的边框
		cell.setColspan(19);
		//cell.setRowspan(19);
		table.addCell(cell);
	}

剩下的表格的内容等信息都一样,根据实际情况自己去改动;

现在给大家展示一下效果图:

 

补充:之前上面的都是ok的,过了一段时间,打印出来的pdf是如下这样的

 

 

接下来把上面主代码修改为如下:

@Override
	public void printPayment(HttpServletResponse response, Integer financeBatchId) throws Exception {
		List<BatchDetails> batchDetailsList=batchDetailsRepo.findByFinanceBatchId(financeBatchId);
		//个人合计
		CountDetails countDetails=ExcelUtil.subTotalCountDetails1(batchDetailsList);
		// 创建文本对象
		Document document = new Document();
	     //横向
	     Rectangle pageSize = new Rectangle(PageSize.A4.getHeight(), PageSize.A4.getWidth());
	     pageSize.rotate();
	     document.setPageSize(pageSize);
		//创建书写器(Writer)对象
	     ByteArrayOutputStream ba = new ByteArrayOutputStream();  
	     PdfWriter writer = PdfWriter.getInstance(document, ba);
//	     下面response.getOutputStream()不行,会出现类似乱码
//		PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
		writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
		document.open();
		// 设置PDF ,即确定了表格的列数
		//设置宽度
		float[] widths = { 200, 200, 300, 500, 300, 300, 300, 300, 300, 300, 300,300,400,300,500,200,500,400,300};
		//表格处理   创建表格时必须指定表格的列数
		PdfPTable table = new PdfPTable(widths);
		table.setLockedWidth(true);
		table.setTotalWidth(800);//550
		table.setHorizontalAlignment(Element.ALIGN_CENTER);
		// 设置PDF表格标题
		pdfTitle(table);
		//制表单位等信息设置
		pdfTitle1(table,financeBatchId);
		//表头
		pdfTitle2(table);
		// 设置PDF表格内容
		pdfContent(table, financeBatchId);
		// 设置PDF合计
		pdfSubtotal(table, countDetails);
		//底部四个人名
		pdfDown(table,financeBatchId);
		// pdf文档中加入table
		document.add(table);
		document.close();
		response.setHeader("content-Type", "application/pdf");
		ServletOutputStream out = response.getOutputStream();
		ba.writeTo(out);//将字节数组输出流中的数据写入指定的OutputStream输出流中.
		out.flush();   		
	}

修改的代码

//创建书写器(Writer)对象
         ByteArrayOutputStream ba = new ByteArrayOutputStream();  
         PdfWriter writer = PdfWriter.getInstance(document, ba);
//         下面response.getOutputStream()不行,会出现类似乱码
//        PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());

 

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页