java画pdf案例(itext),以及在SpringBoot中的应用

一、引人眼球、唾弃无脑照搬
在这里插入图片描述
作者刚好用到的业务比较简单,没有用到图片,样式确实比较难调。
画pdf使用的是itext,这个东西好像是被收购过,不同版本的api有点不一样,不影响,测试的工具和项目中用的不一样。

 <dependency>
            <groupId>itext</groupId>
            <artifactId>itext</artifactId>
            <version>1.3.1</version>
</dependency>

<dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
 </dependency>

不同版本用法差距不大,根据项目引入版本

Rectangle pageSize = new Rectangle(PageSize.A4.height(), PageSize.A4.width());
Rectangle pageSize = new Rectangle(PageSize.A4.getHeight(), PageSize.A4.getWidth());

二、正文分割线--------------------------------------------------------------------------------------
先demo,再项目

1、引入pom

<dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
</dependency>

2、引入字体 msyh.ttf
百度下载
3、xxxUtil.java

//定义全局变量   生成文件的名称和存放样式的地方
private final static String RESULT_FILE = "D:/abcd.pdf";
private final static String FONT_PATH   = "D:/";

测试方法

 	//①建立com.lowagie.text.Document对象的实例。
        Document doc = new Document();
        //横着  竖着的话参数换个位置
        Rectangle pageSize = new Rectangle(PageSize.A4.getHeight(), PageSize.A4.getWidth());
        pageSize.rotate();
        doc.setPageSize(pageSize);
		//放样式的地
        String fontPath = "D:/";
         //②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
        PdfWriter.getInstance(doc, new FileOutputStream(RESULT_FILE));

        //③打开文档。
        doc.open();

	    Font myfont  = CommonPDFUtil.setfont(FONT_PATH + "/msyh.ttf", 13.0F, 0, Color.BLACK, 0);// 基本字体
        Font myfont3 = CommonPDFUtil.setfont(FONT_PATH + "/msyh.ttf", 18.0F, 0, Color.BLACK, 1);// 标头字体(三级字体)
         Paragraph paragraph = new Paragraph("XXX系统发货单", myfont3);// 信用报告类型
        paragraph.setAlignment(1);
        doc.add(paragraph);
        
		//这里是空白的地方搞这个
		doc.add(new Paragraph("       ", myfont));
        doc.add(new Paragraph("       ", myfont));
        //注意注意  这里是画杠杠的  上文提到的低版本支持的一个杠杠方法高版本不支持 这里用更通用的  低版本有这个Graphic对象的
        LineSeparator line = new LineSeparator(2f,100,Color.black,Element.ALIGN_CENTER,-5f);
        doc.add(line);
		 //发货单  发货日期
        PdfPTable table =  new PdfPTable(2);
        table.setTotalWidth(PageSize.A4.getHeight()*0.9f);
        table.setLockedWidth(true);
        PdfPCell cell1 = null;
        cell1 = new PdfPCell(new Phrase("发货单号:" + cSendoutDO.getSendoutNum(), myfont));
        cell1.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        table.addCell(cell1);
        cell1 = new PdfPCell(new Phrase("发货日期:" + DataCodeUtil.getYYYY_MM_DD(cSendoutDO.getSendoutDate()), myfont));
        cell1.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        table.addCell(cell1);
        doc.add(table);
		//画一条杠杠
		 doc.add(line);
		 //关闭
		doc.close();

设置样式的工具类

public class CommonPDFUtil {
    //一条线
    static final LineSeparator LINE = new LineSeparator(2f,100,Color.black,Element.ALIGN_CENTER,-5f);
    // 设置字体
    public static Font setfont(String fonttype, float fontsize, int fontflag, Color fontcolor, int fontstyle)
            throws DocumentException, IOException {
        BaseFont baseFont5 = BaseFont.createFont(fonttype, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        Font font = new Font(baseFont5, fontsize, fontflag);
        font.setColor(fontcolor);
        if (fontstyle != 0) {// 如果传参为0不设置字体
            font.setStyle(fontstyle);
        }
        return font;
    }
}

为了代码简洁性 不按照图片写了 就说涉及到的知识
基本每行都用table是最好控制样式的 初始给table设置好列 比如两列 第三个cell就会在下一行
1)table.setWidths(new int[] { 9, 31, 15, 15,10,10,10 }); 设置列得宽度,按照比例分配的
2) table.setTotalWidth(PageSize.A4.getHeight()*0.9f); 表的宽度
table.setLockedWidth(true);分配宽度就得用这个锁住
3) cell.setHorizontalAlignment(Element.ALIGN_CENTER); 内容剧中的,去掉默认靠左
4)cell.setMinimumHeight(25); 调整下行间距

 //再一个表
        PdfPTable table = new PdfPTable(7);
        PdfPCell cell = null;
        table.setWidths(new int[] { 9, 31, 15, 15,10,10,10 });
        table.setTotalWidth(PageSize.A4.getHeight()*0.9f);
        table.setLockedWidth(true);


        cell = new PdfPCell(new Phrase("序号", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("生产厂家", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("生产批号", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("生产日期", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("规模", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(20);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("箱数", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("盒数", myfont));
        cell.setBorder(PdfPCell.NO_BORDER);// Rectangle.NO_BORDER
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setMinimumHeight(25);
        table.addCell(cell);

三、附加内容
作者参考的是这位大佬的,里面又页眉、页脚、插入图片
链接如下:

传送门

demo下载
待整理(里面涉及到了业务代码,最初的demo已经修改封装了)

四、springboot中应用
样式文件放resource还行,生成的pdf肯定放不了,运行起来也是target下了的。
//获取路径

String path = request.getSession().getServletContext().getRealPath("static"); 

本项目全部放到
在这里插入图片描述
生成且还得访问
1)获取路径

public class PathUtil {
    public static String getPath()  {
        String path = null;
        try {
            path = ResourceUtils.getURL("").getPath();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return path;
    }
}

2)springboot对外增加可以访问的目录

@Component
class WebConfigurer extends WebMvcConfigurerAdapter {
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
	//addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径
		String path=PathUtil.getPath()+"invoice/";
		registry.addResourceHandler("/invoice/**").addResourceLocations("file:///"+path);
	}

}

3)js访问
window.open(‘路径’, ‘_blank’).location;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您对ChitGPT的关注与使用。 对于您的问题,我可以为您提供以下解答: 在SpringBoot使用itextpdf将excel转换为PDF,可以按照以下步骤进行操作: 1.引入itextpdf依赖。在pom.xml文件加入以下依赖: ``` <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2.创建ExcelToPDFUtil工具类。 ``` public class ExcelToPDFUtil { /** * 将Excel文件转换为PDF文件 * * @param excelFilePath 待转换的Excel文件路径 * @param pdfFilePath 生成的PDF文件路径 */ public static void convertExcelToPDF(String excelFilePath, String pdfFilePath) throws Exception { try { FileInputStream excelFile = new FileInputStream(new File(excelFilePath)); Workbook workbook = new XSSFWorkbook(excelFile); PdfWriter writer = new PdfWriter(pdfFilePath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(PageSize.A4); Document document = new Document(pdfDoc); int numberOfSheets = workbook.getNumberOfSheets(); for (int i = 0; i < numberOfSheets; i++) { Sheet sheet = workbook.getSheetAt(i); Iterator<Row> rowIterator = sheet.iterator(); Table table = new Table(sheet.getRow(0).getPhysicalNumberOfCells()); table.setWidth(UnitValue.createPercentValue(100)); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.iterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); table.addCell(new Cell().add(new Paragraph(cell.getStringCellValue()))); } } document.add(table); document.add(new AreaBreak()); } document.close(); pdfDoc.close(); writer.close(); excelFile.close(); workbook.close(); } catch (Exception e) { throw e; } } } ``` 3.在Controller调用ExcelToPDFUtil工具类实现Excel文件到PDF文件的转换。 ``` @RestController public class ExcelToPDFController { @RequestMapping("/excelToPDF") public ResponseVO excelToPDF() throws Exception { String excelFilePath = "path/to/excelFile.xlsx"; String pdfFilePath = "path/to/pdfFile.pdf"; ExcelToPDFUtil.convertExcelToPDF(excelFilePath, pdfFilePath); return new ResponseVO(200, "success"); } } ``` 以上便是使用itextpdf将Excel转换为PDF的整个过程,希望可以帮助解决您的问题。如有疑问,欢迎继续向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值