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用了。后面在更新另外的一种方式