@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}`;
效果如下图

打印到支票上效果图
