pdfbox - PDFBox:删除图像后面的文本
问题描述
我需要将 pdf 分成两份,一份是图片,一份是文本。我不想删除图像后面的文本,它应该是图像 pdf 的一部分。我只想提取 PDF 中的顶层文本。有人可以帮忙吗?
我已经通过循环 pdf 运算符将图像和文本提取到两个 pdf 中。当不删除 PDF 后面的文本时,我遇到了麻烦。
解决方案
删除文本的代码:
PDDocument document = null;
try {
document = PDDocument.load(new File(inputfilePath), password);
PDPageTree allPages = document.getDocumentCatalog().getPages();
for (int i = 0; i < allPages.getCount(); i++) {
PDPage page = (PDPage) allPages.get(i);
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List tokens = parser.getTokens();
List newTokens = new ArrayList();
for (int j = 0; j < tokens.size(); j++) {
Object token = tokens.get(j);
if (token instanceof Operator) {
Operator op = (Operator) token;
if (op.getName().equalsIgnoreCase(
"tj")) {
try {
// remove the one argument to this operator
newTokens.remove(newTokens.size() - 1);
} catch (Exception e) {
e.printStackTrace();
}
continue;
}
// Header doesn't contain versioninfo
}
newTokens.add(token);
}
PDStream newContents = new PDStream(document);
ContentStreamWriter writer = new ContentStreamWriter(newContents.createOutputStream());
writer.writeTokens(newTokens);
// In writeTokens method, I closed the output stream.. This is
// for future reference.. or it will throw stream not closed
// error
newContents.addCompression();
page.setContents(newContents);
if (DEBUG)
System.out.println("Background image pdf creation process");
document.setAllSecurityToBeRemoved(true);
document.save(outputFolder + "/img_" + fileName);
为了删除图像和阴影,我使用了以下代码:
for (int j = 0; j < tokens.size(); j++) {
Object token = tokens.get(j);
if (token instanceof Operator) {
Operator op = (Operator) token;
// Text Extraction removing image and shades
if (op.getName().equalsIgnoreCase("do") || op.getName().equalsIgnoreCase("sh")
|| op.getName().equalsIgnoreCase("gs") || op.getName().equalsIgnoreCase("bi")
|| op.getName().equalsIgnoreCase("id") || op.getName().equalsIgnoreCase("ei")
|| op.getName().equalsIgnoreCase("bmc") || op.getName().equalsIgnoreCase("bdc")
|| op.getName().equalsIgnoreCase("emc") || op.getName().equalsIgnoreCase("m")
|| op.getName().equalsIgnoreCase("w")
|| op.getName().equalsIgnoreCase("re")
) {
// remove the one argument to this operator
newTokens.remove(newTokens.size() - 1);
continue;
}
}
newTokens.add(token);
}
推荐阅读
- html - 如何在 HTML 中创建带有左侧边栏和标题的母版页?
- c - C程序找到2个矩形面积的并集
- docker - Docker-compose 不将容器附加到网络
- abap - 自定义字段 FB02 SAPMF05L Dynpro 1710
- android - Android Studio 没有构建完整的文件
- google-cloud-platform - 如何在 Google Cloud Platform 上的 Compute Engine 中使用环境变量?
- libcurl - Adobe 括号未在 lunix 上安装
- javascript - 如何使用 JAVASCRIPT 调用 ETH 美元价格
- javascript - 如何验证我的 MaterializeCSS 表单,如果选择中的第一个值 - 不要发送表单并显示错误?
- java - 为什么多个图像选择在少数设备而不是所有设备上都有效?