【问题标题】:Editing existing hyperlinks in pdf with itext 4使用 itext 4 编辑 pdf 中的现有超链接
【发布时间】:2019-12-31 10:33:00
【问题描述】:

我们需要更改 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();
        }
    }
}

【问题讨论】:

    标签: java pdf hyperlink itext


    【解决方案1】:

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

    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();
    

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多