51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

最终生成的PDF预览 {#最终生成的PDF预览}

2887840256

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

参考官方Demo

项目整合itext7(7.1.13) {#项目整合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方法 {#绘制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(&quot;072201130001&quot;);
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(&quot;发车站:&quot;).setFont(PDFUtil.getChineseFont())
                                        .add(new Text(&quot;  郑州高铁长途枢纽站&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;&quot;))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;发车时间:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  19:00&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;&quot;))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;班次号:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  HJ03&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;车牌号:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  豫GH6666&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;线路:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  郑州-漯河&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;&quot;))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;单据号:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  072201130001&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;检票人数:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  12&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;类别:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                                        .add(new Text(&quot;  固定班&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)))
                        )
                        .addCell(new Cell(1, 2).setPaddingLeft(0)
                                .setBorder(null)
                                .add(new Paragraph(&quot;&quot;))
                        )
        ));

// 中间部分
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(&quot;到达站&quot;).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(&quot;票价&quot;).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(&quot;人数&quot;).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(&quot;检票收入&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(18)));

for (int i = 0; i &amp;lt; 10; i++) {
    detail.addCell(new Cell(1, 1).add(new Paragraph(&quot;&quot;)
            .add(new Text(&quot;站点&quot; + i).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
    detail.addCell(new Cell(1, 1).add(new Paragraph(&quot;&quot;)
            .add(new Text(i + &quot;元&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
    detail.addCell(new Cell(1, 1).add(new Paragraph(&quot;&quot;)
            .add(new Text(i + &quot;人&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setTextAlignment(TextAlignment.CENTER));
    detail.addCell(new Cell(1, 1).add(new Paragraph(&quot;&quot;)
            .add(new Text(i + &quot;收入&quot;).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(&quot;总人数:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                .add(new Text(&quot;10&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
        .addCell(new Cell(1, 1).add(new Paragraph(&quot;结算金额:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                .add(new Text(&quot;10&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
        .addCell(new Cell(1, 1).add(new Paragraph(&quot;大写:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4)
                .add(new Text(&quot;10&quot;).setFont(PDFUtil.getChineseFont()).setFontSize(16))).setBorder(null))
        .addCell(new Cell(1, 1).add(new Paragraph(&quot;电子结算单生成时间:&quot;).setFont(PDFUtil.getChineseFont()).setMarginRight(4).setMarginTop(10)
                .add(new Text(&quot;2022-01-11 12:00:59&quot;).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文件 {#测试类调用生成PDF文件}

@SpringBootTest
class SpringbootPdfApplicationTests {
@Test
void contextLoads() throws FileNotFoundException {
    //首先你需要一个writer对象
    PdfWriter writer = new PdfWriter(&quot;D:/test.pdf&quot;);
    //需要一个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文件(三)

赞(2)
未经允许不得转载:工具盒子 » Java使用itext7生成PDF文件(一)