<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
参考:一步一步 IText.Sharp Chunk Phrase Paragraph List使用 - cdboy - 博客园 (cnblogs.com)
1、读取模板的指定区域
2、将模板内容按照段落输出
3、在指定区域输出指定内容
package com.example.demo.pdf; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import com.itextpdf.text.pdf.parser.*; import java.io.*; import java.text.MessageFormat; public class MyPDF { public static void main(String[] args) throws IOException, DocumentException { String pdf = "E:\\合同测试模板.pdf"; String newPdf = "E:\\合同测试2023.pdf"; //单独 一页 分区域读取 String pdfReaderByReacngle = getPdfReaderByReacngle(pdf, 0.0F, 750.0F, 595.3F, 841.9F); // 此处应该保留换行符,根据换行符切割一个段落数组 String pdfReaderByReacngle2 = getPdfReaderByReacngle(pdf, 0.0F, 510.0F, 595.3F, 750.0F).replace("\r\n","").replace("\n",""); System.out.println(pdfReaderByReacngle2); String s = getPdfReaderByReacngle(pdf, 0.0F, 400.0F, 595.3F, 510.0F).replace("企业名称:", "企业名称:{0}").replace("负 责 人:", "负 责 人:{1}").replace("日 期: _年_月_日", "日 期:{2}"); String a = "xxxx有限公司"; String name = "xxx"; String date = "2023年10月21日"; // 占位符替换 String pdfReaderByReacngle3 = MessageFormat.format(s,a,name,date); System.out.println(pdfReaderByReacngle3); //创建文本对象 Document document = new Document(PageSize.A4); File attachPdfFile = new File(newPdf); attachPdfFile.createNewFile(); //PdfWriter是iText编辑PDF文档的编辑器 // 为该Document创建一个Writer实例 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(attachPdfFile)); //打开document document.open(); //插入段落文字 // 设置中文字体 加粗也在此处设置 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); /*------------------------------1----------------------------------------------*/ Paragraph textgraph = new Paragraph(pdfReaderByReacngle,fontChinese); //左对齐 textgraph.setAlignment(Element.ALIGN_CENTER); //段落的前后间距 textgraph.setSpacingBefore(50); document.add(textgraph); /*------------------------------2----------------------------------------------*/ Paragraph textgraph2 = new Paragraph(pdfReaderByReacngle2,fontChinese); //左对齐 textgraph2.setAlignment(Element.ALIGN_LEFT); textgraph2.setFirstLineIndent(25); //段落的前后间距 // textgraph.setSpacingAfter(50); textgraph2.setSpacingBefore(20); document.add(textgraph2); /*------------------------------3、固定区域----------------------------------------------*/ Paragraph textgraph3 = new Paragraph(pdfReaderByReacngle3,fontChinese); //左对齐 textgraph3.setAlignment(Element.ALIGN_CENTER); //段落的前后间距 //textgraph3.setSpacingAfter(50); textgraph3.setSpacingBefore(20); Rectangle rects3 = new Rectangle(400.0F, 400.0F, 595.3F, 550.0F);//文本框位置 writer.getDirectContent().rectangle(rects3); ColumnText ct = new ColumnText(writer.getDirectContent()); ct.addElement(textgraph3); ct.setSimpleColumn(rects3); ct.go(); /*------------------------------4----------------------------------------------*/ //关闭 document document.close(); //todo itextpdf读写文件 } private static String getStringByItext(String pdf, String result) throws IOException { PdfReader pdfReader = new PdfReader(pdf); pdfReader.setAppendable(true); // 对PDF文件进行解析,获取PDF文档页码 int size = pdfReader.getNumberOfPages(); for(int i = 1 ; i < size + 1;i= i+1 ){ //一页页读取PDF文本 String pageStr = PdfTextExtractor.getTextFromPage(pdfReader,i); result = result + pageStr; } pdfReader.close(); return result; } //读取指定范围内的内容 private static String getPdfReaderByReacngle(String pdf,float leftx,float lefty,float rightx,float righty) throws IOException { PdfReader pdfReader = new PdfReader(pdf); String pageContent = ""; Rectangle rect = new Rectangle(leftx, lefty, rightx, righty); RenderFilter filter = new RegionTextRenderFilter(rect); int pageNum = pdfReader.getNumberOfPages(); TextExtractionStrategy strategy; for (int i = 1; i <= pageNum; i++) { strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter); pageContent +=PdfTextExtractor.getTextFromPage(pdfReader, i, strategy); } return pageContent; } //获取指定页的位置参数,方便划分区域 private static PdfReader getPdfReader(String pdf,int num) throws IOException { PdfReader pdfReader = new PdfReader(pdf); Rectangle pageSize = pdfReader.getPageSize(num); float height = pageSize.getHeight(); float width = pageSize.getWidth(); float left = pageSize.getLeft(); float right = pageSize.getRight(); float top = pageSize.getTop(); return pdfReader; } }
2、一段话中某部分加粗
效果
模板
public class MyPdf2 {
public static void main(String[] args) throws IOException, DocumentException {
String pdf = "E:\\合同模板.pdf";
String newPdf = "E:\\合同测试2023.pdf";
FileOutputStream fileOutputStream = new FileOutputStream(new File(newPdf));
PdfReader pdfReader = new PdfReader(pdf);
BaseFont title = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font titleFontChinese = new Font(title, 12, Font.BOLD);
BaseFont first = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font firstChinese = new Font(first, 14, Font.NORMAL);
BaseFont second = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font secondChinese = new Font(second, 14, Font.BOLD);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream);
document.open();
String s = "";
for (int i = 1; i < pdfReader.getNumberOfPages()+1; i++) {
s +=PdfTextExtractor.getTextFromPage(pdfReader,i);
}
String[] split = s.replaceAll("\\n","").split("\\|");
for (int i = 0; i < split.length; i++) {
if(i==0) {
Paragraph elements = new Paragraph(split[i], titleFontChinese);
elements.setAlignment(Element.ALIGN_CENTER);
document.add(elements);
} else if (i==2 |i==3) {
String s1 = split[i];
String[] split1 = s1.split("@");
//短句
Phrase phrase = new Phrase();
phrase.setLeading(25f);
phrase.add(Chunk.SPACETABBING);
phrase.add(new Chunk(split1[0],firstChinese));
phrase.add(new Chunk(split1[1],secondChinese));
phrase.add(new Chunk(split1[2],firstChinese));
phrase.add(Chunk.NEWLINE);
document.add(phrase);
}else if (i==5) {
Paragraph elements = new Paragraph(split[i], firstChinese);
elements.setAlignment(Element.ALIGN_LEFT);
elements.setFirstLineIndent(25);
document.add(elements);
}else{
Paragraph elements = new Paragraph(split[i], firstChinese);
elements.setAlignment(Element.ALIGN_LEFT);
elements.setFirstLineIndent(25);
document.add(elements);
}
}
document.close();
}
}
3、在2的基础上修改,实现段落首行缩进,以及保持段落间距一致
效果
public class MyPdf2 { public static void main(String[] args) throws IOException, DocumentException { String pdf = "E:\\合同模板.pdf"; String newPdf = "E:\\合同测试2024.pdf"; FileOutputStream fileOutputStream = new FileOutputStream(new File(newPdf)); PdfReader pdfReader = new PdfReader(pdf); BaseFont title = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font titleFontChinese = new Font(title, 12, Font.BOLD); BaseFont first = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font firstChinese = new Font(first, 14, Font.NORMAL); BaseFont second = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font secondChinese = new Font(second, 14, Font.BOLD); Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream); document.open(); String s = ""; for (int i = 1; i < pdfReader.getNumberOfPages()+1; i++) { s +=PdfTextExtractor.getTextFromPage(pdfReader,i); } String[] split = s.replaceAll("\\n","").split("\\|"); for (int i = 0; i < split.length; i++) { if(i==0) { Paragraph elements = new Paragraph(split[i], titleFontChinese); elements.setAlignment(Element.ALIGN_CENTER); document.add(elements); document.add(Chunk.NEWLINE); } else if (i==2 |i==3) { String s1 = split[i]; String[] split1 = s1.split("@"); //段落 Paragraph paragraph = new Paragraph(); //短句 Phrase phrase = new Phrase(); //Chunk 块 Chunk chunk1 = new Chunk(split1[0], firstChinese); //chunk1.setCharacterSpacing(1.5f); Chunk chunk2 = new Chunk(split1[1], secondChinese); //chunk2.setCharacterSpacing(1.5f); Chunk chunk3 = new Chunk(split1[2], firstChinese); //chunk3.setCharacterSpacing(1.5f); phrase.add(chunk1); phrase.add(chunk2); phrase.add(chunk3); paragraph.add(phrase); //首行缩进 paragraph.setFirstLineIndent(25); //设置行间据和其他段落保持一致 paragraph.setLeading(21f); paragraph.setAlignment(Element.ALIGN_LEFT); document.add(paragraph); }else if (i==5) { Paragraph elements = new Paragraph(split[i], firstChinese); elements.setAlignment(Element.ALIGN_LEFT); elements.setFirstLineIndent(25); document.add(elements); //指定位置插入图片,默认在pdf的最后一页上指定区域 /*------------------------------4------------------------------------------*/ //Image image = Image.getInstance("E:\\学习笔记\\lxl.jpg"); //image.scaleAbsolute(100,50); //缩放 //image.setAbsolutePosition(495f,270f);//坐标 writer 是上边的PdfWriter writer //PdfContentByte directContent = writer.getDirectContent(); //directContent.addImage(image); }else{ Paragraph elements = new Paragraph(split[i], firstChinese); //获取其他段落的默认值时多少,设置给块 71行 float leading = elements.getLeading(); System.out.println("leading:" + leading); //21 elements.setAlignment(Element.ALIGN_LEFT); elements.setFirstLineIndent(25); document.add(elements); //document.add(Chunk.NEWLINE); } } document.close(); } }