java生成pdf并预览或下载
<!-itextpdf的两个jar包->
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
public class Test { public static void main(String[] args) { dkzzszyfp(); } /** * 代开增值税专用发票缴纳税款申报单 */ public static void dkzzszyfp() { // 1:建立Document对象实例 Document document = new Document(); try { // 2:建立一个PDF 写入器与document对象关联通过书写器(Writer)可以将文档写入到磁盘中 StringBuilder filename = new StringBuilder(); filename.append("代开增值税专用发票缴纳税款申报单").append(new SimpleDateFormat("yyyyMMddHHmm").format(new Date())).append(".pdf");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
//PdfWriter.getInstance(document, new FileOutputStream(filename.toString()));
// 3:打开文档 document.open(); //解决中文不显示问题 BaseFont bfChinese = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H, BaseFont.NOT_EMBEDDED); Font fontChina18 = new Font(bfChinese, 18); Font fontChina12 = new Font(bfChinese, 12); // 4:向文档添加内容 // 标题 Paragraph titleParagraph = new Paragraph("代开增值税专用发票缴纳税款申报单", fontChina18); titleParagraph.setAlignment(Element.ALIGN_CENTER);// 居中 document.add(titleParagraph); // 空格 Paragraph blank1 = new Paragraph(" "); document.add(blank1); // 编号 Chunk c1 = new Chunk("编号:", fontChina12); Chunk c2 = new Chunk("20140531001", fontChina12); Paragraph snoParagraph = new Paragraph(); snoParagraph.add(c1); snoParagraph.add(c2); snoParagraph.setAlignment(Element.ALIGN_RIGHT); document.add(snoParagraph); // 空格 document.add(blank1); // 代开税务机关 Chunk c3 = new Chunk("代开税务机关名称:青岛经济技术开发区国税局", fontChina12); Paragraph dkswjgParagraph = new Paragraph(); dkswjgParagraph.add(c3); dkswjgParagraph.setAlignment(Element.ALIGN_LEFT); document.add(dkswjgParagraph); // 提醒 String alert = "我单位提供的开票资料真实、完整、准确,符合有关法律、法规,否则我单位将承担一切法律责任,现申请代开增值税专用发票。"; Paragraph alertParagraph = new Paragraph(alert, fontChina12); alertParagraph.setFirstLineIndent(24);// 首行缩进个2字符 document.add(alertParagraph); // 填开日期 Chunk c5 = new Chunk("填开日期:2014年05月31日", fontChina12); Paragraph tkrqParagraph = new Paragraph(); tkrqParagraph.add(c5); tkrqParagraph.setAlignment(Element.ALIGN_RIGHT); document.add(tkrqParagraph); // 空格 document.add(blank1); // 表格处理 PdfPTable table = new PdfPTable(8);// 八列 table.setWidthPercentage(100);// 表格宽度为100% // 购货单位 PdfPCell cell1 = new PdfPCell(); cell1.setBorderWidth(0.5F);// Border宽度为1 cell1.setRowspan(3);// 跨三行 cell1.setPhrase(new Paragraph("购货单位", fontChina12)); cell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell1.setExtraParagraphSpace(10); table.addCell(cell1); PdfPCell cell2 = new PdfPCell(); cell2.setBorderWidth(0.5F); cell2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell2.setPhrase(new Paragraph("名称", fontChina12)); table.addCell(cell2); PdfPCell cell3 = new PdfPCell(); cell3.setBorderWidth(0.5F); cell3.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell3.setColspan(3);// 跨三列 cell3.setPhrase(new Paragraph("名称", fontChina12)); table.addCell(cell3); PdfPCell cell4 = new PdfPCell(); cell4.setBorderWidth(0.5F); cell4.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell4.setPhrase(new Paragraph("税务登记号", fontChina12)); table.addCell(cell4); PdfPCell cell5 = new PdfPCell(); cell5.setBorderWidth(0.5F); cell5.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell5.setColspan(2);// 跨两列 cell5.setPhrase(new Paragraph("税务登记号", fontChina12)); table.addCell(cell5); PdfPCell cell6 = new PdfPCell(); cell6.setBorderWidth(0.5F); cell6.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell6.setPhrase(new Paragraph("地址", fontChina12)); table.addCell(cell6); PdfPCell cell7 = new PdfPCell(); cell7.setBorderWidth(0.5F); cell7.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell7.setColspan(3);// 跨三列 cell7.setPhrase(new Paragraph("地址", fontChina12)); table.addCell(cell7); PdfPCell cell8 = new PdfPCell(); cell8.setBorderWidth(0.5F); cell8.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell8.setPhrase(new Paragraph("开户银行", fontChina12)); table.addCell(cell8); PdfPCell cell9 = new PdfPCell(); cell9.setBorderWidth(0.5F); cell9.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell9.setColspan(2);// 跨两列 cell9.setPhrase(new Paragraph("开户银行", fontChina12)); table.addCell(cell9); PdfPCell cell10 = new PdfPCell(); cell10.setBorderWidth(0.5F); cell10.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell10.setPhrase(new Paragraph("电话", fontChina12)); table.addCell(cell10); PdfPCell cell11 = new PdfPCell(); cell11.setBorderWidth(0.5F); cell11.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell11.setColspan(3);// 跨三列 cell11.setPhrase(new Paragraph("电话", fontChina12)); table.addCell(cell11); PdfPCell cell12 = new PdfPCell(); cell12.setBorderWidth(0.5F); cell12.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell12.setPhrase(new Paragraph("开户银行账号", fontChina12)); table.addCell(cell12); PdfPCell cell13 = new PdfPCell(); cell13.setBorderWidth(0.5F); cell13.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell13.setColspan(2);// 跨两列 cell13.setPhrase(new Paragraph("开户银行账号", fontChina12)); table.addCell(cell13); // 货物或应税劳务信息 // Row1 PdfPCell cell14 = new PdfPCell(); cell14.setBorderWidth(0.5F); cell14.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell14.setPhrase(new Paragraph("货物或应税劳务名称", fontChina12)); table.addCell(cell14); PdfPCell cell15 = new PdfPCell(); cell15.setBorderWidth(0.5F); cell15.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell15.setPhrase(new Paragraph("规格型号", fontChina12)); table.addCell(cell15); PdfPCell cell16 = new PdfPCell(); cell16.setBorderWidth(0.5F); cell16.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell16.setPhrase(new Paragraph("计量单位", fontChina12)); table.addCell(cell16); PdfPCell cell17 = new PdfPCell(); cell17.setBorderWidth(0.5F); cell17.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell17.setPhrase(new Paragraph("数量", fontChina12)); table.addCell(cell17); PdfPCell cell18 = new PdfPCell(); cell18.setBorderWidth(0.5F); cell18.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell18.setPhrase(new Paragraph("单价", fontChina12)); table.addCell(cell18); PdfPCell cell19 = new PdfPCell(); cell19.setBorderWidth(0.5F); cell19.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell19.setPhrase(new Paragraph(" 金额", fontChina12)); table.addCell(cell19); PdfPCell cell20 = new PdfPCell(); cell20.setBorderWidth(0.5F); cell20.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell20.setPhrase(new Paragraph("征收率", fontChina12)); table.addCell(cell20); PdfPCell cell21 = new PdfPCell(); cell21.setBorderWidth(0.5F); cell21.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell21.setPhrase(new Paragraph("税额", fontChina12)); table.addCell(cell21); // Row2 填写数据 PdfPCell cell22 = new PdfPCell(); cell22.setBorderWidth(0.5F); cell22.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell22.setPhrase(new Paragraph("货物或应税劳务名称", fontChina12)); table.addCell(cell22); PdfPCell cell23 = new PdfPCell(); cell23.setBorderWidth(0.5F); cell23.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell23.setPhrase(new Paragraph("规格型号", fontChina12)); table.addCell(cell23); PdfPCell cell24 = new PdfPCell(); cell24.setBorderWidth(0.5F); cell24.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell24.setPhrase(new Paragraph("计量单位", fontChina12)); table.addCell(cell24); PdfPCell cell25 = new PdfPCell(); cell25.setBorderWidth(0.5F); cell25.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell25.setPhrase(new Paragraph("数量", fontChina12)); table.addCell(cell25); PdfPCell cell26 = new PdfPCell(); cell26.setBorderWidth(0.5F); cell26.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell26.setPhrase(new Paragraph("单价", fontChina12)); table.addCell(cell26); PdfPCell cell27 = new PdfPCell(); cell27.setBorderWidth(0.5F); cell27.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell27.setPhrase(new Paragraph(" 金额", fontChina12)); table.addCell(cell27); PdfPCell cell28 = new PdfPCell(); cell28.setBorderWidth(0.5F); cell28.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell28.setPhrase(new Paragraph("征收率", fontChina12)); table.addCell(cell28); PdfPCell cell29 = new PdfPCell(); cell29.setBorderWidth(0.5F); cell29.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell29.setPhrase(new Paragraph("税额", fontChina12)); table.addCell(cell29); // 价税合计 PdfPCell cell30 = new PdfPCell(); cell30.setBorderWidth(0.5F); cell30.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell30.setPhrase(new Paragraph("价税合计(大写)", fontChina12)); table.addCell(cell30); PdfPCell cell31 = new PdfPCell(); cell31.setBorderWidth(0.5F); cell31.setColspan(4);// 跨四列 cell31.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell31.setPhrase(new Paragraph("价税合计(大写)", fontChina12)); table.addCell(cell31); PdfPCell cell32 = new PdfPCell(); cell32.setBorderWidth(0.5F); cell32.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell32.setPhrase(new Paragraph("价税合计(小写)", fontChina12)); table.addCell(cell32); PdfPCell cell33 = new PdfPCell(); cell33.setBorderWidth(0.5F); cell33.setColspan(2);// 跨两列 cell33.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell33.setPhrase(new Paragraph("价税合计(小写)", fontChina12)); table.addCell(cell33); // 备注 PdfPCell cell34 = new PdfPCell(); cell34.setBorderWidth(0.5F); cell34.setMinimumHeight(40); cell34.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell34.setPhrase(new Paragraph("备注", fontChina12)); table.addCell(cell34); PdfPCell cell35 = new PdfPCell(); cell35.setBorderWidth(0.5F); cell35.setColspan(7); cell35.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell35.setPhrase(new Paragraph("备注", fontChina12)); table.addCell(cell35); // 销货单位 PdfPCell cell36 = new PdfPCell(); cell36.setBorderWidth(0.5F);// Border宽度为1 cell36.setRowspan(3);// 跨三行 cell36.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell36.setPhrase(new Paragraph("销货单位", fontChina12)); table.addCell(cell36); PdfPCell cell37 = new PdfPCell(); cell37.setBorderWidth(0.5F); cell37.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell37.setPhrase(new Paragraph("名称", fontChina12)); table.addCell(cell37); PdfPCell cell38 = new PdfPCell(); cell38.setBorderWidth(0.5F); cell38.setColspan(3);// 跨三列 cell38.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell38.setPhrase(new Paragraph("名称", fontChina12)); table.addCell(cell38); PdfPCell cell39 = new PdfPCell(); cell39.setBorderWidth(0.5F); cell39.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell39.setPhrase(new Paragraph("税务登记号", fontChina12)); table.addCell(cell39); PdfPCell cell40 = new PdfPCell(); cell40.setBorderWidth(0.5F); cell40.setColspan(2);// 跨两列 cell40.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell40.setPhrase(new Paragraph("税务登记号", fontChina12)); table.addCell(cell40); PdfPCell cell41 = new PdfPCell(); cell41.setBorderWidth(0.5F); cell41.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell41.setPhrase(new Paragraph("地址", fontChina12)); table.addCell(cell41); PdfPCell cell42 = new PdfPCell(); cell42.setBorderWidth(0.5F); cell42.setColspan(3);// 跨三列 cell42.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell42.setPhrase(new Paragraph("地址", fontChina12)); table.addCell(cell42); PdfPCell cell43 = new PdfPCell(); cell43.setBorderWidth(0.5F); cell43.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell43.setPhrase(new Paragraph("开户银行", fontChina12)); table.addCell(cell43); PdfPCell cell44 = new PdfPCell(); cell44.setBorderWidth(0.5F); cell44.setColspan(2);// 跨两列 cell44.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell44.setPhrase(new Paragraph("开户银行", fontChina12)); table.addCell(cell44); PdfPCell cell45 = new PdfPCell(); cell45.setBorderWidth(0.5F); cell45.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell45.setPhrase(new Paragraph("电话", fontChina12)); table.addCell(cell45); PdfPCell cell46 = new PdfPCell(); cell46.setBorderWidth(0.5F); cell46.setColspan(3);// 跨三列 cell46.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell46.setPhrase(new Paragraph("电话", fontChina12)); table.addCell(cell46); PdfPCell cell47 = new PdfPCell(); cell47.setBorderWidth(0.5F); cell47.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell47.setPhrase(new Paragraph("开户银行账号", fontChina12)); table.addCell(cell47); PdfPCell cell48 = new PdfPCell(); cell48.setBorderWidth(0.5F); cell48.setColspan(2);// 跨两列 cell48.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell48.setPhrase(new Paragraph("开户银行账号", fontChina12)); table.addCell(cell48); // 底部 Paragraph pQz = new Paragraph("(签字)", fontChina12); pQz.setAlignment(Element.ALIGN_RIGHT); pQz.setIndentationRight(20); pQz.setExtraParagraphSpace(60); Paragraph pJbrQz = new Paragraph("申请经办人(签字)", fontChina12); pJbrQz.setAlignment(Element.ALIGN_RIGHT); pJbrQz.setIndentationRight(20); pJbrQz.setExtraParagraphSpace(60); Paragraph pDate = new Paragraph(" 年 月 日", fontChina12); pDate.setAlignment(Element.ALIGN_RIGHT); pQz.setIndentationRight(20); PdfPCell cellF1 = new PdfPCell(); cellF1.setBorderWidth(0.5F); cellF1.setColspan(2); cellF1.setFixedHeight(200);// Paragraph p0 = new Paragraph("税务机关税款征收岗位税收完税凭证号:", fontChina12); cellF1.addElement(p0); cellF1.addElement(blank1); cellF1.addElement(blank1); cellF1.addElement(blank1); cellF1.addElement(pQz); cellF1.addElement(pDate); table.addCell(cellF1); PdfPCell cellF2 = new PdfPCell(); cellF2.setBorderWidth(0.5F); cellF2.setColspan(3); Paragraph p1 = new Paragraph("税务机关xxx岗位", fontChina12); Paragraph p2 = new Paragraph("发票代码: ", fontChina12); Paragraph p3 = new Paragraph("发票号码: ", fontChina12); cellF2.addElement(p1); cellF2.addElement(p2); cellF2.addElement(p3); cellF2.addElement(blank1); cellF2.addElement(blank1); cellF2.addElement(pQz); cellF2.addElement(pDate); table.addCell(cellF2); PdfPCell cellF3 = new PdfPCell(); cellF3.setBorderWidth(0.5F); cellF3.setColspan(3); Paragraph p4 = new Paragraph("经核对,所开发票与申报单内容一致。", fontChina12); p4.setFirstLineIndent(24); cellF3.addElement(p4); cellF3.addElement(blank1); cellF3.addElement(blank1); cellF3.addElement(blank1); cellF3.addElement(pJbrQz); cellF3.addElement(pDate); table.addCell(cellF3); document.add(table); document.add(blank1); //底部额外信息 StringBuilder sb1 = new StringBuilder(); sb1.append("申请xxx纳税人(公章)_________"); sb1.append("法人代表_________"); sb1.append("财务负责人_________"); sb1.append("填写人_________"); Paragraph pE = new Paragraph(sb1.toString(), fontChina12); pE.setAlignment(Element.ALIGN_CENTER); document.add(pE); document.add(blank1); //注 StringBuilder sb2 = new StringBuilder(); sb2.append("注:第一联:税务机关xxx岗位留存。"); sb2.append("第二联:税务机关税款征收岗位留存。"); Paragraph pZ = new Paragraph(sb2.toString(), fontChina12); pZ.setAlignment(Element.ALIGN_CENTER); document.add(pZ); // 5:关闭文档 document.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
制作效果
若需要下载或预览
/** * @param debtId 主表Id * @param type 1:预览,2:下载 * @param scene 表单场景 1:撤销申请表 * @param response * @throws IOException */ @ApiOperation(value = "预览或下载模板") @GetMapping("/viewordownload") @ResponseBody public void download(@RequestParam(name = "debtId") Long debtId, @RequestParam(name = "type") Integer type, @RequestParam(name = "scene") Integer scene, HttpServletResponse response) throws IOException { OutputStream out = null; try { TemplateVo templateVo = debtTemplateService.createPdf(debtId, scene); if (Objects.isNull(templateVo)) { throw new BusinessException("参数有误未生成pdf"); } ByteArrayOutputStream baos = templateVo.getByteArrayOutputStream(); //设置请求返回类型 if (2 == type) { response.setHeader("Content-Disposition", "attachment; filename=" + new String(templateVo.getName().getBytes(), StandardCharsets.ISO_8859_1)); } response.setContentLength(baos.size()); out = response.getOutputStream(); baos.writeTo(out); out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { out.close(); } }
直接上代码示例
文章参考 https://www.cnblogs.com/ssslinppp/p/4976922.html