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();
        }
    }
}
相关推荐
空空kkk7 分钟前
Java基础——代理
java·开发语言
野生技术架构师8 分钟前
互联网大厂必备 Java 面试八股文真题解析
java·开发语言·面试
Rsun0455112 分钟前
synchronized关键字的底层实现
java
老约家的可汗15 分钟前
C++篇之类和对象下
java·开发语言·c++
€81131 分钟前
Java入门级教程27——ActiveMQ的下载与应用
java·开发语言·activemq·点对点文本消息发送·点对点对象消息发送·mysql+redis·序列化对象消息传输
科技块儿1 小时前
多语言技术栈如何共用IP离线库?Java、Python、Go 的加载实践
java·python·tcp/ip
开开心心就好1 小时前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·windows·pdf·旅游·媒体·1024程序员节
chools1 小时前
一篇文章带你搞懂Java“设计模式”! - - 超长文(涵盖23种)万字总结!【汇总篇】
java·开发语言·设计模式
良逍Ai出海1 小时前
OpenClaw 新手最该先搞懂的 2 套命令
android·java·数据库
6+h1 小时前
【Spring】深度剖析IoC
java·后端·spring