java根据坐标在PDF指定位置添加文本
目录
一、使用Aspose
1、前言:
2、创建一个模型
3、demo测试
二、使用Itext
1、前言
2、创建模型
3、测试demo
1)测试方法
2)实现代码
三、效果展示
一、使用Aspose
1、前言:
Aspose可能需要收费,在https://mvnrepository.com/上有可能下载不下来,所以配上Aspose.Pdf的jar包
链接:https://pan.baidu.com/s/1kqhgT1hUsNxCR1xE9hIUkA
提取码:1el6
如果想下载源文件可以进行下载
itext根据坐标在指定位置添加内容.zip-互联网文档类资源-CSDN下载
aspose根据坐标添加内容.zip-互联网文档类资源-CSDN下载
2、创建一个模型
package com.test.model;/*** @author * @Description* @date*/
public class PdfAsposeModel {// X坐标private Double xCoordinate;//Y坐标private Double yCoordinate;//页码private Integer pageNum;//内容private String content;public Double getxCoordinate() {return xCoordinate;}public void setxCoordinate(Double xCoordinate) {this.xCoordinate = xCoordinate;}public Double getyCoordinate() {return yCoordinate;}public void setyCoordinate(Double yCoordinate) {this.yCoordinate = yCoordinate;}public Integer getPageNum() {return pageNum;}public void setPageNum(Integer pageNum) {this.pageNum = pageNum;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public PdfAsposeModel(Double xCoordinate, Double yCoordinate, Integer pageNum, String content) {this.xCoordinate = xCoordinate;this.yCoordinate = yCoordinate;this.pageNum = pageNum;this.content = content;}
}
3、demo测试
package com.test.asposeTest;import com.aspose.pdf.*;
import com.test.model.PdfAsposeModel;
import org.junit.Test;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;/*** @author qiuzhenshuo* @Description pdf根据坐标合成* @date 2021-07-28*/
public class AsposePdfTest2 {private static final String FONT = "SimSun";private static final float FONTSIZE = 15;@Testpublic void asposeTest(){List<PdfAsposeModel> list = new ArrayList<>();list.add(new PdfAsposeModel(119d,707d,1,"阿里巴巴"));list.add(new PdfAsposeModel(119d,619d,1,"张三"));list.add(new PdfAsposeModel(119d,475d,1,"奥利给"));String filePath = "C:/Users/Dash/Desktop/劳动合同(标准版).pdf";try {pdfSign2(filePath,list);} catch (IOException e) {e.printStackTrace();}}public void pdfSign2(String pdfFilePath,List<PdfAsposeModel> list) throws IOException {//获取路径int indexOf = pdfFilePath.lastIndexOf("/");if(indexOf == -1){indexOf = pdfFilePath.lastIndexOf("\\");}int indexOf2 = pdfFilePath.lastIndexOf(".");String suffix = pdfFilePath.substring(indexOf2);String url = pdfFilePath.substring(0,indexOf+1);url = url + UUID.randomUUID().toString() + suffix;//复制一份文件,因为需要生成一份新的文件,下面方法是在源文件上进行操纵的FileInputStream inputStream = null;FileOutputStream outputStream = null;try {inputStream = new FileInputStream(pdfFilePath);outputStream = new FileOutputStream(url);int hasRead =0;while((hasRead = inputStream.read()) != -1){outputStream.write(hasRead);}} catch (IOException e) {e.printStackTrace();}finally {inputStream.close();outputStream.close();}for (PdfAsposeModel model : list) {Double xCoordinate = model.getxCoordinate();Double yCoordinate = model.getyCoordinate();String content = model.getContent();Integer pageNum = model.getPageNum();if(xCoordinate == null || yCoordinate == null || content == null || "".equals(content) || pageNum == null || pageNum < 1){continue;}//添加内容Document document=new Document(url);if (document!=null) {Page page = document.getPages().get_Item(pageNum);if (page != null) {TextParagraph paragraph = new TextParagraph();paragraph.getFormattingOptions().setWrapMode(TextFormattingOptions.WordWrapMode.ByWords);TextState textState = new TextState();Font pdfFont = FontRepository.findFont(FONT, true);textState.setFont(pdfFont);textState.setFontSize(FONTSIZE);paragraph.appendLine(content, textState);Position position = new Position(xCoordinate, yCoordinate);paragraph.setPosition(position);TextBuilder textBuilder = new TextBuilder(page);textBuilder.appendParagraph(paragraph);} else {System.out.println("页面第:" + pageNum + "页不存在");}document.save();}}}
}
二、使用Itext
1、前言
附:所使用到的依赖
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.12</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-xtra</artifactId><version>5.5.12</version><exclusions><exclusion><groupId>org.apache.commons</groupId><artifactId>commons-imaging</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.12</version></dependency>
2、创建模型
* itext大致和aspose一样,只不过aspose坐标是Double类型,而Itext是Float类型,所以在此基础上更改一下类型即可
3、测试demo
1)测试方法
@Testpublic void pdfTest() throws IOException, DocumentException {System.out.println("-------------开始时间:"+new Date());List<PdfItextModel> list = new ArrayList<>();list.add(new PdfItextModel(119f,707f,1,"阿里巴巴"));list.add(new PdfItextModel(119f,619f,1,"张三"));list.add(new PdfItextModel(119f,475f,1,"奥利给"));String filePath = "C:/Users/Dash/Desktop/劳动合同(标准版).pdf";PDFDocHelper2.signSinglePsw(filePath,list);System.out.println("------------结束时间:"+new Date());}
2)实现代码
package com.test.itextTest;import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.test.model.PdfItextModel;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;/*** @Author * @Date 19:25 2020/3/7* @Description */
public class PDFDocHelper2 {// 获取基础文字public static BaseFont getBaseFont() throws DocumentException, IOException {BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);return base;}/**** @param oldPswFilePath 原来的文件地址* @param list 需要添加的详细信息* @return* @throws IOException* @throws DocumentException*/public static String signSinglePsw(String oldPswFilePath, List<PdfItextModel> list) throws IOException, DocumentException {int lastIndex = oldPswFilePath.lastIndexOf('.');// 获取文件后缀String suffix = oldPswFilePath.substring(lastIndex + 1);// 判断是否为pdf文件if (!"pdf".equals(suffix.toLowerCase())) {throw new RuntimeException("Not is PDF file");}// 生成新的文件路径String newPswPath = oldPswFilePath.substring(0, lastIndex) + "-副本." + suffix;System.out.println("单个psw文件签名生成的新路径:" + newPswPath);//解析文件PdfReader reader = new PdfReader(oldPswFilePath);FileOutputStream fOut = new FileOutputStream(newPswPath);PdfStamper stp = new PdfStamper(reader, fOut);// 总页数System.out.println("PDF总页数:" + reader.getNumberOfPages());for (PdfItextModel model : list) {Float xCoordinate = model.getxCoordinate();Float yCoordinate = model.getyCoordinate();Integer pageNum = model.getPageNum();String content = model.getContent();if(xCoordinate == null || yCoordinate == null ||pageNum == null || pageNum == 0 || content == null || "".equals(content)){continue;}PdfContentByte pdfContentByte = stp.getOverContent(pageNum);pdfContentByte.beginText();// 设置字体及字号pdfContentByte.setFontAndSize(getBaseFont(), 16);addDeptReview(xCoordinate,yCoordinate,pdfContentByte, content);pdfContentByte.endText();}stp.close();// 将输出流关闭fOut.close();reader.close();// 文件读写结束System.out.println("PSW文件读写完毕");return newPswPath;}/*** @Author* @Date 18:48 2020/3/7* @Description 添加水印* @param content* @param keyword* @param x X轴坐标* @param y Y轴坐标*/private static void addDeptReview(float x,float y,PdfContentByte content, String keyword) {content.setColorFill(BaseColor.BLACK);// 设置水印位置和内容System.out.println("水印内容:" + keyword);System.out.println("打印位置坐标:" + x + "," + y);content.showTextAligned(Element.ALIGN_LEFT, keyword, x, y, 0);}}
三、效果展示
两种效果展示一致,所以都可使用
java根据坐标在PDF指定位置添加文本相关推荐
- R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框、竖向文本框)
R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框.竖向文本框) 目录
- pdfBox在pdf指定位置添加表格和内容
功能描述:在右上角指定位置添加表格和文本. 实现思路:读取pdf,在指定位置画线,线段组成表格:指定位置也就是表格内写入文字.所有pdf坐标原点(0,0)都为左下角. 遇到问题:坐标原点大部分在左下角 ...
- Itext7在PDF指定位置添加电子公章
目录 1. 电子公章的制作 2. java工具keytool生成p12数字证书文件 3. pom依赖 4. 实体类 5. 工具类及测试示例 6. 效果 1. 电子公章的制作 做章网站:http://s ...
- MATLAB绘图,在指定位置添加文本
有如下需求,再用MATLAB画图时候,需要给图中的物体添加一些说明文字,比如ID号.公式等等.可以使用如下语句: %% x,y分别是所指定位置的x,y坐标值,txt是所需要添加的文本,字符串类型 te ...
- WPS表格如何在指定位置添加文本
如下图我们打算在B列数据#后面添加0. 为了方便给大家演示及对比,我将B列数据复制一份C列中. 选中C列数据单元格 点击下图选项(Excel插件,百度即可了解详细的下载安装方法,本文这里不 ...
- python使用matplotlib可视化线图(line plot)、在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot)
python使用matplotlib可视化线图(line plot).在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot) 目录
- pandas在dataframe指定位置添加新的数据列、使用insert函数
pandas在dataframe指定位置添加新的数据列.使用insert函数 目录 pandas在dataframe指定位置添加新的数据列.使用insert函数 #仿真数据
- js 对表格的动态操作(动态添加行,删除该行,在指定位置添加控件)
***************************************************************** js动态添加表的列,并在列中添加控件的方法<html> ...
- poi操作word替换模板向指定位置添加图表
poi操作word替换模板向指定位置添加图表 首先是引入pom文件 <dependency><groupId>org.apache.poi</groupId>< ...
最新文章
- Java多线程开发之------多线程等待
- Go语言 - 忍不了了!!!已将Go语言各标准包文档.移到自己服务器上
- Codeforces 1028C(面积并/思维)
- Python OS和shutil模块的常见方法
- ElasticSearch Java Api(二) -检索索引库
- c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
- 计算机网络怎么查看连接打印机驱动,如何检测网络打印机是否已成功连接到计算机[检测方法]...
- 打jar包和执行jar包
- flask使用第三方云通讯平台时,出现{'172001':'网络错误'}解决方法
- 学计算机的能看出批图吗,高手教你:如何看出一张图有没有被P过?
- android 自动打开qq,qq自动发消息脚本
- lopatkin俄大神精简中文系统Windows 10 Pro 19041.21 20H1 Release x86-x64 ZH-CN SMS
- 2020年河南对口升学计算机类专业课试卷,2009年河南对口升学计算机专业试卷专业课...
- 如何查询OS、CPU、内存、硬盘信息
- SQLite3 编译
- IOS最新新浪微博开放平台Oauth2.0授权获取Access_Token
- 内网/外网介绍以及两者比较
- 未婚同居能白头偕老吗
- 使用Tornado+Redis维护ADSL拨号服务器代理池
- 修改RabbitMQ密码