Java 生成pdf表格文档

最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成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;
}


}

猜你喜欢

转载自www.cnblogs.com/canmeng-cn/p/9078089.html