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();
        }
    }
}
相关推荐
##学无止境##3 分钟前
从0到1吃透Java负载均衡:原理与算法大揭秘
java·开发语言·负载均衡
梵得儿SHI6 分钟前
Spring Cloud 核心组件精讲:负载均衡深度对比 Spring Cloud LoadBalancer vs Ribbon(原理 + 策略配置 + 性能优化)
java·spring cloud·微服务·负载均衡·架构原理·对比单体与微服务架构·springcloud核心组件
知识即是力量ol27 分钟前
多线程并发篇(八股)
java·开发语言·八股·多线程并发
没有bug.的程序员31 分钟前
Lombok 深度进阶:编译期增强内核、@Data 与 @Builder 逻辑博弈及工业级避坑实战指南
java·开发语言·python·builder·lombok·data·编译器增强
懒惰成性的1 小时前
Java方法的使用
java·开发语言
wangbing11252 小时前
Java构造函数不能加void
java·开发语言
重生之后端学习2 小时前
207. 课程表
java·数据结构·算法·职场和发展·深度优先
嵌入式×边缘AI:打怪升级日志2 小时前
9.2.1 分析 Write File Record 功能(保姆级讲解)
java·开发语言·网络
阿在在2 小时前
Spring 系列(三):Spring PostProcessor 顶级扩展接口全解析
java·后端·spring
kyrie学java3 小时前
使用SpringBoot框架搭建简易的项目
java·spring boot·spring