itextpdf 读取指定区域并写入新文件的指定区域

        <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();

	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用 iTextPDF 读取 TTC 字体库中指定的关键字并将其复制到的字体文件中,可以使用以下步骤: 1. 创建一个 `PdfFont` 对象,指定 TTC 字体文件和字体索引,以及字体大小、样式等属性。 ``` String fontPath = "path/to/font.ttc"; int fontIndex = 0; // the index of the font in the TTC file float fontSize = 12; int fontStyle = Font.NORMAL; PdfFont font = PdfFontFactory.createFont(fontPath + "," + fontIndex, PdfEncodings.IDENTITY_H, true); PdfFont newFont = PdfFontFactory.createFont(); newFont.setPdfFontName(font.getPdfFontName()); newFont.setSubset(true); newFont.setBold(fontStyle == Font.BOLD); newFont.setItalic(fontStyle == Font.ITALIC); ``` 2. 创建一个 `PdfDocument` 对象,用于读取写入 PDF 文件。 ``` PdfDocument pdfDoc = new PdfDocument(new PdfReader("path/to/input.pdf"), new PdfWriter("path/to/output.pdf")); ``` 3. 遍历 PDF 文件中的所有页面,查找指定的关键字,并将其复制到的字体文件中。 ``` for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) { PdfPage page = pdfDoc.getPage(i); PdfDictionary pageDict = page.getPdfObject(); PdfArray annotsArray = pageDict.getAsArray(PdfName.Annots); if (annotsArray == null) { continue; } for (int j = 0; j < annotsArray.size(); j++) { PdfDictionary annotDict = annotsArray.getAsDictionary(j); if (annotDict == null) { continue; } PdfString content = annotDict.getAsString(PdfName.Contents); if (content != null && content.getValue().contains("关键字")) { String newContent = content.getValue().replace("关键字", ""); PdfString newString = new PdfString(newContent, PdfEncodings.IDENTITY_H); annotDict.put(PdfName.Contents, newString); } PdfArray apDict = annotDict.getAsArray(PdfName.AP); if (apDict != null) { PdfDictionary normalDict = apDict.getAsDictionary(0); PdfStream stream = normalDict.getAsStream(PdfName.Stream); byte[] bytes = stream.getBytes(); String str = new String(bytes, PdfEncodings.IDENTITY_H); String newStr = str.replace("关键字", ""); stream.setData(newStr.getBytes(PdfEncodings.IDENTITY_H)); } } } ``` 4. 关闭 `PdfDocument` 对象。 ``` pdfDoc.close(); ``` 在上面的示例代码中,我们首先创建了一个 `PdfFont` 对象,指定 TTC 字体文件和字体索引,以及字体大小、样式等属性。然后,我们创建了一个 `PdfDocument` 对象,用于读取写入 PDF 文件。接下来,我们遍历 PDF 文件中的所有页面,查找指定的关键字,并将其复制到的字体文件中。最后,我们关闭了 `PdfDocument` 对象。 请注意,上面的示例代码仅演示了如何读取 PDF 文件中的注释和文本字段,并替换其中的关键字。如果您需要读取 PDF 文件中的其他内容,例如文本、表格或图像等,请使用适当的 iTextPDF 类库和方法进行处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值