Java itext PDF制作、生成

本文介绍了如何使用iText库来创建和生成PDF文件,特别强调了处理中文字符的方法,以及两种不同的PDF生成方式:完全代码生成和通过Adobe Acrobat编辑表单。文章提供了相关依赖的版本信息,并给出了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、需要的jar 

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

导入jar相对版本要高,最好不要使用之前老版本的jar,主要是api和之前所属公司不一样(原公司被收购),导致部分jar有问题。特别是对于中文的处理

            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

代码是这句对中文处理,查看 BaseFont 源码 public static final String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"; 可以找到这句这主要就是 中文包放的地方  UniGB-UCS2-H 就是出来中文的,可以打开jar看以上文件夹中有没有 UniGB-UCS2-H 开头的文件,如果有就没有问题,没有就会报错的。

2、目前处理PDF有两种,一个是PDF全部由代码生成 这个比较灵活生成的PDF几乎没有什么局限性但是全部都是代码来写比较麻烦,另一个就是通过 Adobe Acrobat 编辑 表单  这种主要对PDF格式固定大小一样使用代码较少缺点就是要使用Adobe Acrobat来编辑表单主要还是这是一个收费软件(简单的说这个就是填空的方式,不能超出你所预留的地方)。今天主要来说第一种。

直接上代码: 不足之处还望指出。

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
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.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
// 只有关键信息其他本地实体类jar没有导
public class ExcelPDFUtil {
	
	/**
	 * @param path PDF文件全路径包含文件名
	 * @param name 公司名称
	 * @param list 具体数据
	 * @Description:  生成PDF文件
	 */ 
	public static boolean createPDF(String path,String name,List<Operatlist> list) {
		Document document = new Document();
		document.setPageSize(PageSize.A4);
		try {
            // 处理中文
			BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            //设置字体样式
			Font fontChinese12 = new Font(bfChinese, 12f, Font.BOLD);
			PdfWriter.getInstance(document, new FileOutputStream(path));
			document.open();
		//标题 PropertyUtil.getValueByKey("","");这是一个工具类读取配置文件的内容 这里忽略
			Paragraph paragraph0 = new Paragraph(PropertyUtil.getValueByKey(SystemForeverPr.RESOURCE, "COMPANY_NAME"),fontChinese12);
            // 设置左右居中
			paragraph0.setAlignment(Element.ALIGN_CENTER);
			document.add(paragraph0);
			//向文档中添加内容
			Font fontChinese5 = new Font(bfChinese, 5f, Font.BOLD);
			// /n 主要是为了换行
			Paragraph paragraph1 = new Paragraph("\n费用清单",fontChinese5);
			paragraph1.setAlignment(Element.ALIGN_CENTER);
			document.add(paragraph1);
			Font fontChinese10 = new Font(bfChinese, 8f, Font.BOLD);
			document.add(new Paragraph("\n致:" + name,fontChinese10));
			document.add(new Paragraph("\n",fontChinese10));
			String[] split = {"序号","业务日期","内单号","转单号","目的地","重量(Kg)","件数","运费","类别","备注"};
			int length = split.length;
            // 表格
			PdfPTable pdfPTable = new PdfPTable(length);
             // 表格宽度
			pdfPTable.setTotalWidth(550f);
            // 表格每列占的 百分比
			float[]  widths = {3f,5f,6f,6f,7f,5f,4f,6f,7f,23f};
			pdfPTable.setWidths(widths);
            // 必须锁定宽度,不然设置无效
			pdfPTable.setLockedWidth(true);
			for (int i = 0; i < length; i++) {
				Font font = new Font(bfChinese, 7f, Font.BOLD, BaseColor.BLUE);
				PdfPCell pdfPCell = new PdfPCell(new Paragraph(split[i],font));
				pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
				pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
				pdfPTable.addCell(pdfPCell);
			}
			int size = list.size();
			BigDecimal pice = new BigDecimal("0");
			for (int j = 0; j < size; j++) {
				addPdfPCell(String.valueOf(j + 1), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).getInputdate().substring(0, 10), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).geth(), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).getdh(), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).getCountry(), pdfPTable, bfChinese);
				BigDecimal weight = list.get(j).getOweight();
				if(weight == null || weight.compareTo(BigDecimal.ZERO) < 1) {
					weight = new BigDecimal("0");
				}
				addPdfPCell(weight.toString(), pdfPTable, bfChinese);
				Integer tonumber = list.get(j).getTonumber();
				if(tonumber == null) {
					tonumber = 1;
				}
				addPdfPCell(tonumber.toString(), pdfPTable, bfChinese);
				BigDecimal receivable = list.get(j).getOprice();
				if(receivable == null || receivable.compareTo(BigDecimal.ZERO) < 1) {
					receivable = new BigDecimal("0");
				}
				pice = pice.add(receivable);
				addPdfPCell(receivable.toString(), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).getGoodstype(), pdfPTable, bfChinese);
				addPdfPCell(list.get(j).getOremark(), pdfPTable, bfChinese);
			}
			document.add(pdfPTable);
			document.add(new Paragraph("\n"));
			Font fontf = new Font(bfChinese, 5f, Font.NORMAL);
            // 这是两个表格的嵌套 3列,最左边是一个表格,中间图片,最右是计算价格之和
			PdfPTable headerTable = new PdfPTable(3);
			headerTable.setTotalWidth(550f);
			float[]  headerwidths = {8f,10f,10f};
			headerTable.setWidths(headerwidths);
			headerTable.setLockedWidth(true);
            PdfPTable leftTable = new PdfPTable(1);//创建左边表格
            PdfPCell pdfPCell1 = new PdfPCell(new Paragraph("我司账号信息如下:",fontf));
            leftTable.addCell(disableBorderSide(pdfPCell1));
            PdfPCell pdfPCell2 = new PdfPCell(new Paragraph("开票公司账户:",fontf));
            leftTable.addCell(disableBorderSide(pdfPCell2));
            PdfPCell pdfPCell3 = new PdfPCell(new Paragraph("户  名:" + "",fontf));
            leftTable.addCell(disableBorderSide(pdfPCell3));
            PdfPCell pdfPCell4 = new PdfPCell(new Paragraph("开户行: " + "",fontf));
            leftTable.addCell(disableBorderSide(pdfPCell4));
            PdfPCell pdfPCell5 = new PdfPCell(new Paragraph("账  号: " + "",fontf));
            leftTable.addCell(disableBorderSide(pdfPCell5));
			// 图片全路径
            Image img = Image.getInstance("E:/wrtert/pcimages/201810/sgdfg.jpg");
			// 图片显示大小
			img.scaleAbsolute(80f,80f);
            Font font6 = new Font(bfChinese, 13f, Font.BOLD,BaseColor.RED);
            headerTable.addCell(disableBorderSide(leftTable));
    		headerTable.addCell(disableBorderSide(img));
    		headerTable.addCell(disableBorderSide(new Paragraph("合计:" + pice.toString() + " (元)",font6)));
    		document.add(headerTable);
			document.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * @param val 具体数据
	 * @param pdfPTable 表格
	 * @param bfChinese  处理汉字
	 * @Description: 给表格添加具体数据
	 */ 
	private static void addPdfPCell(String val,PdfPTable pdfPTable,BaseFont bfChinese) {
		Font font6 = new Font(bfChinese, 6f, Font.NORMAL);
		PdfPCell pdfPCell = new PdfPCell();
		Paragraph paragraph = new Paragraph(val,font6);
		paragraph.setAlignment(Element.ALIGN_CENTER);
		pdfPCell.addElement(paragraph);
		pdfPTable.addCell(pdfPCell);
	}
	
	/**
	 * @param element
	 * @return
	 * @Description: 去掉表格边框
	 */ 
	private static PdfPCell disableBorderSide(Element element) {
		PdfPCell pdfPCell = new PdfPCell();
		
		if(element instanceof PdfPCell) {
			pdfPCell = (PdfPCell)element;
		}else {
			pdfPCell.addElement(element);
		}
		pdfPCell.disableBorderSide(Rectangle.BOX);
		return pdfPCell;
	}

下面是最后生成PDF的最终格式。该模块几乎把 自定义生成PDF的API用了。后面在更新另外的一种方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值