java pdfbox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存
pdfbox开发包下载地址:http://pdfbox.apache.org/
程序实现了PDF文档的创建,读入,与修改PDF内容并保存。
可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究过!
源代码如下:
package com.gloomyfish.ups.pdf.reader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdfwriter.ContentStreamWriter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.util.PDFOperator;
import org.apache.pdfbox.util.PDFTextStripper;
/**
* http://pdfbox.apache.org/
*
* @author fish
*
*/
public class PDFReader {
public PDFReader()
{
createHelloPDF();
readPDF();
editPDF();
}
public void createHelloPDF() {
PDDocument doc = null;
PDPage page = null;
try {
doc = new PDDocument();
page = new PDPage();
doc.addPage(page);
PDFont font = PDType1Font.HELVETICA_BOLD;
PDPageContentStream content = new PDPageContentStream(doc, page);
content.beginText();
content.setFont(font, 12);
content.moveTextPositionByAmount(100, 700);
content.drawString("Hello");
content.endText();
content.close();
doc.save("D:\\gloomyfish\\pdfwithText.pdf");
doc.close();
} catch (Exception e) {
System.out.println(e);
}
}
public void readPDF()
{
PDDocument helloDocument;
try {
helloDocument = PDDocument.load(new File(
"D:\\gloomyfish\\pdfwithText.pdf"));
PDFTextStripper textStripper = new PDFTextStripper();
System.out.println(textStripper.getText(helloDocument));
helloDocument.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void editPDF() {
try {
// pdfwithText
PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\pdfwithText.pdf"));
// PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\hello.pdf"));
// int pageCount = helloDocument.getNumberOfPages();
PDPage firstPage = (PDPage)helloDocument.getDocumentCatalog().getAllPages().get(0);
// PDPageContentStream content = new PDPageContentStream(helloDocument, firstPage);
PDStream contents = firstPage.getContents();
PDFStreamParser parser = new PDFStreamParser(contents.getStream());
parser.parse();
List tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++)
{
Object next = tokens.get(j);
if (next instanceof PDFOperator)
{
PDFOperator op = (PDFOperator) next;
// Tj and TJ are the two operators that display strings in a PDF
if (op.getOperation().equals("Tj"))
{
// Tj takes one operator and that is the string
// to display so lets update that operator
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
string = string.replaceFirst("Hello", "Hello World, fish");
//Word you want to change. Currently this code changes word "Solr" to "Solr123"
previous.reset();
previous.append(string.getBytes("ISO-8859-1"));
}
else if (op.getOperation().equals("TJ"))
{
COSArray previous = (COSArray) tokens.get(j - 1);
for (int k = 0; k < previous.size(); k++)
{
Object arrElement = previous.getObject(k);
if (arrElement instanceof COSString)
{
COSString cosString = (COSString) arrElement;
String string = cosString.getString();
string = string.replaceFirst("Hello", "Hello World, fish");
// Currently this code changes word "Solr" to "Solr123"
cosString.reset();
cosString.append(string.getBytes("ISO-8859-1"));
}
}
}
}
}
// now that the tokens are updated we will replace the page content stream.
PDStream updatedStream = new PDStream(helloDocument);
OutputStream out = updatedStream.createOutputStream();
ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
tokenWriter.writeTokens(tokens);
firstPage.setContents(updatedStream);
helloDocument.save("D:\\gloomyfish\\helloworld.pdf"); //Output file name
helloDocument.close();
//PDFTextStripper textStripper = new PDFTextStripper();
//System.out.println(textStripper.getText(helloDocument));
//helloDocument.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (COSVisitorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new PDFReader();
}
}
java pdfbox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存相关推荐
- Java使用PDFBox开发包实现对PDF文档内容编辑与保存
pdfbox开发包下载地址:http://pdfbox.apache.org/ 程序实现了PDF文档的创建,读入,与修改PDF内容并保存. 可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究 ...
- java中operationBox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存
pdfbox开发包下载地址:http://pdfbox.apache.org/ 程序实现了PDF文档的创建,读入,与修改PDF内容并保存. 可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究 ...
- IText实现对PDF文档属性的基本设置
一.Itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- 阿里Java岗P5-P7成长笔记【3283页PDF文档】
又到了"金九银十"面试求职高峰期,在金三银四时也参与过不少面试,2020都说工作不好找,也是对开发人员的要求变高.前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成 ...
- 阿里Java岗P5-P7成长笔记【3283页PDF文档免费领】
又到了"金九银十"面试求职高峰期,在金三银四时也参与过不少面试,2020都说工作不好找,也是对开发人员的要求变高.前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成 ...
- python对word文档内容进行批量替换_python 使用win32com实现对word文档批量替换页眉页脚...
最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的.就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这 ...
- java实现在pdf文档上填充内容
需求: 在合同附件模板上填充内容,生成一个新的合同附件,并可以查看合同附件 思路: 首先在模板文档上设置文本域,根据文本域填充内容,使用itextpdf在pdf上填充内容 1.在pom.xml中加入以 ...
- java加密文件夹_Java加密、解密PDF文档
import java.util.EnumSet; import com.spire.pdf.PdfDocument; import com.spire.pdf.security.PdfEncrypt ...
最新文章
- AIoT的发展路上,英特尔如何通过边缘计算掀起产业变革
- 可视化深入理解损失函数与梯度下降 | 技术头条
- w10查询自己电脑ip
- lwip iperf 方法进行性能测试
- CentOS7中怎样安装JDK与配置环境变量
- Mac-ios下JDK的安装路径(java)
- 经典DL论文研读(part2)--Deep Sparse Rectifier Neural Networks
- python时钟罗盘酷炫代码_抖音上的时钟屏保,被我改造完用来表白
- jbpm 和 drools_jBPM和Drools工作台中的用户和组管理
- jaxb xml 生成 java_java-如何使用JAXB定制XML导出
- 简析通达信股票接口测试过程
- xp系统怎么关闭wmi服务器,教你win10系统wmi服务器怎么关闭
- BJ54坐标或者XA80坐标到WGS84坐标的转换(小工具附代码)
- 商汤的AI伴游小精灵(2019 计蒜之道 初赛 第一场)
- 今天杂志今天杂志社今天编辑部2022年第6期目录
- 文件名变乱码. 不知道怎么找回呢
- mysqldump单个库导出_mysql mysqldump只导出表结构或只导出数据的实现方法
- 武汉新华电脑学校计算机协会,第11届全国大学生计算机应用能力与信息素养大赛颁奖典礼!...
- python最大递归层次_练习题-Python的最大递归层数
- 基于伯努利原理的速度监测芯片可用于天然气管道泄露检测
热门文章
- 大数据相关技术及应用实践
- opencv-python 疲劳驾驶检测
- 重走长征路---OI每周刷题记录---11月4日 2013
- java安全随机数_Java随机数的陷阱
- springboot毕设项目山东魏桥创业集团有限公司外贸出口管理信息系统fyndb(java+VUE+Mybatis+Maven+Mysql)
- linux上面安装Jenkins
- 中国推进系统行业市场供需与战略研究报告
- 克莱姆森大学计算机博士,克莱姆森大学DBA工商管理博士国内排名
- val什么意思vb中的属性值_vb中val是什么意思 vb中val有什么意义
- 2018-7.29-interactive visualization and visual analytics-马匡六