使用 itext 4 编辑 pdf 中的现有超链接

2024-03-31

我们需要更改 pdf 中的超链接。有很多以p-开头的超链接,我们需要删除p-。

到目前为止我们已经能够阅读超链接了。 有人知道如何编辑它们并保存pdf吗?

谢谢

public static void main(final String[] args) {
    final List<byte[]> pdfs = new ArrayList<>();
    final List<String> testfiles = Arrays.asList("72076.5.1.pdf");
    final String dir = "C:\\Entwicklung\\testaround\\pdf\\";
    for (final String name : testfiles) {
        final File file = new File(dir + name);
        final Path path = Paths.get(file.toURI());
        try (InputStream istream = new FileInputStream(path.toFile())) {
            final byte[] data = ByteStreams.toByteArray(istream);
            pdfs.add(data);
            final PdfReader reader = new PdfReader(data);
            final PdfDictionary pageDictionary = reader.getPageN(36);
            final PdfArray annotations = pageDictionary.getAsArray(PdfName.ANNOTS);
            if (annotations != null && annotations.size() != 0) {
                for (int i = 0; annotations.size() > i; i++) {
                    final PdfObject annot = annotations.getDirectObject(i);
                    final PdfDictionary annotationDictionary = (PdfDictionary)PdfReader.getPdfObject(annot);
                    if (annotationDictionary.get(PdfName.SUBTYPE).equals(PdfName.LINK)) {
                        final PdfDictionary annotationAction = annotationDictionary.getAsDict(PdfName.A);
                        if (annotationAction.get(PdfName.S).equals(PdfName.URI)) {
                            final PdfString destination = annotationAction.getAsString(PdfName.URI);
                            final String url = destination.toString();
                            System.out.println(url);
                        }
                    }
                }
            }
            final int n = reader.getNumberOfPages();
            System.out.println("Pages : " + n);
            Files.write(Paths.get(dir + "new.pdf"), data);
        } catch (final FileNotFoundException e) {
            e.printStackTrace();
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }
}

首先,您必须将新值设置为URI键入annotationAction字典:

if (annotationAction.get(PdfName.S).equals(PdfName.URI)) {
    final PdfString destination = annotationAction.getAsString(PdfName.URI);
    final String url = destination.toString();
    System.out.println(url);
    String updatedUrl = [... url changed to match the changed criteria ...];
    annotationAction.put(PdfName.URI, new PdfString(updatedUrl));
}

之后,您必须通过应用保存更改PdfStamper无需采取进一步行动:

final byte[] data = ByteStreams.toByteArray(istream);
pdfs.add(data);
final PdfReader reader = new PdfReader(data);
final PdfDictionary pageDictionary = reader.getPageN(36);
final PdfArray annotations = pageDictionary.getAsArray(PdfName.ANNOTS);
if (annotations != null && annotations.size() != 0) {
    [...]
}
new PdfStamper(reader, new FileOutputStream(dir + name + "-new.pdf")).close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 itext 4 编辑 pdf 中的现有超链接 的相关文章

随机推荐

  • 如何解析会导致非法 C# 标识符的 JSON 字符串?

    我一直在使用NewtonSoft JSON 转换 http james newtonking com json用于解析 JSON 字符串并将其转换为 C 对象的库 但现在我遇到了一个非常尴尬的 JSON 字符串 我无法将其转换为 C 对象
  • JavaMail 与 Oauth 和 Office365

    我正在用 Java 构建一个简单的命令行应用程序 它可以登录我的电子邮件箱 IMAP 并下载所有附件 我使用了基本身份验证 但 Microsoft 正在禁用它 因此我尝试将我的应用程序转换为使用 OAuth 在阅读了不同的 OAuth 流程
  • 部署时出现 aws beanstalk 403 错误

    您好 我正在使用亚马逊网络服务弹性豆茎 每次我使用 git aws push 时 我的 php 应用程序都会成功上传但是 当我单击 url 时 它会显示 Forbidden You don t have permission to acce
  • 自旋锁与忙等待[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 请解释原因忙碌等待通常不受欢迎 而Spinning通常被认为还可以 据我所知 它们都会无限循环 直到满足某些条件 A 自旋锁通常在资源争用较少时
  • 使用Mysql lower_case_table_names为1

    我已经使用 yum 在 linux 中安装了 mysql v5 5 17 现在我想要默认的小写表名 所以我添加了 set variable lower case table names 1 in etc my cnf 但如果我这样做 我就无
  • 获取安装目录安装盾

    我想通过安装盾来创建我的设置 我使用命令参数Setup exe path SETUPEXEDIR log txt我的设置位置是Desktop myapp Setup exe使用 SETUPEXEDIR 时返回临时文件夹 我希望在使用 SET
  • 为什么我不能让单个 Redis 客户端在同一连接中充当 PUB 和 Sub ?

    我的思维模型是 聊天 我订阅了某个频道 并且可以向该频道发布消息 由于 pub sub 是异步的 因此发布的消息可能随时出现 包括当您期望命令响应时 尽管 Redis 是单线程的 通常会阻止此类事情 但网络延迟可能会导致一些有趣的影响 根据
  • 如何修复“属性没有初始值设定项并且未在构造函数中明确分配”错误?

    我对这些课程有疑问 我想使用该方法doSomething 班级独有B无需每次都进行类型转换 但是当我指定属性时a属于类型B 它告诉我它没有在构造函数中分配 这有点错误 因为父构造函数进行了分配 class A class B extends
  • 在 Android 模拟器上安装 Flash Player

    我想知道在android模拟器上安装flash播放器的过程 请详细 我需要执行此操作来测试应用程序 但目前我没有任何物理设备 我已经尝试过的事情 1 我已经检查了有关此主题的所有堆栈溢出链接 2 我已经知道adobe已经停止了android
  • 如何实现 STL 风格的迭代器并避免常见的陷阱?

    我创建了一个集合 我想为其提供一个 STL 风格的随机访问迭代器 我正在寻找迭代器的示例实现 但没有找到 我知道需要 const 重载 and 运营商 迭代器 STL 风格 的要求是什么 还有哪些其他需要避免的陷阱 如果有 附加上下文 这是
  • 背景图像未完全拉伸

    前几天我刚刚启动了一个网站 并认为它没有奇怪的 CSS 错误 但显然事实并非如此 我在这里尝试做的是拉伸图像以适应页面的高度和宽度 问题 我有以下标记 img src images night sky7 jpg class stretch
  • Debian 的简单初始化脚本中出现“;;意外”语法错误

    我有这个初始化脚本来运行 uwsgi 它有效 但仅限于启动命令 所有其他命令都会给我这个错误 etc init d uwsgi 27 etc init d uwsgi Syntax error unexpected 我正在阅读的教程中似乎应
  • 负载测试kafka消费者

    我正在编辑问题 因为我认为它不够清楚 如何对我的 kafka 消费者进行负载测试 我看过很多关于 apache kafka 负载测试的文章 但没有一篇关于消费者负载测试的文章 对于前 我在jsr223中编写了jmeter kafka生产者测
  • 当子视图的内容更改时,滚动视图不会调整大小

    我有一个WebView在 的里面ScrollView 内容为WebView当显示不同的html页面时动态变化 我有以下问题 例如我有A html and B html 内容为B html大于A html 所以页面更长 When WebVie
  • 最大乘法列数

    我有一个小问题 在我的表中我有这些行 PersHist ID Date Histroy 1 01 01 2008 0 1 01 01 2008 1 1 01 01 2008 2 1 02 01 2008 0 1 02 01 2008 1 现
  • 如何运行Docker检查来获取ECR注册表中图像的图像元数据

    我拥有对 ECR 注册表的相关访问权限 但是我无法通过运行 Docker 检查命令来获取图像元数据 我正在尝试与 docker inspect ecrregistryurl dockerimage imageversion update 如
  • 将 Shiny DT 行复制到用户剪贴板

    有没有办法让闪亮的数据表 DT 中选定的行可供用户复制 Ctrl C 到剪贴板 理想情况下 它还可以提供数据表的列名或标题 UPDATE global R library rclipboard library shiny ui R rcli
  • 在 Selenium Webdriver Java 中,是否可以在不使用 driver.switchTo().frame("frameName") 的情况下切换到框架中的元素?

    我有多个嵌套框架 我需要访问这些框架下的元素 由于这些框架是动态的 我无法访问这些元素 我是否可以在不使用的情况下访问元素driver switchTo frame 喜欢直接使用 xpath 或 jquery javascript 或其他什
  • 在 Sublime Text 3 上为自定义 html 元素设置自动完成

    再会 如何在 sublime text 3 上为自定义 html 元素设置自动完成 例如如果我输入 dog然后按tab就会变成
  • 使用 itext 4 编辑 pdf 中的现有超链接

    我们需要更改 pdf 中的超链接 有很多以p 开头的超链接 我们需要删除p 到目前为止我们已经能够阅读超链接了 有人知道如何编辑它们并保存pdf吗 谢谢 public static void main final String args f