@Override
 public boolean isOwnerAuthorised() {
   for (final PDFDecrypter decrypter : decrypters.values()) {
     if (decrypter.isOwnerAuthorised()) {
       return true;
     }
   }
   return false;
 }
 @Override
 public boolean isEncryptionPresent() {
   for (final PDFDecrypter decrypter : decrypters.values()) {
     if (decrypter.isEncryptionPresent()) {
       return true;
     }
   }
   return false;
 }
 @Override
 public ByteBuffer decryptBuffer(String cryptFilterName, PDFObject streamObj, ByteBuffer streamBuf)
     throws PDFParseException {
   final PDFDecrypter decrypter;
   if (cryptFilterName == null) {
     decrypter = defaultStreamDecrypter;
   } else {
     decrypter = decrypters.get(cryptFilterName);
     if (decrypter == null) {
       throw new PDFParseException("Unknown CryptFilter: " + cryptFilterName);
     }
   }
   return decrypter.decryptBuffer(
       // elide the filter name to prevent V2 decrypters from
       // complaining about a crypt filter name
       null,
       // if there's a specific crypt filter being used then objNum
       // and objGen shouldn't contribute to the key, so we
       // should make sure that no streamObj makes its way through
       cryptFilterName != null ? null : streamObj,
       streamBuf);
 }
 @Override
 public String decryptString(int objNum, int objGen, String inputBasicString)
     throws PDFParseException {
   return defaultStringDecrypter.decryptString(objNum, objGen, inputBasicString);
 }
 @Override
 public boolean isEncryptionPresent(String cryptFilterName) {
   PDFDecrypter decrypter = decrypters.get(cryptFilterName);
   return decrypter != null && decrypter.isEncryptionPresent(cryptFilterName);
 }