public List<PdfDocumentDescriptor> load(List<PdfDocumentDescriptor> toLoad) {
   LOG.debug(DefaultI18nContext.getInstance().i18n("Loading documents"));
   List<PdfDocumentDescriptor> loaded = new ArrayList<>(toLoad.size());
   for (PdfDocumentDescriptor current : toLoad) {
     PdfDocumentDescriptor copy = newCopy(current);
     PdfReader reader = null;
     try {
       reader = current.toPdfSource().open(PdfSourceOpeners.newPartialReadOpener());
       copy.setEncryptionStatus(EncryptionStatus.NOT_ENCRYPTED);
       copy.setPages(reader.getNumberOfPages());
       copy.setVersion(String.format("1.%c", reader.getPdfVersion()));
       @SuppressWarnings("unchecked")
       Map<String, String> meta = reader.getInfo();
       for (PdfMetadataKey key : PdfMetadataKey.values()) {
         copy.addMedatada(key, defaultString(meta.get(key.getKey())));
       }
       loaded.add(copy);
     } catch (TaskWrongPasswordException twpe) {
       copy.setEncryptionStatus(EncryptionStatus.ENCRYPTED);
       loaded.add(copy);
       LOG.warn(String.format("Owner password required %s", current.getFileName()), twpe);
     } catch (Exception e) {
       LOG.error(
           String.format("An error occured loading the document %s", current.getFileName()), e);
     } finally {
       nullSafeClosePdfReader(reader);
     }
   }
   LOG.debug(DefaultI18nContext.getInstance().i18n("Documents loaded"));
   return loaded;
 }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getTitle()
   */
  public String getTitle() {
    /*
     * Key = "Title"
     */
    String title = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      title = (String) info.get("Title");
    } // end if

    return title;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getSubject()
   */
  public String getSubject() {
    /*
     * Key = "Subject"
     */
    String subject = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      subject = (String) info.get("Subject");
    } // end if

    return subject;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getKeywords()
   */
  public String getKeywords() {
    /*
     * Key = "Keywords"
     */
    String keywords = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      keywords = (String) info.get("Keywords");
    } // end if

    return keywords;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getCreator()
   */
  public String getCreator() {
    /*
     * Key = "Creator"
     */
    String creator = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      creator = (String) info.get("Creator");
    } // end if

    return creator;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getAuthor()
   */
  public String getAuthor() {
    /*
     * Key = "Author"
     */
    String author = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      author = (String) info.get("Author");
    } // end if

    return author;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getProducer()
   */
  public String getProducer() {
    /*
     * Key = "Producer"
     *
     * Samples of format (key=value):
     * Producer=iText by lowagie.com (r0.94 - paulo 102)
     */
    String producer = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      producer = (String) info.get("Producer");
    } // end if

    return producer;
  }
  /* (non-Javadoc)
   * @see de.offis.health.icardea.cied.pdf.interfaces.PDFExtractor#getModificationDate()
   */
  public String getModificationDate() {
    /*
     * Key = "ModDate"
     *
     * Samples of format (key=value):
     * ModDate=D:20100415143436Z
     * ModDate=D:20100415174640+02'00'
     */
    String modificationDate = null;
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      // TODO: Fix the format of the date to ISO8601 timestamp
      modificationDate = (String) info.get("ModDate");
    } // end if

    return modificationDate;
  }
  /**
   * Reads a PDF file for retrieving its metadata.
   *
   * @param file File
   */
  public void createTextFromPDF(File file) {
    if (file.exists()) {
      int page = 1;
      PdfReader reader = null;

      try {
        reader = new PdfReader(new RandomAccessFileOrArray(file.getAbsolutePath()), null);
        HashMap<String, String> pdfinfo = reader.getInfo();

        StringBuffer sb = new StringBuffer();
        sb.append("<html>=== Document Information ===<p>");
        sb.append(
            reader.getCropBox(page).getHeight() + "*" + reader.getCropBox(page).getWidth() + "<p>");
        sb.append("PDF Version: " + reader.getPdfVersion() + "<p>");
        sb.append("Number of pages: " + reader.getNumberOfPages() + "<p>");
        sb.append("Number of PDF objects: " + reader.getXrefSize() + "<p>");
        sb.append("File length: " + reader.getFileLength() + "<p>");
        sb.append("Encrypted= " + reader.isEncrypted() + "<p>");
        if (pdfinfo.get("Title") != null) {
          sb.append("Title= " + pdfinfo.get("Title") + "<p>");
        }
        if (pdfinfo.get("Author") != null) {
          sb.append("Author= " + pdfinfo.get("Author") + "<p>");
        }
        if (pdfinfo.get("Subject") != null) {
          sb.append("Subject= " + pdfinfo.get("Subject") + "<p>");
        }
        if (pdfinfo.get("Producer") != null) {
          sb.append("Producer= " + pdfinfo.get("Producer") + "<p>");
        }
        if (pdfinfo.get("ModDate") != null) {
          sb.append("ModDate= " + PdfDate.decode(pdfinfo.get("ModDate")).getTime() + "<p>");
        }
        if (pdfinfo.get("CreationDate") != null) {
          sb.append(
              "CreationDate= " + PdfDate.decode(pdfinfo.get("CreationDate")).getTime() + "<p>");
        }
        sb.append("</html>");
        label.setText(sb.toString());
      } catch (IOException ex) {
        label.setText("");
      }
    }
  }
  /**
   * This method will return the key and value pairs stored in the PDF information. It's the basic
   * information like title, subject, author, creator, keywords, producer (meaning application) as
   * well as creation and modification date. The method is provided for debugging purposes.
   *
   * @return Returns <code>key=value</code> pair line by line (using system dependent newline).
   */
  @SuppressWarnings("unused")
  private String getPdfInfo() {
    StringBuffer stringBuffer = new StringBuffer();
    if (pdfReader != null) {
      Map<?, ?> info = pdfReader.getInfo();
      String key;
      String value;
      Iterator<?> iterator = info.keySet().iterator();
      while (iterator.hasNext()) {
        key = (String) iterator.next();
        value = (String) info.get(key);
        stringBuffer.append(key);
        stringBuffer.append("=");
        stringBuffer.append(value);
        stringBuffer.append(GlobalTools.LINESEPARATOR);
      } // end while
    } // end if

    return stringBuffer.toString();
  }