我们需要更改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:
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而无需采取进一步的操作:
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();