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

使用pdfbox创建新的自定义COSBase对象?

郦祯
2023-03-14

我们可以创建一个新的自定义PDF运算符(如PDF运算符{BDC})和COSBase对象(如COSName{P}COSName{Prop1}(Prop1将再次引用一个obj))吗?并将这些添加到pdf的根结构中?

我从现有的pdf文档中阅读了一些解析器标记列表。我想标记pdf。在这个过程中,我将首先使用新创建的COSBase对象操作标记列表。最后我将它们添加到根树结构中。所以在这里我如何创建一个COSBase对象。我正在使用代码从pdf中提取标记是

old_document = PDDocument.load(new File(inputPdfFile));
List<Object> newTokens = new ArrayList<>();
for (PDPage page : old_document.getPages()) 
{
    PDFStreamParser parser = new PDFStreamParser(page);
    parser.parse();
    List<Object> tokens = parser.getTokens();
    for (Object token : tokens) {
        System.out.println(token);
        if (token instanceof Operator) {
            Operator op = (Operator) token;     
        }
}
newTokens.add(token);
}

PDStream newContents = new PDStream(document);
document.addPage(page);
OutputStream out = newContents.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
out.close();
page.setContents(newContents);
document.save(outputPdfFile);
document.close();

以上代码将创建一个包含所有格式和图像的新pdf。所以在newTokens列表中包含所有现有的COSBase对象,所以我想使用一些标记COSBase对象进行操作,如果我保存了新文档,那么应该在不考虑任何解码、编码、字体和图像处理的情况下对其进行标记。

首先,这个想法行得通吗?如果是,请帮助我编写一些代码来创建自定义的COSBase对象。我对java非常陌生。

共有1个答案

古明煦
2023-03-14

根据您的文档格式,您可以插入标记的内容。

//Below code is to add   "/p <<MCID 0>> /BDC"

newTokens.add(COSName.getPDFName("P"));
currentMarkedContentDictionary = new COSDictionary();
currentMarkedContentDictionary.setInt(COSName.MCID, mcid);
mcid++;
newTokens.add(currentMarkedContentDictionary);
newTokens.add(Operator.getOperator("BDC"));

// After adding mcid you have to append your existing tokens TJ , TD, Td, T* ....
newTokens.add(existing_token);
// Closed EMC
newTokens.add(Operator.getOperator("EMC"));
//Adding marked content to the root tree structure.
structureElement = new PDStructureElement(StandardStructureTypes.P, currentSection);
structureElement.setPage(page);
PDMarkedContent markedContent = new PDMarkedContent(COSName.P, currentMarkedContentDictionary);
structureElement.appendKid(markedContent);
currentSection.appendKid(structureElement);

感谢@Tilman Hausherr

 类似资料:
  • 问题内容: 我正在尝试将下拉框小部件转换为意见箱,因为当前的下拉菜单有100多个选择。看来您只能将String建议添加到ModifyOracle。我需要能够添加一个既包含描述又包含与记录匹配的ID的自定义对象到数据库。我是否必须扩展RecommendationOracle类? 问题答案: 是的,因为我知道您不能使用一对值,即Id和Value。您必须在建议框中添加您的字符串,也许您可​​以使用除建议

  • 问题内容: 我需要创建一个PDF,其中将包含执行状态报告,其中状态将以表格结构显示。是否可以使用PDFBOX API生成pdf表格式? 以下是一些用于创建新PDF文档的示例代码: 问题答案: 试试这个: 只需在函数中调用此方法

  • 问题内容: 我想问一个与这个问题相同的问题,但使用SWT:是否有一种方法可以制作带有您自己的按钮图形的按钮,而不仅仅是按钮内的图像?如果不是,这是在Java中创建自定义按钮的另一种方法吗? 问题答案: public class ImageButton extends Canvas { private int mouse = 0; private boolean hit = false;

  • 我在创建包含自定义对象数组的数组时遇到了问题。 出于多种原因,我希望将容器创建为可比较数组的标准数组: 其中包含的每个自定义对象数组必须具有不同的长度 自定义对象数组内置了自动排序工具,这些工具不适合我希望它们适合的较大包含数组 自定义对象数组可以工作,并且已经过彻底测试。 我在创建较大对象时收到的例外情况是: 线程“main”中出现异常java.lang.ClassCastException:

  • 基本上,我想知道我是否可以创建一个树并在JavaFX上自定义它...我试着去做,但到目前为止还不能用这个代码做任何事情... 我在质疑自己,这是否是正确的“技术”,可以解决我想做的事情... 我从https://docs.oracle.com/javafx/2/ui_controls/tree-view.htm#babjgggf看到了这个教程,但我对这个教程真的很困惑...我不太了解细胞工厂的机制

  • 问题内容: 我正在用Gradle创建一个构建过程,我想提供一个使用Java代码的插件。Gradle 插件文档 说 这是可能的: 您可以使用任何喜欢的语言来实现自定义插件,前提是该实现最终会编译为字节码。对于此处的示例,我们将使用Groovy作为实现语言。如果需要,可以改用Java或Scala。 但是,经过数小时的谷歌搜索和阅读之后,我还没有找到有关如何使用Java创建Gradle自定义插件的任何说