2015-03-26 6 views
5

Potrzebuję oczyścić dokument PDF z adnotacji linków. Oto szablon kodu mam:PDFBox: Jak zmodyfikować stronę i zapisać zmiany w nowym pliku (np. Usunąć adnotację do linku)?

public static void main(String[] args) throws IOException, COSVisitorException { 
    try (PDDocument doc = PDDocument.load("input.pdf")) { 
     final List<PDPage> pages = doc.getDocumentCatalog().getAllPages(); 
     for (PDPage page : pages) { 
      List<PDAnnotation> annotations = page.getAnnotations(); 
      for (PDAnnotation ann : annotations) { 
       if (ann instanceof PDAnnotationLink) { 
        PDAnnotationLink link = (PDAnnotationLink) ann; 
        PDAction action = link.getAction(); 
        if (action instanceof PDActionURI) { 
         final PDActionURI linkUri = (PDActionURI) action; 
         if (linkUri.getURI().contains("www.example.com")) { 
          // TODO remove the link 
         } 
        } 
       } 
      } 
     } 
     doc.save("output.pdf"); 
    } 
} 

Ale nie mogłem znaleźć sposób, aby usunąć łącza stałe i zapisać te zmiany w nowym pliku, linki są nadal.

Jak zapisać zmiany strony?

+0

Czy wypróbowałeś program ustawiający, w którym użyłeś gettera (np. SetURI (null)? Lub utworzyć listę adnotacji mniejszych od tych, których nie lubisz, a następnie przesłać tę nową listę przy ustawieniu setAnnotations()? –

+0

1) Identyfikator URI do wartości null nie usuwa samego linku, po prostu kończy się uszkodzonym łączem. 2) tak, próbowałem, to nie pomogło. – andrew

+0

Przydałoby się dodać kod, którego używałeś (2). I link do pliku PDF, nad którym pracujesz (jeśli nie jest poufny). Proszę również wspomnieć o wersji, z której korzystasz (prawdopodobnie 1.8.8). –

Odpowiedz

0

Niedawno miałem podobne zadanie. Może ta odpowiedź zaoszczędzić trochę czasu dla kogoś.

W poniższym fragmencie kodu użyłem PDFBox 2.0.4.

Cóż, możesz usunąć adnotację z dokumentu, usuwając ją z listy adnotacji, która została uzyskana przez wywołanie metody page.getAnnotations(). Trudne jest to, że nie możesz tego zrobić przez odniesienie. Na przykład możesz powtórzyć wszystkie adnotacje, zebrać te, które powinny zostać usunięte z dokumentu, a następnie zadzwonić pod numer annotations.removeAll(shouldBeRemoved). Ale w ten sposób nie ma garanty, że niechciane adnotacje zostaną faktycznie usunięte z dokumentu. Obiekty adnotacji zwracane przez metodę page.getAnnotations() mogą nie być dokładnie tymi samymi obiektami adnotacji, które są trzymane na stronie. Niezawodny sposób, aby usunąć z listy adnotacji jest ich usunięcie przez indeks:

List<PDAnnotation> annotations = page.getAnnotations(); 
for (int i = 0; i < annotations.size();) { 
    PDAnnotation annotation = annotations.get(i++); 
    if (annotation instanceof PDAnnotationLink) { 
     PDAnnotationLink link = (PDAnnotationLink) annotation; 
     PDAction action = link.getAction(); 
     if (action instanceof PDActionURI) { 
      PDActionURI uriAction = (PDActionURI) action; 
      String uri = uriAction.getURI(); 
      if (uri != null && uri.contains("<some_text>")) 
       annotations.remove(--i); 
     } 
    } 
} 

PS: Jak zaznaczył @mkl, może to nie wystarczyć do usunięcia linków z dokumentu. W takim przypadku należy przeanalizować treść strony i przepisać ją, wykluczając tokeny związane z tekstem, który należy usunąć z dokumentu.

Powiązane problemy