最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成pdf格式的报表上传到供应商的服务器,特此记录实现方法。废话不多说,直接上代码:
- THSarabunNew.ttf该文件是泰国字体自行网上下载即可
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* TOT上报PDF文件生成工具
*/
@Slf4j
@Component
public class TOTReportPdfService {
private String thaiFont = this.getClass().getResource("THSarabunNew.ttf").getPath();
@Autowired
private SFTPChannel sftpChannel;
public static void main(String[] args) {
TransLogTOT transLogTOT = new TransLogTOT();
transLogTOT.setAccount_number("test123");
transLogTOT.setActual_amount(new BigDecimal(12));
transLogTOT.setAmount(new BigDecimal(50));
transLogTOT.setTransaction_id("asdfkdhsh158255");
transLogTOT.setInvoice_number("2345888");
transLogTOT.setVat_code(2);
transLogTOT.setVat(new BigDecimal(5));
List<TransLogTOT> logTOTS = new ArrayList<>();
logTOTS.add(transLogTOT);
logTOTS.add(transLogTOT);
new TOTReportPdfService().generatorPdf("test.pdf", logTOTS, "3G");
}
public void generatorPdf(String outPutFilePath, List<TransLogTOT> dataList, String headerSuffix){
if (Objects.isNull(dataList)){
throw new NullPointerException("dataList cannot be null");
}
Document document = new Document(PageSize.A4, 20, 20, 50, 20);
File outputFile = new File(outPutFilePath);
try {
//设置输出位置
PdfWriter.getInstance(document, new FileOutputStream(outputFile));
//打开文档
document.open();
//字体格式
Font font = FontFactory.getFont(thaiFont, BaseFont.IDENTITY_H, false);
//表头
PdfPTable tableHeader = createHeaderTable(font, headerSuffix);
document.add(tableHeader);
//表体
PdfPTable tableBody = new PdfPTable(13);
createBody(tableBody, dataList, font);
document.add(tableBody);
} catch (DocumentException e) {
e.printStackTrace();
log.error("TOTReportPdfService.generatorPdf 文件创建失败。{}", e.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
log.error("TOTReportPdfService.generatorPdf 找不到文件{}", e.getMessage());
} finally {
document.close();
}
}
private void createBody(PdfPTable tableBody, List<TransLogTOT> dataList, Font font) {
int i = 0;
BigDecimal actualAmountTotal = new BigDecimal(0.00);//实缴总额
BigDecimal vatTotal = new BigDecimal(0.00);//增值税总额
BigDecimal amountTotal = new BigDecimal(0.00);
for (TransLogTOT tot:dataList) {
i++;
tableBody.addCell(createPdfPCell(i + ""));
tableBody.addCell(createPdfPCell(tot.getTransaction_id()));
tableBody.addCell(createPdfPCell(tot.getAccount_number()));
tableBody.addCell(createPdfPCell(tot.getInvoice_number()));
tableBody.addCell(createPdfPCell(""));
tableBody.addCell(createPdfPCell(convertVatCode(tot.getVat_code())));
actualAmountTotal = actualAmountTotal.add(tot.getActual_amount());
tableBody.addCell(createPdfPCell(tot.getActual_amount().toString()));
vatTotal = vatTotal.add(tot.getVat());
tableBody.addCell(createPdfPCell(tot.getVat().toString()));
amountTotal = amountTotal.add(tot.getAmount());
tableBody.addCell(createPdfPCell(tot.getAmount().toString()));
tableBody.addCell(createPdfPCell("0.00"));//ภาษี 税 taxTotal
tableBody.addCell(createPdfPCell(tot.getAmount().toString()));//รวม 总金额= amount + 税
tableBody.addCell(createPdfPCell("0.00"));//ยกเว้นภาษี 免税金额
tableBody.addCell(createPdfPCell(tot.getAmount().toString()));// 最终金额 = 总金额 + 免税金额
}
//统计
tableBody.addCell(createPdfPCell("รวมทั้งสิ้น", font, 1, 1, Element.ALIGN_CENTER));
addEmptyPdfCell(tableBody, 5);
tableBody.addCell(createPdfPCell(actualAmountTotal.toString()));
tableBody.addCell(vatTotal.toString());
tableBody.addCell(amountTotal.toString());
tableBody.addCell("0.00");
tableBody.addCell(amountTotal.toString());
tableBody.addCell("0.00");
tableBody.addCell(amountTotal.toString());
}
private PdfPTable createHeaderTable(Font font, String headerSuffix) {
PdfPTable table = new PdfPTable(13);
//设置边距
table.setSpacingBefore(20f);
//生成表头
generatorHeader(table, font, headerSuffix);
return table;
}
/**
* 报表表头 13列 8行
* @param table
* @param font
*/
private void generatorHeader(PdfPTable table, Font font, String headerSuffix) {
table.addCell(new PdfPCell());
PdfPCell pdfPCell1 = createPdfPCell("บริษัท บลูเพย์ จำกัด", font, 10, 1, Element.ALIGN_CENTER);
table.addCell(pdfPCell1);
table.addCell(createPdfPCell("", 2, 1));
table.addCell(new PdfPCell());
table.addCell(createPdfPCell("การรับชำระผ่านช่องทางอิเล็กทรอนิกส์", font, 10, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("RP0001_" + headerSuffix, 2, 1));
Date now = new Date();
table.addCell(new PdfPCell());
table.addCell(createPdfPCell("รายงานการรับชำระประจำวัน", font, 10, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("วันที่พิมพ์ " + DateUtil.getFormatDate(now, "MM/dd/yyyy HH:mm"), font, 2, 1, Element.ALIGN_RIGHT));
Date thaiDate = DateUtils.addYears(now, 543);//泰国佛历和公历之间相差543年
table.addCell(new PdfPCell());
table.addCell(createPdfPCell("วันที่รับชำระ " + DateUtil.getFormatDate(thaiDate, "MM/dd/yyyy"), font, 10, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("Page 1 Of 1", font, 2, 1, Element.ALIGN_RIGHT));
table.addCell(createPdfPCell("Location 0BBPW", 13, 1));
table.addCell(createPdfPCell("ลำดับที่", font, 1, 3, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("เลขที่เอกสารยืนยันการทำรายการ", font, 1, 3, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("Account No. - Invoice No.", font,3,3, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("อั\u008Dตราภาษี", font,1,3, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("มูลค่าสินค้า / บริการ ที่ต้องเสียภาษี", font, 5, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("มูลค่าสินค้า / บริการ", font,1,1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("รวมทั้งสิ้น", font,1, 3, Element.ALIGN_CENTER));
addEmptyPdfCell(table, 6);
table.addCell(createPdfPCell("ภาษี 7% ", font, 3, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("ภาษี 0% ", font,1 , 2, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("รวม", font, 1,2, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("ยกเว้นภาษี", font, 1,2, Element.ALIGN_CENTER));
//addEmptyPdfCell(table, 1);
addEmptyPdfCell(table, 6);
table.addCell(createPdfPCell("มูลค่าสุทธิ", font, 1,1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("ภาษีมูลค่าเพิ่ม", font, 1, 1, Element.ALIGN_CENTER));
table.addCell(createPdfPCell("รวม", font, 1,1, Element.ALIGN_CENTER));
}
private void addEmptyPdfCell(PdfPTable table, int total) {
for (int i = 0; i < total; i++) {
table.addCell(new PdfPCell());
}
}
private PdfPCell createPdfPCell(String text) {
return createPdfPCell(text, null, 1, 1, Element.ALIGN_RIGHT);
}
private PdfPCell createPdfPCell(String text, int colSpan, int rowSpan) {
return createPdfPCell(text, null, colSpan, rowSpan, Element.ALIGN_RIGHT);
}
private PdfPCell createPdfPCell(String text, Font font, int colSpan, int rowSpan, int align) {
PdfPCell pdfPCell = new PdfPCell();
pdfPCell.setColspan(colSpan);
pdfPCell.setRowspan(rowSpan);
pdfPCell.setPhrase(createParagraph(text, font));
pdfPCell.setHorizontalAlignment(align);
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
return pdfPCell;
}
private Paragraph createParagraph(String text, Font font) {
Paragraph paragraph;
if (Objects.isNull(font)){
paragraph = new Paragraph(text);
} else {
paragraph = new Paragraph(text, font);
}
paragraph.setAlignment(Phrase.ALIGN_CENTER);
return paragraph;
}
}