使用IText导出复杂pdf

这篇具有很好参考价值的文章主要介绍了使用IText导出复杂pdf。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、问题描述 

        需要将发票导出成pdf,要求每页都必须包含发票信息和表头行。

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

2、解决方法

        使用IText工具实现PDF导出

        IText8文档:Examples (itextpdf.com)

3、我的代码

      使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

 使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

        引入Itext依赖,我这里用的是8.0.1版本

 <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>8.0.1</version>
            <type>pom</type>
        </dependency>
MyItextpdfUtils.java
package com.easyexcel.util;


import com.easyexcel.handler.PaginationEventHandler;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.properties.AreaBreakType;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * @author Wulc
 * @date 2023/8/10 17:08
 * @description
 */
@Component
public class MyItextpdfUtils {

    public void createPDF() throws java.io.IOException {
        Resource resource = new ClassPathResource("/");
        String path = resource.getFile().getPath();
        //设置中文字体 C:\Windows\Fonts
        //PdfFont chineseFont =getFont();
        //PdfFont chineseFont = PdfFontFactory.createFont(this.getClass().getClassLoader().getResource("simsun.ttf").getPath());
        PdfFont chineseFontForTemplate = PdfFontFactory.createFont("D:\\学习资料\\后端\\STSONG.TTF");
        PdfFont chineseFontForContent = PdfFontFactory.createFont("D:\\学习资料\\后端\\STSONG.TTF");
        //创建每页的共有模板
        //*********************每页的共有模板*********************************
        String templatePath = path + "\\template.pdf";
        PdfDocument pdfDocumentTemplate = new PdfDocument(new PdfWriter(templatePath));
        //Document documentTemplate = new Document(pdfDocumentTemplate, PageSize.A4).setFont(chineseFontForTemplate);
        Document documentTemplate = new Document(pdfDocumentTemplate, PageSize.A4);
        //插入logo图片
        Table logoTemplateTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        ImageData imageData = ImageDataFactory.create(this.getClass().getClassLoader().getResource("logo.png"));
        Image image = new Image(imageData);
        image.setHeight(50);
        image.setWidth(100);
        logoTemplateTable.addCell(new Cell().setBorder(Border.NO_BORDER).add(image));
        //插入logo图片下方的一些信息
        Table logoInfoTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("Description1")));
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("Description2")));
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("Description3")));
        //插入标题
        Table titleTable = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        titleTable.addCell(new Cell(1, 4).setBorder(Border.NO_BORDER).setPadding(1).setFontSize(15).add(new Paragraph("TITLE")).setTextAlignment(TextAlignment.CENTER));
        //插入标题下的一些信息
        Table titleInfoTable = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth();
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionA")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerA")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionB")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerB")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionC")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerC")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionD")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerD")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionE")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerE")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionF")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerF")));

        documentTemplate.add(logoTemplateTable);
        documentTemplate.add(logoInfoTable);
        documentTemplate.add(titleTable);
        documentTemplate.add(titleInfoTable);
        //*********************每页的共有模板*********************************


        //*********************每页的内容************************************
        String contentPath = path + "\\content.pdf";
        PdfDocument pdfDocumentContent = new PdfDocument(new PdfWriter(contentPath));
        //把内容使用共有模板
        pdfDocumentContent.addEventHandler(PdfDocumentEvent.END_PAGE, new PaginationEventHandler(pdfDocumentTemplate.getFirstPage().copyAsFormXObject(pdfDocumentContent)));
        Document documentContent = new Document(pdfDocumentContent, PageSize.A4).setFont(chineseFontForContent);
        //每页的content距离上面的template的距离
        documentContent.setTopMargin(250);
        Table contentTable = new Table(UnitValue.createPercentArray(6)).useAllAvailableWidth();
        //插入清单表格标题
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("No")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title1")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title2")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title3")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title4")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title5")));
        for (int i = 0; i < 300; i++) {
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph(String.valueOf(i))));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content1")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content2")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content3")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content4")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content5")));
        }
        //尾页
        Table lastInfoTable = new Table(UnitValue.createPercentArray(3)).setWidth(300);
        lastInfoTable.addCell(new Cell(1, 3).setPadding(1).setFontSize(8).add(new Paragraph("Total:")));
        lastInfoTable.addCell(new Cell(1, 1).setPadding(1).setFontSize(8).add(new Paragraph("统计A:")));
        lastInfoTable.addCell(new Cell(1, 2).setPadding(1).setFontSize(8).add(new Paragraph("1234567")));
        lastInfoTable.addCell(new Cell(1, 1).setPadding(1).setFontSize(8).add(new Paragraph("统计B:")));
        lastInfoTable.addCell(new Cell(1, 2).setPadding(1).setFontSize(8).add(new Paragraph("7654321")));
        //*********************每页的内容************************************

        documentContent.add(contentTable);
        //尾页新开一页
        documentContent.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        documentContent.add(lastInfoTable);
        documentTemplate.close();
        documentContent.close();
    }


}
PDFTest.java
package com.easyexcel;

import com.easyexcel.util.MyItextpdfUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

/**
 * @author Wulc
 * @date 2023/8/10 17:52
 * @description
 */
@SpringBootTest(classes = SpringbootApplication.class)
@RunWith(SpringRunner.class)
public class PDFTest {
    @Autowired
    private MyItextpdfUtils myItextpdfUtils;

    @Test
    public void test6() throws IOException {
        myItextpdfUtils.createPDF();
    }
}

        测试一下:

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

4、总结

        IText8不支持中文,需要引入外部字体文件,如果是以其中一个pdf作为每页的背景模板生成PDF这种方式(copyAsFormXObject),它只能支持其中一个pdf中文,另一个就不支持了。

Document documentTemplate = new Document(pdfDocumentTemplate, PageSize.A4).setFont(chineseFontForTemplate);
Document documentContent = new Document(pdfDocumentContent, PageSize.A4).setFont(chineseFontForContent);

如上代码,虽然我同时把背景版和内容同时都设置了中文字体,但是template和content合一块的时候,template的背景版pdf的中文字体就会失效了。

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

         不过还好,因为是海外的发票都是英文的,因此不需要考虑支持中文的问题。

        希望哪位大佬能帮忙解决一下IText8 copyAsFormXObject中文兼容性问题!!!

5、参考资料

https://www.cnblogs.com/sky-chen/p/13026203.html#autoid-1-4-5-0-0-0
https://kb.itextpdf.com/home/it7kb/examples/repeating-parts-of-a-form
https://zhuanlan.zhihu.com/p/537723847
https://blog.csdn.net/weixin_43409994/article/details/118157694
https://blog.csdn.net/u012397189/article/details/126345744
https://blog.csdn.net/Thinkingcao/article/details/84988392

6、补充

2023/8/27补充

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

        关于两个pdf的document合并时其中一个pdf字体中文字体设置不生效的问题,我想了一个妥协的解决办法。就是把其中一个document转为图片插入另一个pdf中。

        首先引入pdfbox用于将pdf转为图片。

pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version>
</dependency>

 修改后的createPDF()方法

public void createPDF() throws java.io.IOException {
        Resource resource = new ClassPathResource("/");
        String path = resource.getFile().getPath();
        //设置中文字体 C:\Windows\Fonts
        //PdfFont chineseFont =getFont();
        //PdfFont chineseFont = PdfFontFactory.createFont(this.getClass().getClassLoader().getResource("simsun.ttf").getPath());
        PdfFont chineseFontForTemplate = PdfFontFactory.createFont("D:\\学习资料\\后端\\STSONG.TTF");
        PdfFont chineseFontForContent = PdfFontFactory.createFont("D:\\学习资料\\后端\\STSONG.TTF");
        //创建每页的共有模板
        //*********************每页的共有模板*********************************
        String templatePath = path + "\\template.pdf";
        PdfDocument pdfDocumentTemplate = new PdfDocument(new PdfWriter(templatePath));
        Document documentTemplate = new Document(pdfDocumentTemplate, new PageSize(595.0F, 250F)).setFont(chineseFontForTemplate);
        //Document documentTemplate = new Document(pdfDocumentTemplate, PageSize.A4);
        //插入logo图片
        Table logoTemplateTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        ImageData imageData = ImageDataFactory.create(this.getClass().getClassLoader().getResource("logo.png"));
        Image image = new Image(imageData);
        image.setHeight(50);
        image.setWidth(100);
        logoTemplateTable.addCell(new Cell().setBorder(Border.NO_BORDER).add(image));
        //插入logo图片下方的一些信息
        Table logoInfoTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("描述")));
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("Description2")));
        logoInfoTable.addCell(new Cell().setBorder(Border.NO_BORDER).setPadding(1).setFontSize(10).add(new Paragraph("Description3")));
        //插入标题
        Table titleTable = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        titleTable.addCell(new Cell(1, 4).setBorder(Border.NO_BORDER).setPadding(1).setFontSize(15).add(new Paragraph("标题")).setTextAlignment(TextAlignment.CENTER));
        //插入标题下的一些信息
        Table titleInfoTable = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth();
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("问题A")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerA")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionB")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerB")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionC")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerC")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionD")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerD")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionE")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerE")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("QuestionF")));
        titleInfoTable.addCell(new Cell().setPadding(1).setFontSize(10).add(new Paragraph("AnswerF")));

        documentTemplate.add(logoTemplateTable);
        documentTemplate.add(logoInfoTable);
        documentTemplate.add(titleTable);
        documentTemplate.add(titleInfoTable);
        documentTemplate.close();
        //*********************每页的共有模板*********************************
        //把每页背景模板转为图片
        String backgroundImgPath = path + "/backgroundImg.png";
        pdfTopng(templatePath, backgroundImgPath, "png");
        String backgroundPdfPath = path + "/backgroundPdf.pdf";
        PdfDocument pdfDocBackground = new PdfDocument(new PdfWriter(backgroundPdfPath));
        Document documentBackground = new Document(pdfDocBackground, PageSize.A4);
        documentBackground.setTopMargin(3);
        documentBackground.setLeftMargin(3);
        Table background = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth().setBorder(Border.NO_BORDER);
        ImageData imageBackgroundData = ImageDataFactory.create(backgroundImgPath);
        Image imageBackground = new Image(imageBackgroundData);
        imageBackground.setHeight(300);
        imageBackground.setWidth(550);
        background.addCell(new Cell().setBorder(Border.NO_BORDER).add(imageBackground));
        documentBackground.add(background);

        //*********************每页的内容************************************
        String contentPath = path + "\\content.pdf";
        PdfDocument pdfDocumentContent = new PdfDocument(new PdfWriter(contentPath));
        //把内容使用共有模板
        pdfDocumentContent.addEventHandler(PdfDocumentEvent.END_PAGE, new PaginationEventHandler(pdfDocBackground.getFirstPage().copyAsFormXObject(pdfDocumentContent)));
        Document documentContent = new Document(pdfDocumentContent, PageSize.A4).setFont(chineseFontForContent);
        //每页的content距离上面的template的距离
        documentContent.setTopMargin(280);
        Table contentTable = new Table(UnitValue.createPercentArray(6)).useAllAvailableWidth();
        //插入清单表格标题
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("No")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title1")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title2")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title3")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title4")));
        contentTable.addHeaderCell(new Cell().setFontSize(8).add(new Paragraph("title5")));
        for (int i = 0; i < 300; i++) {
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph(String.valueOf(i))));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("内容1")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("内容2")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content3")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content4")));
            contentTable.addCell(new Cell().setFontSize(8).add(new Paragraph("content5")));
        }
        //尾页
        Table lastInfoTable = new Table(UnitValue.createPercentArray(3)).setWidth(300);
        lastInfoTable.addCell(new Cell(1, 3).setPadding(1).setFontSize(8).add(new Paragraph("Total:")));
        lastInfoTable.addCell(new Cell(1, 1).setPadding(1).setFontSize(8).add(new Paragraph("统计A:")));
        lastInfoTable.addCell(new Cell(1, 2).setPadding(1).setFontSize(8).add(new Paragraph("1234567")));
        lastInfoTable.addCell(new Cell(1, 1).setPadding(1).setFontSize(8).add(new Paragraph("统计B:")));
        lastInfoTable.addCell(new Cell(1, 2).setPadding(1).setFontSize(8).add(new Paragraph("7654321")));
        //*********************每页的内容************************************

        documentContent.add(contentTable);
        //尾页新开一页
        documentContent.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        documentContent.add(lastInfoTable);
        documentBackground.close();
        documentContent.close();
    }


 /**
     * @author Wulc
     * @date 2023/8/25 14:24
     * @description 使用pdfbox把pdf转为图片
     */
    public static void pdfTopng(String pdfFileAddress, String imgFileAddress, String type) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(pdfFileAddress);
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            BufferedImage image = renderer.renderImageWithDPI(0, 144); // Windows native DPI
            ImageIO.write(image, type, new File(imgFileAddress));
            doc.close();
            new File(pdfFileAddress).delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

        测试一下:

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

使用IText导出复杂pdf,工作,后端,pdf,java,ITextPDF

注意事项:

        我这些只是本地测试,所以文件都是直接获取操作的resources目录。如果是发布打jar包的话,其实要改一下文件路径的。

        可以参考这篇:

运行jar包出现class path resource[] cannot be resolved to absolute file path because it does not XXX_金斗潼关的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-661175.html

到了这里,关于使用IText导出复杂pdf的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】使用iText生成PDF文件

    iText介绍 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 项目要使用iText,必须引入jar包。才能使用,maven依赖如下: 输出中文,还要引入下面itext-asian.jar包:  

    2024年02月10日
    浏览(32)
  • Java 使用 itext 向PDF插入数据和图片

    一、下载Adobe Acrobat DC 二、制作模板 1、准备一个word模板,并转换成PDF格式 2、使用Adobe Acrobat DC打开PDF文档,并在右侧搜索框搜索表单,点击准备表单 3、点击开始,制作PDF表单 4、扫描完成后如下图,蓝白色框就是可编辑表单 5、点击表单编辑表单名称以及插入时的字体大小

    2024年02月09日
    浏览(31)
  • java中使用Jsoup和Itext实现将html转换为PDF

    1.在build.gradle中安装所需依赖: 2.创建工具类,实现转换方法 3.base64过滤类: 4.字体类代码,window用户可在C:windowsfont中寻找自己所需字体即可。我这里用的为黑体: simhei.ttf 效果如下: html页面预览: pdf页面预览:    

    2024年02月14日
    浏览(30)
  • java集成itextpdf实现通过pdf模板填充数据生成pdf

    我采用的是pdfelement 官网地址需要付费或者自行破解,也可以使用其他pdf编辑器。 将制作好的pdf模板放入项目resources/pdf目录下,如图 浏览器访问ip:port/test/pdf,其中ip为你的ip地址,port为你的端口,访问结果如下:

    2024年02月16日
    浏览(31)
  • 使用itext7为pdf文档添加水印

    iText7是一款功能强大的开源PDF处理库,用于创建、编辑和处理PDF文档。相比于iTextSharp,iText7具有更先进的功能和更好的性能。 添加水印是iText7的一个常见应用场景。水印可以用于保护文档的版权,标识文档的状态或来源等。使用iText7添加水印可以通过以下步骤实现: 导入

    2024年04月22日
    浏览(28)
  • 【Java】OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库

    OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库,它们各自具有独特的优势和特点,同时也存在一些局限性和差异。本文将对这四种库进行详细的比较,并通过代码示例来展示它们的使用。 1、OpenPDF OpenPDF 是一个用于创建和编辑 PDF 文档的 Java 库,它基于 iText 库的一个分支,提供

    2024年02月09日
    浏览(51)
  • Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】

    本篇主要为工具方法整理,参考学习其他博主文章做了整理,方便使用。 1、本地转换 导入依赖 创建工具方法 传入输入输出流或文档地址即可。 2、网络下载 通过POI或者easyExcel生成或填充,再由后端转换PDF响应前端 思路 :将网络下载拆分为本地转换,再响应前端即可。 现

    2024年02月04日
    浏览(36)
  • 【Java】itext 实现 html根据模板生成pdf 中文不显示/图片不显示问题解决

    工作中需要使用生成pdf记录,选取使用的是itext 生成 pdf方式。分享下实现方式及遇到的问题。 这里随便找个html课程表作为示例,添加了几张图片为了展示图片转pdf功能。 一:引入jar包 二:导入ftl文件 这块使用的是html语法,将文件后缀名改为ftl即可,在需要参数的地方通过

    2024年02月05日
    浏览(40)
  • POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。

      一、POI 表格框架 1.POI : POI提供API给Java程序对Microsoft Office格式档案读和写的功能 2.HSSF:Horrible SpreadSheet Format,为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型” 3.POI 文档结构类  HSSFWorkbook 文档对象,HSSFSheet  页,HSSFRow 行,HSSFCell 单

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包