后端Itext生成pdf到传到前端,支票打印A4纸

@GetMapping(value = "/zppdf/{id}", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<InputStreamResource> index(@Valid @PathVariable("id") int id) throws DocumentException, IOException {

        var headers = new HttpHeaders();
        headers.add("Content-Disposition", "inline; filename=demo.pdf");
        Lrxgzp it = lrxgzpRepository.findById(id).orElseThrow();
        var bis = createDocument(toDyView(it));
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentType(MediaType.APPLICATION_PDF)
                .body(new InputStreamResource(bis));

    }

private ByteArrayInputStream createDocument(LrxgzpDyView view) throws DocumentException, IOException {
       /* Rectangle rectangle = new Rectangle(637.8f, 226.77f);
        var document = new Document(rectangle);*/
        var document = new Document(PageSize.A4);
        var out = new ByteArrayOutputStream();
        document.setMargins(0, 0, 0, 0);
        //document.setPageSize(PageSize.A4);
        PdfWriter.getInstance(document, out);
        document.open();
        addContent(document, view);
        document.close();
        return new ByteArrayInputStream(out.toByteArray());
    }


private void addContent(Document document, LrxgzpDyView view) throws DocumentException, IOException {
       /* var preface = new Paragraph("零一二三四五六七八九十".repeat(20), pdfFontHelper.getOrange());

        var table = new PdfPTable(1);
        table.setHorizontalAlignment(0);
        //可打印宽度为:595.27f - 8.5f
        table.setTotalWidth(595.27f);
        table.setWidths(new int[]{1});
        table.setLockedWidth(true);
        PdfPCell cell = new PdfPCell();
        cell.addElement(preface);
        cell.setPaddingLeft(8.5f);
        cell.disableBorderSide(15);
        table.addCell(cell);*/
        var preface = new Paragraph();
        // add a table
        createTable(preface, view);
        // now add all this to the document
        document.add(preface);
    }

    private void createTable(Paragraph preface, LrxgzpDyView view) throws DocumentException, IOException {
        //自己封装好的字体以及大小 new Font(simsun, 9, Font.NORMAL, BaseColor.BLACK);
        Font font1 = pdfFontHelper.getOrange();
        Font font2 = pdfFontHelper.getWatermelon();

        var table = new PdfPTable(2);
        table.setHorizontalAlignment(0);
        table.setTotalWidth(595.27f);
        table.setWidths(new int[]{13, 50});
        table.setLockedWidth(true);

        //左边
        var tableLeft = new PdfPTable(3);
        tableLeft.setHorizontalAlignment(0);
        tableLeft.setTotalWidth(102.05f);
        tableLeft.setWidths(new int[]{20, 7, 9});
        tableLeft.setLockedWidth(true);
        //左边附加信息
        //设置Paragraph的样式需要在添加进单元格之前设置好
        Paragraph p1 = new Paragraph(view.getZpfjxx(), font1);
        p1.setFirstLineIndent(25.51f);
        p1.setLeading(0f, 1.3f);
        PdfPCell cell = new PdfPCell();
        cell.addElement(p1);
        cell.setColspan(3);
        cell.setFixedHeight(42.52f);
        cell.setMinimumHeight(42.52f);
        //隐藏单元格全部边框
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        //左边出票日期
        Paragraph cprq = new Paragraph(view.getCpYear(), font1);
        //28.35f
        cprq.setFirstLineIndent(29f);
        cprq.setLeading(13f);
        cell = new PdfPCell();
        cell.addElement(cprq);
        cell.setFixedHeight(21.25f);
        cell.setMinimumHeight(21.25f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        Paragraph month = new Paragraph(view.getCpMonth(), font1);
        month.setFirstLineIndent(1.5f);
        month.setLeading(13f);
        cell = new PdfPCell();
        cell.addElement(month);
        cell.setFixedHeight(21.25f);
        cell.setMinimumHeight(21.25f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        Paragraph day = new Paragraph(view.getCpDay(), font1);
        day.setFirstLineIndent(1.5f);
        day.setLeading(13f);
        cell = new PdfPCell();
        cell.addElement(day);
        cell.setFixedHeight(21.25f);
        cell.setMinimumHeight(21.25f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        //左边收款人
        Paragraph p2 = new Paragraph(view.getSkrName(), font1);
        //22.68f
        p2.setFirstLineIndent(23.5f);
        p2.setLeading(11f);
        cell = new PdfPCell();
        cell.addElement(p2);
        cell.setColspan(3);
        cell.setFixedHeight(28.35f);
        cell.setMinimumHeight(28.35f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        //左边金额
        Paragraph je = new Paragraph(view.getJe(), font1);
        je.setFirstLineIndent(23.5f);
        je.setLeading(8f);
        cell = new PdfPCell();
        cell.addElement(je);
        cell.setColspan(3);
        cell.setFixedHeight(14.17f);
        cell.setMinimumHeight(14.17f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);
        //左边用途
        Paragraph yt = new Paragraph(view.getZpyt(), font1);
        yt.setFirstLineIndent(23.5f);
        yt.setLeading(8f);
        cell = new PdfPCell();
        cell.addElement(yt);
        cell.setColspan(3);
        cell.setFixedHeight(14.17f);
        cell.setMinimumHeight(14.17f);
        cell.disableBorderSide(15);
        tableLeft.addCell(cell);

        //左边最大单元格
        var c1 = new PdfPCell(tableLeft);
        c1.setPaddingLeft(8.5f);
        c1.setPaddingTop(75.12f);
        c1.setPaddingRight(8.5f);
        c1.disableBorderSide(15);
        c1.setUseVariableBorders(true);
        table.addCell(c1);

        //右边大单元格
        PdfPCell c2 = new PdfPCell();
        c2.setPaddingLeft(49.6f);
        //42.52f
        c2.setPaddingTop(41.1f);
        c2.disableBorderSide(15);
        c2.setHorizontalAlignment(Element.ALIGN_LEFT);
        //右边内容定位表格
        var tablePos = new PdfPTable(1);
        tablePos.setTotalWidth(413.85f);
        tablePos.setLockedWidth(true);
        PdfPCell tablePosCell = new PdfPCell();
        tablePosCell.setPaddingLeft(0f);
        tablePosCell.setPaddingTop(0f);
        tablePosCell.disableBorderSide(15);
        tablePosCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        tablePosCell.setHorizontalAlignment(Element.ALIGN_LEFT);

        //右边出票日期
        var table2 = new PdfPTable(8);
        table2.setTotalWidth(413.85f);
        table2.setWidths(new int[]{23, 18, 3, 13, 3, 13, 3, 70});
        table2.setLockedWidth(true);
        PdfPCell ce = new PdfPCell();
        ce.disableBorderSide(15);
        table2.addCell(ce);
        //右边出票日期大写年
        Paragraph yearDx = new Paragraph(view.getCpYearDx(), font1);
        yearDx.setLeading(9f);
        yearDx.setAlignment(Element.ALIGN_CENTER);
        ce = new PdfPCell();
        ce.disableBorderSide(15);
        ce.addElement(yearDx);
        ce.setFixedHeight(14.17f);
        ce.setMinimumHeight(14.17f);
        table2.addCell(ce);

        ce = new PdfPCell();
        ce.disableBorderSide(15);
        table2.addCell(ce);

        //右边出票日期大写月
        Paragraph monthDx = new Paragraph(view.getCpMonthDx(), font1);
        monthDx.setLeading(9f);
        monthDx.setAlignment(Element.ALIGN_CENTER);
        ce = new PdfPCell();
        ce.disableBorderSide(15);
        ce.addElement(monthDx);
        ce.setFixedHeight(14.17f);
        ce.setMinimumHeight(14.17f);
        table2.addCell(ce);

        ce = new PdfPCell();
        ce.disableBorderSide(15);
        table2.addCell(ce);

        //右边出票日期大写日
        Paragraph dayDx = new Paragraph(view.getCpDayDx(), font1);
        dayDx.setLeading(9f);
        dayDx.setAlignment(Element.ALIGN_CENTER);
        ce = new PdfPCell();
        ce.disableBorderSide(15);
        ce.addElement(dayDx);
        ce.setFixedHeight(14.17f);
        ce.setMinimumHeight(14.17f);
        table2.addCell(ce);

        ce= new PdfPCell();
        ce.disableBorderSide(15);
        table2.addCell(ce);

        ce = new PdfPCell();
        ce.disableBorderSide(15);
        table2.addCell(ce);
        tablePosCell.addElement(table2);

        //右边收款人
        var rSkrTable = new PdfPTable(1);
        rSkrTable.setTotalWidth(413.85f);
        rSkrTable.setWidths(new int[]{1});
        rSkrTable.setLockedWidth(true);
        Paragraph pskr = new Paragraph(14.17f, view.getSkrName(), font1);
        pskr.setFirstLineIndent(31.18f);
        pskr.setLeading(10f);
        PdfPCell rSkrTablecell = new PdfPCell();
        rSkrTablecell.disableBorderSide(15);
        rSkrTablecell.setFixedHeight(17.01f);
        rSkrTablecell.addElement(pskr);
        rSkrTable.addCell(rSkrTablecell);
        tablePosCell.addElement(rSkrTable);

        //右边金额
        var table3 = new PdfPTable(13);
        table3.setTotalWidth(413.85f);
        table3.setWidths(new int[]{13, 89, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4});
        table3.setLockedWidth(true);
        PdfPCell table3cell1 = new PdfPCell();
        table3cell1.disableBorderSide(15);
        table3cell1.setRowspan(2);
        table3.addCell(table3cell1);
        PdfPCell table3cell2 = new PdfPCell();
        table3cell2.disableBorderSide(15);
        table3cell2.setRowspan(2);
        table3cell2.setFixedHeight(25.51f);
        //右边大写金额
        Paragraph jeDx = new Paragraph(view.getJeDx(), font2);
        jeDx.setLeading(16f);
        table3cell2.addElement(jeDx);
        table3.addCell(table3cell2);

        for (int i = 0; i < 11; i++) {
            PdfPCell cell2 = new PdfPCell();
            cell2.disableBorderSide(15);
            cell2.setFixedHeight(11.34f);
            table3.addCell(cell2);
        }

        PdfPCell table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je1 = new Paragraph(view.getYw(), font1);
        je1.setLeading(10f);
        table3c3.addElement(je1);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);


        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je11 = new Paragraph(view.getQww(), font1);
        je11.setLeading(10f);
        table3c3.addElement(je11);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je2 = new Paragraph(view.getBww(), font1);
        je2.setLeading(10f);
        table3c3.addElement(je2);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je3 = new Paragraph(view.getSww(), font1);
        je3.setLeading(10f);
        table3c3.addElement(je3);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je4 = new Paragraph(view.getWw(), font1);
        je4.setLeading(10f);
        table3c3.addElement(je4);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je5 = new Paragraph(view.getQw(), font1);
        je5.setLeading(10f);
        table3c3.addElement(je5);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je6 = new Paragraph(view.getBw(), font1);
        je6.setLeading(10f);
        table3c3.addElement(je6);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je7 = new Paragraph(view.getSw(), font1);
        je7.setLeading(10f);
        table3c3.addElement(je7);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je8 = new Paragraph(view.getGw(), font1);
        je8.setLeading(10f);
        table3c3.addElement(je8);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je9 = new Paragraph(view.getSfw(), font1);
        je9.setLeading(10f);
        table3c3.addElement(je9);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        table3c3 = new PdfPCell();
        table3c3.disableBorderSide(15);
        Paragraph je10 = new Paragraph(view.getBfw(), font1);
        je10.setLeading(10f);
        table3c3.addElement(je10);
        table3c3.setFixedHeight(14.17f);
        table3.addCell(table3c3);

        tablePosCell.addElement(table3);

        //用途密码
        var table4 = new PdfPTable(2);
        table4.setTotalWidth(413.85f);
        table4.setWidths(new int[]{1, 1});
        table4.setLockedWidth(true);
        PdfPCell table4cell = new PdfPCell();
        table4cell.disableBorderSide(15);
        Paragraph table4p1 = new Paragraph(view.getZpyt(), font1);
        table4p1.setFirstLineIndent(19.84f);
        table4cell.addElement(table4p1);
        table4cell.setPaddingTop(3f);
        table4.addCell(table4cell);
        table4cell = new PdfPCell();
        table4cell.disableBorderSide(15);
        Paragraph table4p2 = new Paragraph(view.getZpmm(), font1);
        table4p2.setFirstLineIndent(56.69f);
        table4cell.addElement(table4p2);
        table4cell.setPaddingTop(3f);
        table4.addCell(table4cell);
        tablePosCell.addElement(table4);

        tablePos.addCell(tablePosCell);
        c2.addElement(tablePos);
        table.addCell(c2);
        preface.add(table);

    }

1毫米 对应代码中 72/25.4 f,即想要宽度为1mm,则需要在代码中设置 2.83f (浮点数)

前端我用vue+elementUI

   <el-dialog title :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
        <div align="center">
          <span>选择支票模板</span>
          <el-select v-model="zpmb" placeholder="请选择支票模板" @change="changeZpmb">
            <el-option v-for="it in zpmbs" :key="it.num" :label="it.name" :value="it.num" />
          </el-select>
        </div>
        <div align="center" style="margin-top:20px;">
          <span>
            <el-button @click="handleClose">取 消</el-button>
            <el-link
              :href="ahref"
              target="_blank"
              :disabled="disableYl"
              @click="dialogVisible=false"
            >
              <el-button type="primary" :disabled="disableYl" @click="dialogVisible=false">预览</el-button>
            </el-link>
          </span>
        </div>
      </el-dialog>

也可以直接用a标签

this.ahref = `/api/xxxx/lrxgzp/zppdf/${this.selectllist[0].id}`;

效果如下图

打印到支票上效果图

原文地址:https://www.cnblogs.com/pzw23/p/13441950.html