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();
        }
    }
}
相关推荐
NMIXX爻11 分钟前
线程控制 下
java·开发语言·jvm
时艰.33 分钟前
JVM 垃圾收集器(G1&ZGC)
java·jvm·算法
iRuriCatt1 小时前
智慧景区管理系统 | 计算机毕设项目
java·前端·spring boot·vue·毕设
天空属于哈夫克31 小时前
企业微信外部群运营升级:API 主动推送消息开发实战
java·数据库·mysql
qq_12498707531 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计
愿你天黑有灯下雨有伞1 小时前
java动态渲染列导出以及分页列表
java
星火开发设计1 小时前
共用体 union:节省内存的特殊数据类型
java·开发语言·数据库·c++·算法·内存
2301_803554522 小时前
阻塞,非阻塞,同步,异步以及linux上的5种IO模型阻塞,非阻塞,信号驱动,异步,IO复用
java·服务器·网络
仰望星空_Star2 小时前
Java证书操作
java·开发语言
河北小博博2 小时前
分布式系统稳定性基石:熔断与限流的深度解析(附Python实战)
java·开发语言·python