当前位置: 首页 > 知识库问答 >
问题:

如何使用pdfbox从pdf中删除可选内容组及其内容?

赫连心思
2023-03-14

我已经实现了从pdf中删除图层的功能,但问题是,我在图层上绘制的内容无法删除。下面是我用来删除图层的代码:

PDDocumentCatalog documentCatalog = doc.getDocumentCatalog();
PDOptionalContentProperties ocgProps = documentCatalog.getOCProperties();
PDOptionalContentGroup ocg = ocgProps.getGroup(markupLayerName);

    COSDictionary ocgsDict = (COSDictionary)ocgProps.getCOSObject();
    COSArray ocgs = (COSArray)ocgsDict.getItem(COSName.OCGS);
    int indexToBeDeleted = -1;
    for (int index = 0; index < ocgs.size(); index++)
    {
         COSBase o = ocgs.get(index);
         COSDictionary ocgDict = ToCOSDictionary(o);
          if (ocgDict.getString(COSName.NAME) == markupLayerName)
          {
              indexToBeDeleted = index;
               break;
           }
    }
    if (indexToBeDeleted >= 0)
     {
        cgs.remove(indexToBeDeleted);
        ocgsDict.setItem(COSName.OCGS, ocgs);
        documentCatalog.setOCProperties(new PDOptionalContentProperties(ocgsDict));

      }

共有1个答案

居和顺
2023-03-14

要删除标记数据,我需要修改PDPage的内容。我只是搜索了BDC和EMC对的内容,然后搜索了该对是否属于相关层,如果是,则从内容中删除该部分。下面是我使用的C#代码:

                PDPage page = (PDPage)doc.getDocumentCatalog().getPages().get(pageNum);
                PDResources resources = page.getResources();
                PDFStreamParser parser = new PDFStreamParser(page);
                parser.parse();
                java.util.Collection tokens = parser.getTokens();
                java.util.List newTokens = new java.util.ArrayList();
                List<Tuple<int, int>> deletionIndexList = new List<Tuple<int, int>>();
                object[] tokensArray = tokens.toArray();
                for (int index = 0; index < tokensArray.Count(); index++)
                {
                    object obj = tokensArray[index];
                    if (obj is COSName && (((COSName)obj) == COSName.OC))
                    {
                        int startIndex = index;
                        index++;
                        if (index < tokensArray.Count())
                        {
                            obj = tokensArray[index];
                            if (obj is COSName)
                            {
                                PDPropertyList prop = resources.getProperties((COSName)obj);//Check if the COSName found is the resource name of layer which contains the markup to be deleted.
                                if (prop != null && (prop is PDOptionalContentGroup))
                                {
                                    if (((PDOptionalContentGroup)prop).getName() == markupLayerName)
                                    {
                                        index++;
                                        if (index < tokensArray.Count())
                                        {
                                            obj = tokensArray[index];
                                            if (obj is Operator && ((Operator)obj).getName() == "BDC")//Check if the token specifies the start of markup
                                            {

                                                int endIndex = -1;
                                                index++;
                                                while (index < tokensArray.Count())
                                                {
                                                    obj = tokensArray[index];
                                                    if (obj is Operator && ((Operator)obj).getName() == "EMC")//Check if the token specifies the end of markup
                                                    {
                                                        endIndex = index;
                                                        break;
                                                    }
                                                    index++;
                                                }
                                                if (endIndex >= 0)
                                                {
                                                    deletionIndexList.Add(new Tuple<int, int>(startIndex, endIndex));
                                                }
                                            }

                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                int tokensListIndex = 0;
                for (int index = 0; index < deletionIndexList.Count(); index++)
                {
                    Tuple<int, int> indexes = deletionIndexList.ElementAt(index);
                    while (tokensListIndex < indexes.Item1)
                    {
                        newTokens.add(tokensArray[tokensListIndex]);
                        tokensListIndex++;
                    }
                    tokensListIndex = indexes.Item2 + 1;
                }
                while (tokensListIndex < tokensArray.Count())
                {
                    newTokens.add(tokensArray[tokensListIndex]);
                    tokensListIndex++;
                }
                PDStream newContents = new PDStream(doc);
                OutputStream output = newContents.createOutputStream(COSName.FLATE_DECODE);
                ContentStreamWriter writer = new ContentStreamWriter(output);
                writer.writeTokens(newTokens);
                output.close();
                page.setContents(newContents);
 类似资料:
  • 我使用的是来自java的ApachePDFBox,我有一个带有多个可选内容组的源PDF。我想做的是导出一个PDF版本,其中只包含标准内容和启用的可选内容组。为了我的目的,我保留原作的任何动态方面是很重要的。。。。因此,文本字段是静态文本字段,矢量图像是静态矢量图像,等等。之所以需要这样做,是因为我打算最终使用一个pdf表单编辑器程序,它不知道如何处理可选内容,并且会盲目地渲染所有内容,所以我想预处

  • 我正在尝试用Java中的PDFBox编辑pdf的一些内容。问题是,每当我编辑pdf中的任何字符串,并尝试使用Adobe Reader打开它时,最后一行不会出现在新呈现的pdf中。 当我尝试直接从浏览器顶部打开渲染的pdf时,我能够看到最后一行。但是,它以不同的格式编码。我正在使用以下代码编辑pdf的内容: 编辑pdf会删除“有问题?...”这一行。这里有什么问题?我做错了什么吗? 谢谢。

  • 问题内容: 我尝试修改的内容具有一系列条目,并且在每个条目中还有其他条目。没有标签可以帮助您。我希望脚本执行的操作是检查每个条目的内容并查找一些文本。这将用于确定整个’‘条目是否被删除/隐藏。这可能吗?怎么样? 下面是一个例子。页面中有几个这样的标签,我想删除/隐藏标签中的文本为“是” 的标签。因此,在此示例中,整个事情将被删除/隐藏。 问题答案: 对于此类问题,请发布指向目标页面的链接。或者,如

  • 链接到pdf 当我尝试从上面的pdf中提取文本时,我得到了在evince viewer中不可见的文本和可见的文本的混合。此外,一些所需的文本缺少查看器中没有缺少的字符,例如,“FALCONS”中的“S”和许多缺少的“½”字符。我认为这是由于不可见文本的干扰,因为在查看器中突出显示pdf时,可以看到不可见文本与可见文本重叠。 有没有办法去掉不可见的文字?还是有别的解决办法? 代码: 输出(粗体文本为

  • 出于某种原因,我的回答只给出了空的方括号,即[],什么都没有发生。 这是我的代码: 更新:根据John的建议,我尝试创建一个测试桶,但不幸的是,我收到了一个权限拒绝错误。所以我做了以下操作: 在我有权访问的bucket下创建了一个名为“test”的文件夹 这次我确实收到了一个ResponseMetadata对象,而不是空括号。然而,我仍然感到困惑。我的HTTPStatusCode是200。但当它告

  • 我正在从PDF中删除一个带有书签链接的页面。删除页面后,指向此页面的书签链接不再有效。 我没有从PDFBox api中找到一种方法来完成这项工作 有没有办法删除这个书签?有没有办法删除全部书签? 提前感谢