Java-PDFbox: Creating the artifact tag for lines and underlines in tagged PDF(Java-PDFbox:为带标签的PDF中的线条和下划线创建构件标签)
问题描述
我正在从标记的pdf创建辅助功能PDF。它显示";路径对象未标记&q;错误。PDF有线条和带下划线的文本。因此,我正在尝试为未添加标签的行项目添加";artiture";标记。我可以从PDFGraphicsStreamEngine
获得这些行。有人能帮我这个忙吗?
PDF页面 | PAC3错误 |
---|---|
推荐答案
您可以使用PdfContentStreamEditor
中的PdfContentStreamEditor
类根据需要编辑页面内容流,方法如下:
PDDocument document = ...;
for (PDPage page : document.getDocumentCatalog().getPages()) {
PdfContentStreamEditor markEditor = new PdfContentStreamEditor(document, page) {
int markedContentDepth = 0;
@Override
public void beginMarkedContentSequence(COSName tag, COSDictionary properties) {
if (inArtifact) {
System.err.println("Structural error in content stream: Path not properly closed by path painting instruction.");
}
markedContentDepth++;
super.beginMarkedContentSequence(tag, properties);
}
@Override
public void endMarkedContentSequence() {
markedContentDepth--;
super.endMarkedContentSequence();
}
boolean inArtifact = false;
@Override
protected void write(ContentStreamWriter contentStreamWriter, Operator operator, List<COSBase> operands) throws IOException {
String operatorString = operator.getName();
boolean unmarked = markedContentDepth == 0;
boolean inArtifactBefore = inArtifact;
if (unmarked && (!inArtifactBefore) && PATH_CONSTRUCTION.contains(operatorString)) {
super.write(contentStreamWriter, Operator.getOperator("BMC"), Collections.singletonList(COSName.ARTIFACT));
inArtifact = true;
}
super.write(contentStreamWriter, operator, operands);
if (unmarked && inArtifactBefore && PATH_PAINTING.contains(operatorString)) {
super.write(contentStreamWriter, Operator.getOperator("EMC"), Collections.emptyList());
inArtifact = false;
}
}
final List<String> PATH_CONSTRUCTION = Arrays.asList("m", "l", "c", "v", "y", "h", "re");
final List<String> PATH_PAINTING = Arrays.asList("s", "S", "f", "F", "f*", "B", "B*", "b", "b*", "n");
};
markEditor.processPage(page);
}
document.save(...);
(EditMarkedContent测试testMarkUnmarkedPathsAsArtifactsTradeSimple1
)
beginMarkedContentSequence
和endMarkedContentSequence
覆盖跟踪当前标记的内容嵌套深度,特别是是否标记了当前内容。
对于尚未标记的指令,write
覆盖会将未标记的路径构建和绘制指令序列包含在/Artifact BMC ... EMC
中。
请注意,此代码仅考虑页面内容流中的内容,它不会下降为表单XObject、模式等。
此外,如果内容流有错误(例如,在没有绘制的情况下构建路径),此代码可能会添加额外的错误(例如,不平衡的标记内容开始和结束)。
这篇关于Java-PDFbox:为带标签的PDF中的线条和下划线创建构件标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java-PDFbox:为带标签的PDF中的线条和下划线创建构件标签
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01