java - 使用 PDFBox 或等效库从 PDF 中删除大标记
问题描述
我的 PDF:s 在许多 pdf 文档的整个首页上都贴有一个非常大的标记,请参见图片。我正在寻找一种自动化的方法来删除这些。
Apache PDFBox有一个相当广泛的 API,有什么方法可以通过正则表达式匹配这些令牌并简单地删除它们并重新保存 pdf?
来自下面发布的 PDF 示例的图像。我想删除的标记是:[KS/2019:589] Lokalvård Grundskolor & Idrottshallar,贴在常规文本之上。Google Drive 链接到完整的 PDF 文件。
解决方案
您可以使用此答案PdfContentStreamEditor
中的类(不要忘记应用答案底部提到的修复程序),如下所示:
try ( PDDocument document = ... ) {
PDPage page = document.getPage(0);
PdfContentStreamEditor editor = new PdfContentStreamEditor(document, page) {
@Override
protected void write(ContentStreamWriter contentStreamWriter, Operator operator, List<COSBase> operands) throws IOException {
String operatorString = operator.getName();
if (TEXT_SHOWING_OPERATORS.contains(operatorString))
{
float fs = getGraphicsState().getTextState().getFontSize();
Matrix matrix = getTextMatrix().multiply(getGraphicsState().getCurrentTransformationMatrix());
Point2D.Float transformedFsVector = matrix.transformPoint(0, fs);
Point2D.Float transformedOrigin = matrix.transformPoint(0, 0);
double transformedFs = transformedFsVector.distance(transformedOrigin);
if (transformedFs > 50)
return;
}
super.write(contentStreamWriter, operator, operands);
}
final List<String> TEXT_SHOWING_OPERATORS = Arrays.asList("Tj", "'", "\"", "TJ");
};
editor.processPage(page);
document.save(...);
}
(EditPageContent测试testRemoveBigTextKommersAnnonsElite
)
您可以在参考答案中找到一些解释。
推荐阅读
- apache-kafka - How can I send performance data from NetApp Harvest to Kafka instead of Graphite server?
- python - Use numpy to get row indexes for a given column value sorted along another column
- java - 编解码器和 mp4 文件的简陋视频 (Xuggle) 问题
- ssl - OpenSSL 证书:作曲家安装的自签名证书
- reactjs - 如何将事件侦听器添加到 create-react-app 默认 sw.js 文件
- javascript - 模态关闭时停止视频 - Plyr 插件
- api - 如何在 ApiResource 中使用 PUT 和 DELETE?
- react-native - 反应本机没有接收到带有套接字 io 的连接回调
- wcf - 用于 HTTPS 与 HTTP 的 IIS 的 WCF 绑定问题 绑定实例已关联以进行侦听
- html - 如何为图像的 css-border 分配动态颜色?