从pdf文档中的每个页面删除Annots

时间:2017-11-15 12:53:57

标签: java pdf pdfbox

我从一个网站下载了pdf文件,每个页面上都有一个矩形的超链接。我想从每个页面删除链接。 我使用的是PDFBox 2.0.8版本。

我发现链接描述位于文档的每个页面的ANNOTS中。我删除了与链接相对应的ANOOTS。因为我将来自PDF目录的链中的每个节点的needToUpdated标志设置为true。 在调试模式下,我看到在AccessPermission对象中readOnly标志设置为true。 当我打开编辑的pdf文件时,所有页面都是空的,并且对于每个页面,Acrobat Reader都显示以下错误:

  

处理页面时出错。无效的功能资源。

我有几个问题:

  1. 设置readOnly标志时,是否可以以编程方式更改pdf文件 在AccessPermission对象中为true?
  2. 为什么我会收到上述错误?
  3. 我需要做什么才能从页面和每个页面中删除不必要的链接 页面在pdf文档中正确显示?
  4. 这是我的代码(对不起质量,这只是草稿):

    File book = new File(path_to_pdf_file);
            PDDocument document = PDDocument.load(book);
            document.setAllSecurityToBeRemoved(true);
    
            COSDictionary dictionary = document.getDocumentCatalog().getCOSObject();
            dictionary.removeItem(COSName.PERMS);
            dictionary.setNeedToBeUpdated(true);
    
            ((COSObject) document.getDocumentCatalog().getCOSObject().getItem(COSName.PAGES)).setNeedToBeUpdated(true);
            dictionary = document.getDocumentCatalog().getPages().getCOSObject();
            dictionary.setNeedToBeUpdated(true);
            COSArray arr = (COSArray) dictionary.getDictionaryObject(COSName.KIDS);
            arr.setNeedToBeUpdated(true);
    
    
            COSArray arrayForLoop;
            COSDictionary tempDic;
            for (int k = 0; k < arr.size(); ++k) {
                COSObject object = (COSObject) arr.get(k);
                object.setNeedToBeUpdated(true);
    
                dictionary = (COSDictionary) object.getObject();
                dictionary.setNeedToBeUpdated(true);
                arrayForLoop = (COSArray) dictionary.getItem(COSName.ANNOTS);
    
                arrayForLoop.setNeedToBeUpdated(true);
    
                arrayForLoop = (COSArray) arrayForLoop.getCOSObject();
                arrayForLoop.setNeedToBeUpdated(true);
                dictionary = (COSDictionary) arrayForLoop.get(0);
                dictionary.setNeedToBeUpdated(true);
    
    
                dictionary.removeItem(COSName.TYPE);
                dictionary.removeItem(COSName.SUBTYPE);
                dictionary.removeItem(COSName.RECT);
                dictionary.removeItem(COSName.BORDER);
    
                tempDic = (COSDictionary) dictionary.getItem(COSName.A);
                tempDic.setNeedToBeUpdated(true);
                dictionary.removeItem(COSName.A);
            }
        document.saveIncremental(new FileOutputStream(path_to_save_file));
        document.close();
    

    在上面的代码中,我遍历每一页,删除对应的ANNOTS 链接。我还使用saveIncremental方法遍历从leaf到root的所有已修改节点。 谢谢你的回答。

0 个答案:

没有答案