2015-03-26 7 views
5

Ho bisogno di ripulire il documento PDF dalle annotazioni dei collegamenti. Ecco un modello di codice che ho:PDFBox: come modificare la pagina e salvare le modifiche in un nuovo file (ad esempio rimuovere l'annotazione del collegamento)?

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"); 
    } 
} 

Ma non riuscivo a trovare un modo per rimuovere i collegamenti in modo permanente e salvare le modifiche in un nuovo file, i collegamenti sono ancora lì.

Come posso salvare le modifiche alle pagine?

+0

Hai provato il setter in cui hai utilizzato il getter (ad esempio setURI (null)? O creare un elenco di annotazioni meno quelle che non ti piacciono, e quindi invia quel nuovo elenco con setAnnotations()? –

+0

1) impostazione L'URI su null non rimuove il collegamento stesso, si finisce con il collegamento interrotto. 2) sì, ho provato, non ha aiutato – andrew

+0

Sarebbe utile aggiungere il codice che hai usato per (2). E un link al file PDF su cui lavori (se non è riservato). Si prega di menzionare anche la versione che si sta utilizzando (probabilmente 1.8.8). –

risposta

0

Recentemente ho avuto il compito simile. Forse questa risposta farà risparmiare un po 'di tempo a qualcuno.

Nello snippet di codice seguente ho utilizzato PDFBox 2.0.4.

Bene, è possibile rimuovere qualsiasi annotazione dal documento semplicemente rimuovendola dall'elenco di annotazioni che è stato ottenuto chiamando il metodo page.getAnnotations(). La cosa ingannevole qui è che non puoi farlo per riferimento. Ad esempio, è possibile scorrere tutte le annotazioni, raccogliere quelle che devono essere rimosse dal documento e quindi chiamare annotations.removeAll(shouldBeRemoved). Ma in questo modo non vi è alcuna garanzia che le annotazioni indesiderate verranno effettivamente rimosse dal documento. Gli oggetti di annotazione restituiti dal metodo page.getAnnotations() potrebbero non essere esattamente gli stessi oggetti di annotazione contenuti nella pagina. modo affidabile per rimuovere le annotazioni dalla lista di loro è la rimozione dall'indice:

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

P.S. Come sottolineato da @mkl, potrebbe non essere sufficiente rimuovere i collegamenti dal documento. In questo caso è necessario analizzare il contenuto della pagina e riscriverlo escludendo i token relativi al testo che devono essere rimossi dal documento.

Problemi correlati