Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用基于iText Core的OpenPdf从pdf页面删除或更新添加的图像图标_Java_Android_Itext_Openpdf - Fatal编程技术网

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页面中!真的!!!:)

我认为应该有另一个地方,这些物体应该被移除

这里发生的情况是,您确实从页面中删除了位图图像资源:

但您不会删除从内容流中绘制这些资源的说明。这有两个后果:

  • 严格来说,您的PDF是无效的,因为资源是从页面资源中未定义的内容流引用的。根据所涉及的查看器,这可能会导致警告消息
  • 如果PDF被进一步处理,并且某些新的XObject被添加到具有相同资源名称的同一页面,则原始图像绘制指令现在再次具有要绘制的资源,并使其再次显示在原始位置
  • 这就解释了你的观察:

    当我删除它们并尝试添加一个新对象时,最后一个删除的对象出现并添加到pdf页面中!真的!!!:)

    我假设您在测试中使用了相同的源图像,因此看起来原始图像再次出现在原始位置,而实际上新图像出现在那里

    因此,您可以选择以下任一选项,而不仅仅是删除图像XObject

    • 同时从内容流中删除XObject绘图指令或
    • 将图像XObject替换为不可见的XObject
    前一个选项通常是非常重要的,特别是如果您的PDF工具还允许对页面内容进行其他更改的话。对于iText 5或iText 7,我建议使用
    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);
          }