views:

181

answers:

0

I'm trying to remove attachments from a number of my pdf files (I can extract via pdftk, so preserving them is not an issue).

I coded the following based on an example found from a google search:

    import java.io.FileOutputStream;
    import java.io.IOException;
    import com.lowagie.text.*;
    import com.lowagie.text.pdf.*;

    class pdfremoveattachment {

    public static void main(String[] args) throws IOException, DocumentException {
        if (args.length < 2) {
            System.out.println("Usage: java PDFremoveAttachments source.pdf target.pdf"); 
            System.exit(1);
        }
        PdfReader sourcePDF = new PdfReader(args[0]);
        removeAttachments(sourcePDF);   
        FileOutputStream targetFOS = new FileOutputStream(args[1]);
        PdfStamper targetPDF = new PdfStamper(sourcePDF,targetFOS);
        targetPDF.close();
    }

    public static void removeAttachments(PdfReader reader) {  
            PdfDictionary catalog = reader.getCatalog();
//      System.out.println(catalog.getAsDict(PdfName.NAME)); // this would print "null"
        PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.NAMES));
//      System.out.println(names.toString());    //this returns NPE
            if( names != null)   {

      PdfDictionary files = (PdfDictionary) PdfReader.getPdfObject(names.get(PdfName.FILEATTACHMENT));  
                    if( files!= null ){  
                            for( Object key : files.getKeys() ){
              files.remove((PdfName)key);        
                            }
      files = (PdfDictionary) PdfReader.getPdfObject(names.get(PdfName.EMBEDDEDFILES));
            }   
                    if( files!= null ){
                            for( Object key : files.getKeys() ){
              files.remove((PdfName)key);
                            }

            reader.removeUnusedObjects();
                }  
            }
      } 
    }

If anyone knows how I might be able to remove attachments, I'd greatly appreciate a reply.