itext自定义pdf

pom坐标

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>

字体文件可以再电脑系统中复制

java 复制代码
public class CreatePdfWithIText {

    public static void main(String[] args) {
        String dest = "example.pdf";
        // 创建 File 对象
        File file = new File(dest);
        try {
            // 注册字体
            BaseFont baseFont = BaseFont.createFont("src/main/resources/static/STFANGSO.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

            Font font = new Font(baseFont, 12, Font.NORMAL);



            // 创建输出流
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            // 创建 Document 对象
            Document pdf = new Document();
            // 创建 PdfWriter 对象
            PdfWriter writer = PdfWriter.getInstance(pdf, fileOutputStream);

            // 添加页面事件监听器(例如,添加页眉和页脚)
            writer.setPageEvent(new HeaderFooterPageEvent());

            // 打开文档
            pdf.open();

            // 添加标题
            pdf.add(new Paragraph("     测试1111",font));

            // 添加段落
            pdf.add(new Paragraph("This is an example of a PDF document created using iText."));
            pdf.add(new Paragraph(" "));
            // 添加表格
            PdfPTable table = new PdfPTable(3);
            PdfPCell cell = new PdfPCell(new Paragraph("Header 1",font));

            table.addCell(cell);
            table.addCell("Header 2");
            table.addCell("Header 3");
            table.addCell("Row 1, Cell 1");
            table.addCell("Row 1, Cell 2");
            table.addCell("Row 1, Cell 3");


            // 合并单元格
            PdfPCell mergedCell = new PdfPCell(new Paragraph("Merged Cell"));
            mergedCell.setCellEvent(new GradientBackgroundEvent(mergedCell,BaseColor.BLUE, BaseColor.WHITE,writer));
            mergedCell.setColspan(2); // 合并两列
            mergedCell.setHorizontalAlignment(Element.ALIGN_CENTER);//内容居中
            table.addCell(mergedCell);
            table.addCell(new PdfPCell(new Paragraph("测试数据23车上",font)));
            table.completeRow();
            pdf.add(table);


            // 添加带下划线的文字
            Chunk underlinedChunk = new Chunk("测试数据.",font);
            underlinedChunk.setUnderline(0.1f, -2f); // 设置下划线的粗细和位置
            Phrase underlinedPhrase = new Phrase(underlinedChunk);
            pdf.add(new Paragraph(underlinedPhrase));

            // 添加书签
            PdfOutline root = writer.getRootOutline();
            PdfOutline bookmark1 = new PdfOutline(root, new PdfDestination(PdfDestination.FITH, pdf.getPageSize().getTop(pdf.getPageSize().getHeight() - 72)), "Title 1");
            PdfOutline bookmark2 = new PdfOutline(bookmark1, new PdfDestination(PdfDestination.FITH, pdf.getPageSize().getTop(pdf.getPageSize().getHeight() - 144)), "Sub-title 1.1");

            // 插入图片
            Image image = Image.getInstance("src/main/resources/static/lQLPJx8kenVARDfNBfrNC0CwMrMiu82UNQUG_l2o6frWAA_2880_1530.png");
            image.scaleToFit(100, 100); // 设置图片大小
            image.setAbsolutePosition(50, 750); // 设置图片位置 (x, y)
            // 设置透明度
            PdfContentByte canvas = writer.getDirectContent();
            PdfGState gState = new PdfGState();
            gState.setFillOpacity(0.5f); // 设置透明度,0.0f 完全透明,1.0f 完全不透明
            canvas.setGState(gState);
            canvas.addImage(image);
            pdf.add(image);
            // 关闭文档
            pdf.close();
            System.out.println("PDF created successfully.");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 自定义页面事件监听器
    static class HeaderFooterPageEvent extends PdfPageEventHelper {
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContent();
            cb.beginText();
            try {
                cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 12);
            } catch (DocumentException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "Header", document.right()/2 , document.top() + 10, 0);
            cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "Footer", document.right()/2, document.bottom() - 10, 0);
            cb.endText();
        }
    }

    // 自定义渐变色背景事件
    static class GradientBackgroundEvent implements PdfPCellEvent {
        private BaseColor startColor;
        private BaseColor endColor;
        private PdfWriter writer;
        private PdfPCell rectangleItem;

        public GradientBackgroundEvent(PdfPCell rectangleItem,BaseColor startColor, BaseColor endColor, PdfWriter writer) {
            this.startColor = startColor;
            this.endColor = endColor;
            this.writer = writer;
            this.rectangleItem = rectangleItem;
        }

        @Override
        public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
            PdfShading shading = PdfShading.simpleAxial(
                    this.writer,
                    position.getLeft(), position.getBottom(),
                    position.getRight(), position.getTop(),
                    startColor, endColor
            );
            PdfShadingPattern pattern = new PdfShadingPattern(shading);
            PdfGState gstate = new PdfGState();
            gstate.setFillOpacity(0.5f);//不透明度
            canvases[PdfPTable.BACKGROUNDCANVAS].saveState();
            canvases[PdfPTable.BACKGROUNDCANVAS].setGState(gstate);
            canvases[PdfPTable.BACKGROUNDCANVAS].setShadingFill(pattern);//命中单元格,仅填充单元格填充
//            canvases[PdfPTable.BACKGROUNDCANVAS].paintShading(pattern);//整个文档的填充
//            canvases[PdfPTable.BACKGROUNDCANVAS].setShadingStroke(pattern);// 颜色灰色,仅单元格填充
            canvases[PdfPTable.BACKGROUNDCANVAS].rectangle(position.getLeft(), position.getBottom(), position.getWidth(), position.getHeight());
            canvases[PdfPTable.BACKGROUNDCANVAS].fill();
            canvases[PdfPTable.BACKGROUNDCANVAS].restoreState();
        }
    }
}
相关推荐
humors2214 小时前
pdf工具分享
pdf·工具·程序·网站·转换·处理
JH30737 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble8 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟8 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖8 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_124987075310 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_10 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.10 小时前
Day06——权限认证-项目集成
java
瑶山10 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard