人生若只如初见

WXY

Java使用itext7生成PDF文件(一)

2022-06-02

最终生成的PDF预览

2887840256

itext7的大部分都是和html的方法差不多,如果有前端基础使用起来会很简单。

参考官方Demo

项目整合itext7(7.1.13)

各个版本之间差异也有很多,注意自己依赖的版本

maven依赖

<!--pdf-->
<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itext7-core</artifactId>
   <version>7.1.13</version>
   <type>pom</type>
</dependency>

解决中文展示问题

/**
     * 获取中文字体
     *
     * @return
     */
    public static PdfFont getChineseFont() {
        try {
            return PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

绘制PDF方法

/**
 * @param document
 */
public void drawBaseInfo(Document document) {
    DeviceRgb black = new DeviceRgb(0, 0, 0);
    DeviceRgb gray = new DeviceRgb(72, 127, 255);
    // 黑色虚线边框
    DashedBorder grayBorder = new DashedBorder(gray, 0.5F);
    SolidBorder solidBorder = new SolidBorder(black, 0.5F);

    Table table = new Table(4).setMarginLeft(50).setMarginRight(50);
    table.setBorder(null);
    table.setMarginTop(50);

    PdfDocument pdfDocument = document.getPdfDocument();
    // 条码
    PdfPage page = pdfDocument.addNewPage();
    Barcode128 barcode128 = new Barcode128(pdfDocument);
    barcode128.setCode("072201130001");
    barcode128.setCodeType(Barcode128.CODE128);
    barcode128.fitWidth(180);
    PdfFormXObject object = barcode128.createFormXObject(ColorConstants.BLACK, ColorConstants.BLACK, pdfDocument);

    float width = object.getWidth();
    float height = object.getHeight();
    float x = 200;
    float y = 780;

    PdfCanvas canvas = new PdfCanvas(page);
    canvas.saveState();
    canvas.setFillColor(ColorConstants.WHITE);
    canvas.rectangle(x, y, width, height);
    canvas.fill();
    canvas.restoreState();
    canvas.addXObjectAt(object, x, y);
    document.setFontSize(18);
    // 头部
    table.addCell(
            new Cell(6, 4).setBorder(null).setMargin(0).setPadding(0).add(
                    new Table(4).setMargin(0).setPadding(0)
                            .setTextAlignment(TextAlignment.LEFT)
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("发车站:").setFont(PDFUtil.getChineseFont())
                                            .add(new Text("  郑州高铁长途枢纽站").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph(""))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("发车时间:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  19:00").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph(""))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("班次号:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  HJ03").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("车牌号:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  豫GH6666").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("线路:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  郑州-漯河").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph(""))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("单据号:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  072201130001").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("检票人数:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  12").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph("类别:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                            .add(new Text("  固定班").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                            )
                            .addCell(new Cell(1, 2).setPaddingLeft(0)
                                    .setBorder(null)
                                    .add(new Paragraph(""))
                            )
            ));

    // 中间部分
    Table detail = new Table(4).setMarginLeft(50).setMarginRight(50).setMarginTop(12);
    detail.addCell(new Cell(1, 1).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.CENTER)
                    .setWidth(70).setBorder(null).setBorder(solidBorder).add(new Paragraph("到达站").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
            .addCell(
                    new Cell(1, 1).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.CENTER)
                            .setWidth(70).setBorder(null).setBorder(solidBorder).add(new Paragraph("票价").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
            .addCell(
                    new Cell(1, 1).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.CENTER)
                            .setWidth(70).setBorder(null).setBorder(solidBorder).add(new Paragraph("人数").setFont(PDFUtil.getChineseFont()).setFontSize(18)))
            .addCell(
                    new Cell(1, 1).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.CENTER)
                            .setWidth(120).setBorder(null).setBorder(solidBorder).add(new Paragraph("检票收入").setFont(PDFUtil.getChineseFont()).setFontSize(18)));

    for (int i = 0; i < 10; i++) {
        detail.addCell(new Cell(1, 1).add(new Paragraph("")
                .add(new Text("站点" + i).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
        detail.addCell(new Cell(1, 1).add(new Paragraph("")
                .add(new Text(i + "元").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
        detail.addCell(new Cell(1, 1).add(new Paragraph("")
                .add(new Text(i + "人").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
        detail.addCell(new Cell(1, 1).add(new Paragraph("")
                .add(new Text(i + "收入").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
    }

    // 尾部
    Table tail = new Table(1).setMarginLeft(50).setMarginRight(50).setMarginTop(15).setBorder(null);
    tail.addCell(new Cell(1, 1).add(new Paragraph("总人数:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                    .add(new Text("10").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
            .addCell(new Cell(1, 1).add(new Paragraph("结算金额:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                    .add(new Text("10").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
            .addCell(new Cell(1, 1).add(new Paragraph("大写:").setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                    .add(new Text("10").setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
            .addCell(new Cell(1, 1).add(new Paragraph("电子结算单生成时间:").setFont(PDFUtil.getChineseFont()).setMarginRight(4).setMarginTop(10)
                    .add(new Text("2022-01-11 12:00:59").setFont(PDFUtil.getChineseFont()))).setBorder(null).setFontColor(Color.convertRgbToCmyk(gray)).setFontSize(16));
    // 整体水平居中
    table.setHorizontalAlignment(HorizontalAlignment.LEFT);
    detail.setHorizontalAlignment(HorizontalAlignment.LEFT);
    tail.setHorizontalAlignment(HorizontalAlignment.LEFT);
    document.add(table);
    document.add(detail);
    document.add(tail);
}

测试类调用生成PDF文件

@SpringBootTest
class SpringbootPdfApplicationTests {

    @Test
    void contextLoads() throws FileNotFoundException {
        //首先你需要一个writer对象
        PdfWriter writer = new PdfWriter("D:/test.pdf");
        //需要一个pdf的对象来操作pdf
        PdfDocument pdf = new PdfDocument(writer);

        //需要一个document的对象来操作数据 指定为A4大小
        Document document = new Document(pdf, PageSize.A4);
        drawBaseInfo(document);
        document.close();
    }
}

引入图片(盖章)

Image maru = new Image(ImageDataFactory.create("imgurl图片地址", true));
        maru.setFixedPosition(320, 728);// 控制图片位置
        maru.scaleAbsolute(120, 80); // 控制图片大小
        document.add(maru);

itextpdf的确定页面上的具体坐标是通过坐标来确定的。
它们的坐标轴是这样的:以左下角为原点的xy坐标轴。

2023-12-29-newkufzx.png

完整代码下载

相关文章

Java使用itext7生成PDF文件(二)

Java使用itext7生成PDF文件(三)