目录

一、使用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指定位置添加文本相关推荐

  1. R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框、竖向文本框)

    R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框.竖向文本框) 目录

  2. pdfBox在pdf指定位置添加表格和内容

    功能描述:在右上角指定位置添加表格和文本. 实现思路:读取pdf,在指定位置画线,线段组成表格:指定位置也就是表格内写入文字.所有pdf坐标原点(0,0)都为左下角. 遇到问题:坐标原点大部分在左下角 ...

  3. Itext7在PDF指定位置添加电子公章

    目录 1. 电子公章的制作 2. java工具keytool生成p12数字证书文件 3. pom依赖 4. 实体类 5. 工具类及测试示例 6. 效果 1. 电子公章的制作 做章网站:http://s ...

  4. MATLAB绘图,在指定位置添加文本

    有如下需求,再用MATLAB画图时候,需要给图中的物体添加一些说明文字,比如ID号.公式等等.可以使用如下语句: %% x,y分别是所指定位置的x,y坐标值,txt是所需要添加的文本,字符串类型 te ...

  5. WPS表格如何在指定位置添加文本

    如下图我们打算在B列数据#后面添加0. ​ 为了方便给大家演示及对比,我将B列数据复制一份C列中. ​ 选中C列数据单元格 ​ 点击下图选项(Excel插件,百度即可了解详细的下载安装方法,本文这里不 ...

  6. python使用matplotlib可视化线图(line plot)、在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot)

    python使用matplotlib可视化线图(line plot).在可视化图像中的指定位置添加横线(add horizontal line in matplotlib plot) 目录

  7. pandas在dataframe指定位置添加新的数据列、使用insert函数

    pandas在dataframe指定位置添加新的数据列.使用insert函数 目录 pandas在dataframe指定位置添加新的数据列.使用insert函数 #仿真数据

  8. js 对表格的动态操作(动态添加行,删除该行,在指定位置添加控件)

    ***************************************************************** js动态添加表的列,并在列中添加控件的方法<html> ...

  9. poi操作word替换模板向指定位置添加图表

    poi操作word替换模板向指定位置添加图表 首先是引入pom文件 <dependency><groupId>org.apache.poi</groupId>< ...

最新文章

  1. Java多线程开发之------多线程等待
  2. Go语言 - 忍不了了!!!已将Go语言各标准包文档.移到自己服务器上
  3. Codeforces 1028C(面积并/思维)
  4. Python OS和shutil模块的常见方法
  5. ElasticSearch Java Api(二) -检索索引库
  6. c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
  7. 计算机网络怎么查看连接打印机驱动,如何检测网络打印机是否已成功连接到计算机[检测方法]...
  8. 打jar包和执行jar包
  9. flask使用第三方云通讯平台时,出现{'172001':'网络错误'}解决方法
  10. 学计算机的能看出批图吗,高手教你:如何看出一张图有没有被P过?
  11. android 自动打开qq,qq自动发消息脚本
  12. lopatkin俄大神精简中文系统Windows 10 Pro 19041.21 20H1 Release x86-x64 ZH-CN SMS
  13. 2020年河南对口升学计算机类专业课试卷,2009年河南对口升学计算机专业试卷专业课...
  14. 如何查询OS、CPU、内存、硬盘信息
  15. SQLite3 编译
  16. IOS最新新浪微博开放平台Oauth2.0授权获取Access_Token
  17. 内网/外网介绍以及两者比较
  18. 未婚同居能白头偕老吗
  19. 使用Tornado+Redis维护ADSL拨号服务器代理池
  20. 修改RabbitMQ密码

热门文章

  1. 基于机智云物联网平台的空气质量多功能检测系统设计
  2. 什么是超链接伪类和伪元素
  3. ubuntu20.04 desktop安装到移动硬盘
  4. 蓝桥杯-2021年省赛-时间显示
  5. mysql跨库分页查询_跨库跨表分页
  6. android mysql储存动态数据_Android中数据的保存
  7. 数学建模--线性回归和线性相关性分析基于R语言
  8. 关于偏函数的理解与实例(functools.partial)
  9. 电脑初学者所需软件及网站
  10. ERP与SCM相结合会更好-云创集团