Java 使用基于iText Core的OpenPdf从pdf页面删除或更新添加的图像图标
我在Java 使用基于iText Core的OpenPdf从pdf页面删除或更新添加的图像图标,java,android,itext,openpdf,Java,Android,Itext,Openpdf,我在PDF页面中添加了一个图标作为图像对象,该图标基于iText core。这是我的密码 // inout stream from file InputStream inputStream = new FileInputStream(file); // we create a reader for a certain document PdfReader reader = new PdfReader
PDF
页面中添加了一个图标作为图像对象,该图标基于iText core。这是我的密码
// inout stream from file
InputStream inputStream = new FileInputStream(file);
// we create a reader for a certain document
PdfReader reader = new PdfReader(inputStream);
// we create a stamper that will copy the document to a new file
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));
// adding content to each page
PdfContentByte over;
// get watermark icon
Image img = Image.getInstance(PublicFunction.getByteFromDrawable(context, R.drawable.ic_chat_lawone_new));
img.setAnnotation(new Annotation(0, 0, 0, 0, "https://github.com/LibrePDF/OpenPDF"));
img.setAbsolutePosition(pointF.x, pointF.y);
img.scaleAbsolute(50, 50);
// get page file number count
int pageNumbers = reader.getNumberOfPages();
if (pageNumbers < pageIndex) {
// closing PdfStamper will generate the new PDF file
stamp.close();
throw new PDFException("page index is out of pdf file page numbers", new Throwable());
}
// annotation added into target page
over = stamp.getOverContent(pageIndex);
if (over == null) {
stamp.close();
throw new PDFException("getUnderContent is null", new Throwable());
}
over.addImage(img);
// closing PdfStamper will generate the new PDF file
stamp.close();
// close reader
reader.close();
//从文件中输出流
InputStream InputStream=新文件InputStream(文件);
//我们为某个文档创建一个阅读器
PdfReader reader=新PdfReader(inputStream);
//我们创建一个压模,将文档复制到一个新文件中
PdfStamper stamp=新PdfStamper(读取器,新文件输出流(文件));
//向每个页面添加内容
PdfContentByte超过;
//获取水印图标
Image img=Image.getInstance(PublicFunction.getByteFromDrawable(context,R.drawable.ic_chat_lawone_new));
设置注释(新注释(0,0,0,0https://github.com/LibrePDF/OpenPDF"));
img.setAbsolutePosition(点F.x,点F.y);
img.可标度溶质(50,50);
//获取页面文件数计数
int pageNumbers=reader.getNumberOfPages();
如果(页码<页索引){
//关闭PdfStamper将生成新的PDF文件
stamp.close();
抛出新的PDFEException(“页面索引超出pdf文件页码”,new Throwable());
}
//添加到目标页面的批注
over=stamp.getOverContent(页面索引);
如果(超过==null){
stamp.close();
抛出新的PDFException(“getUnderContent为null”,newthrowable());
}
超过。添加图像(img);
//关闭PdfStamper将生成新的PDF文件
stamp.close();
//近距离阅读
reader.close();
现在我需要在用户单击时删除或更新添加的图像对象的颜色,我有返回MotionEvent
的单击功能,现在我需要删除或更新或替换添加的图像对象
有什么想法吗 与此类似,您还发布了:
这里是我的进步
现在我可以实现添加到pdf文件中的xObject,并且可以通过以下方式将它们从pdf页面中删除:
// inout stream from file
InputStream inputStream = new FileInputStream(file);
// we create a reader for a certain document
PdfReader pdfReader = new PdfReader(inputStream);
// get page file number count
int pageNumbers = pdfReader.getNumberOfPages();
// we create a stamper that will copy the document to a new file
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(file));
// get page
PdfDictionary page = pdfReader.getPageN(currPage);
PdfDictionary resources = page.getAsDict(PdfName.RESOURCES);
// get page resources
PdfArray annots = resources.getAsArray(PdfName.ANNOTS);
PdfDictionary xobjects = resources.getAsDict(PdfName.XOBJECT);
// remove Xobjects
for (PdfName key : xobjects.getKeys()) {
xobjects.remove(key);
}
// remove annots
for (PdfObject element : annots.getElements()) {
annots.remove(0);
}
// close pdf stamper
pdfStamper.close();
// close pdf reader
pdfReader.close();
所以XObject将从屏幕上删除,但仍然存在问题
当我删除它们并尝试添加一个新对象时,最后一个删除的对象出现并添加到pdf页面中!真的!!!:)
我认为应该有另一个地方,这些物体应该被移除
这里发生的情况是,您确实从页面中删除了位图图像资源:
但您不会删除从内容流中绘制这些资源的说明。这有两个后果:
- 同时从内容流中删除XObject绘图指令或
- 将图像XObject替换为不可见的XObject
PdfContentStreamEditor
(请参阅)/PdfCanvasEditor
(请参阅)类从页面内容流中查找和删除Do操作,但我还没有该类的OpenPDF版本
不过,您可以很容易地将图像资源替换为表单XObject,而不包含任何内容:
PdfTemplate PdfTemplate=PdfTemplate.createTemplate(pdfStamper.getWriter(),1,1);
//替换XObject
对于(PdfName键:xobjects.getKeys()){
put(key,pdfTemplate.getIndirectReference());
}
(测试testRemoveImageAddedLikeHamidReza
)
注意,用空XObject替换所有XObject有一个明显的缺点,它会替换所有XObject,而不仅仅是您的工具以前创建的那些对象!因此,如果工具处理的原始PDF也在其即时内容流中绘制了XObject,那么这些XObject也会呈现为不可见。如果您不希望这样做,则需要一些特定的条件来识别您添加的图像XObject并仅替换它们 此外,还存在其他问题:每次在
PdfStamper
中处理页面的内容过多
,该页面预先存在的内容都会被包装到q/q(保存图形状态/恢复图形状态)信封,以防止先前内容中图形状态的更改渗透并混淆您的过多内容
添加内容。因此,如果您在工具中多次操作一个文件,原始页面内容可能会被包装在一个相当深的信封嵌套中。不幸的是,PDF阅读器可能只支持有限的嵌套深度,例如ISO 32000-1提到最大深度为28个信封
因此,如果你仍然有机会彻底检查你的设计,你应该考虑把图像放在注释外观而不是页面内容中。毕竟,你已经被解雇了
for (PdfName key : xobjects.getKeys()) {
xobjects.remove(key);
}