基于spring boot itext5 生成PDF

需求

1.企业报告以pdf文档格式生成,多个pdf报告的合并以及图片添加到生成的pdf中。

前期准备

1.方案一:基于itext5 进行pdf生成(注意itext7 api 区别较大,尤其在于pdf合并处)
2.方案二:基于jasperreport生成(jasperreport studio 先画pdf表格,生成jasper.xml文件结合java生成pdf,但是此方案注重纯表格pdf样式定制,表格嵌套遍历缺乏灵活性。)

实战

一、itext5
1.gradle依赖配置
implementation 'com.itextpdf:itextpdf:5.5.13.1'
implementation 'com.lowagie:itext:2.1.7.js7'
compile group: 'net.sourceforge.barbecue', name: 'barbecue', version: '1.5-beta1'
2.解决中文不显示问题
  • 2.1 下载所需字体放在resource目录下
  • 2.2 配置字体
private static final String FONT = "fonts/msyh.ttf";
private Font font = new Font(BaseFont.createFont(FONT, 
BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 16, 1);
3.生成PDF报告
  • 3.1 定义document格式及输出的pdf名和输出位置
 Document document = new Document(PageSize.A4, 50f, 50f, 70f, 50f);
 
 PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(test.pdf"));
  • 3.2 Chunk
 Chunk chunk= new Chunk("test", font);
  • 3.3 Paragraph(行,独占一行)
Paragraph paragraph = new Paragraph("test", font);
paragraph.setAlignment(10); //居中
paragraph.setLeading(10); //行距
paragraph.setIndentationLeft(10); //缩进
paragraph.setFirstLineIndent(10);//首行缩进
  • 3.4 Table
PdfPTable table = new PdfPTable(6); 6int itemHeaderWidths[] = {25, 15, 15, 15, 15, 15};// 每列宽度百分比
table.setWidths(itemHeaderWidths);
table.setWidthPercentage(100); //每列宽度按照百分比设置
table.addCell(phraseCell(cell1, 1, font)//表格每列单元格数据添加

private PdfPCell phraseCell(String value, Integer colspan, Font font) {
     PdfPCell pdfPCell = new PdfPCell(new Phrase(value, font));
     pdfPCell.setHorizontalAlignment(ALIGN_LEFT);
     pdfPCell.setHorizontalAlignment(ALIGN_BOTTOM);
     pdfPCell.setMinimumHeight(23);//单元格高度
     pdfPCell.setColspan(colspan);//合并单元格
     return pdfPCell;
 }
  • 3.5 换行
 document.add(Chunk.NEWLINE);
  • 3.6 下划线
Paragraph paragraph = new Paragraph();
LineSeparator UNDERLINE = new LineSeparator(1, 100, null, Element.ALIGN_CENTER, -2);
paragraph.add(UNDERLINE);
  • 3.7 另起一页
 document.newPage();
  • 3.8 给每一页添加页脚
  • 注意: addFooter(pdfWriter)添加页脚方法必须放在 document.open() 之前否则页脚只在最后一页显示有
  addFooter(pdfWriter);


  private void addFooter(PdfWriter pdfWriter) throws Exception {
        FooterPageEvent footerPageEvent = new FooterPageEvent();
        pdfWriter.setPageEvent(footerPageEvent);
    }



public class FooterPageEvent extends PdfPageEventHelper {

    private static final String FONT = "fonts/msyh.ttf";
    private BaseFont bf;
    private Font contentFont;

    public FooterPageEvent() throws IOException, DocumentException {
        this.bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        this.contentFont = new Font(bf, 10);
    }

    @SneakyThrows
    public void onEndPage(PdfWriter writer, Document document) {
        PdfContentByte headAndFootPdfContent  = writer.getDirectContent();
        Phrase footer = new Phrase( "第" + writer.getCurrentPageNumber() + “页”, contentFont);
        ColumnText.showTextAligned(headAndFootPdfContent ,
                Element.ALIGN_CENTER,
                footer,
                (document.right() - document.left()) / 2 + document.leftMargin(),
                document.bottom() - 10, 0);
    }
}
4.pdf添加图片
private void addImage(Document document, String imageUrl) throws Exception {
    Resource resource = new FileSystemResource(imageUrl);
    Image img = Image.getInstance(Paths.get(resource.getURI()).toAbsolutePath().toString());
    if (img.getWidth() > img.getHeight())
        img.setRotationDegrees(90);//如果图片宽度小于高度则竖着显示
    img.scalePercent(65);//等比例缩放
    document.add(img);
}
5.合并其他pdf
String first= "C://desktop//pdf//first.pdf";
String second= "C://desktop//pdf//second.pdf";

PdfCopy copy = new PdfCopy(document, new FileOutputStream("merged.pdf"));//合并后的pdf
document.open();
copyPdf(first, copy);
copyPdf(second, copy);
document.close();


private void copyPdf(String location, PdfCopy copy){
	PdfReader reader = new PdfReader(first);
	copy.addDocument(reader);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个使用Spring BootiText生成PDF文件的简单示例。 1. 引入依赖 在您的Spring Boot项目的pom.xml文件中,添加以下依赖: ```xml <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 编写生成PDF文件的代码 在您的Java类中,编写生成PDF文件的逻辑。以下是一个简单的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import org.springframework.stereotype.Service; import java.io.FileOutputStream; @Service public class PdfService { public void generatePdf() throws Exception { // 创建一个文档对象 Document document = new Document(PageSize.A4, 50, 50, 50, 50); // 创建一个PdfWriter对象 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("example.pdf")); // 打开文档对象 document.open(); // 添加内容到文档中 document.add(new Paragraph("Hello, World!")); // 关闭文档对象 document.close(); // 关闭PdfWriter对象 writer.close(); } } ``` 在上面的代码中,我们使用iText库创建了一个文档对象和一个PdfWriter对象,然后打开文档对象、添加内容、关闭文档对象和PdfWriter对象。最后,我们将生成PDF文件保存到本地磁盘上。 3. 调用生成PDF文件的代码 在您的Spring Boot应用程序中,您可以通过调用PdfService中的generatePdf()方法来生成PDF文件。例如,您可以在某个控制器方法中调用该方法: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class PdfController { @Autowired private PdfService pdfService; @GetMapping("/pdf") public String generatePdf() throws Exception { pdfService.generatePdf(); return "PDF generated successfully!"; } } ``` 当您访问“/pdf”端点时,将调用PdfController中的generatePdf()方法生成PDF文件,并返回“PDF generated successfully!”的消息。 以上是一个简单的使用Spring BootiText生成PDF文件的示例。当然,您可以根据自己的需求来编写更加复杂的代码逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值