/*
* Created on 29-Nov-2009
* Copyright (C) 2009 by Andrea Vacondio.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.pdfsam.guiclient.commons.business.loaders.callable;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.pdfsam.guiclient.commons.panels.JPdfSelectionPanel;
import org.pdfsam.guiclient.configuration.Configuration;
import org.pdfsam.guiclient.dto.PdfSelectionTableItem;
import org.pdfsam.guiclient.utils.EncryptionUtility;
import org.pdfsam.guiclient.utils.filters.PdfFilter;
import org.pdfsam.i18n.GettextResource;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.RandomAccessFileOrArray;
/**
* Callable to add a pdf document to the selection panel
* @author Andrea Vacondio
*
*/
public class AddPdfDocument implements Callable<Boolean> {
private static final Logger LOG = Logger.getLogger(AddPdfDocument.class.getPackage().getName());
/*used to find the document data*/
private static String TITLE = PdfName.decodeName(PdfName.TITLE.toString());
private static String PRODUCER = PdfName.decodeName(PdfName.PRODUCER.toString());
private static String AUTHOR = PdfName.decodeName(PdfName.AUTHOR.toString());
private static String SUBJECT = PdfName.decodeName(PdfName.SUBJECT.toString());
private static String CREATOR = PdfName.decodeName(PdfName.CREATOR.toString());
private static String MODDATE = PdfName.decodeName(PdfName.MODDATE.toString());
private static String CREATIONDATE = PdfName.decodeName(PdfName.CREATIONDATE.toString());
private static String KEYWORDS = PdfName.decodeName(PdfName.KEYWORDS.toString());
String wipText;
File inputFile;
String password;
String pageSelection;
JPdfSelectionPanel panel;
public AddPdfDocument(File inputFile, JPdfSelectionPanel panel){
this(inputFile, panel, null, null);
}
public AddPdfDocument(File inputFile, JPdfSelectionPanel panel, String password, String pageSelection){
this.inputFile = inputFile;
this.pageSelection = pageSelection;
this.password = password;
this.panel = panel;
}
public Boolean call() {
Boolean retVal = Boolean.FALSE;
try{
if (inputFile != null){
if(new PdfFilter(false).accept(inputFile)){
wipText = GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Please wait while reading")+" "+inputFile.getName()+" ...";
panel.addWipText(wipText);
panel.addTableRow(getPdfSelectionTableItem(inputFile, password, pageSelection));
panel.removeWipText(wipText);
retVal = Boolean.TRUE;
}else{
LOG.warn(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Selected file is not a pdf document.")+" "+inputFile.getName());
}
}
}catch(Throwable e){
LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Error: "),e);
}
return retVal;
}
/**
*
* @param fileToAdd file to add
* @param password password to open the file
* @return the item to add to the table
*/
PdfSelectionTableItem getPdfSelectionTableItem(File fileToAdd, String password, String pageSelection){
PdfSelectionTableItem tableItem = null;
PdfReader pdfReader = null;
if (fileToAdd != null){
tableItem = new PdfSelectionTableItem();
tableItem.setInputFile(fileToAdd);
tableItem.setPassword(password);
tableItem.setPageSelection(pageSelection);
try{
//fix 04/11/08 for memory usage
pdfReader = new PdfReader(new RandomAccessFileOrArray(fileToAdd.getAbsolutePath()), (password != null)?password.getBytes():null);
tableItem.setEncrypted(pdfReader.isEncrypted());
tableItem.setFullPermission(pdfReader.isOpenedWithFullPermissions());
if(tableItem.isEncrypted()){
tableItem.setPermissions(getPermissionsVerbose(pdfReader.getPermissions()));
int cMode = pdfReader.getCryptoMode();
switch (cMode){
case PdfWriter.STANDARD_ENCRYPTION_40:
tableItem.setEncryptionAlgorithm(EncryptionUtility.RC4_40);
break;
case PdfWriter.STANDARD_ENCRYPTION_128:
tableItem.setEncryptionAlgorithm(EncryptionUtility.RC4_128);
break;
case PdfWriter.ENCRYPTION_AES_128:
tableItem.setEncryptionAlgorithm(EncryptionUtility.AES_128);
break;
default:
break;
}
}
tableItem.setPagesNumber(Integer.toString(pdfReader.getNumberOfPages()));
tableItem.setFileSize(fileToAdd.length());
tableItem.setPdfVersion(pdfReader.getPdfVersion());
tableItem.setSyntaxErrors(pdfReader.isRebuilt());
initTableItemDocumentData(pdfReader, tableItem);
}
catch (Exception e){
tableItem.setLoadedWithErrors(true);
LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Error loading ")+fileToAdd.getAbsolutePath()+" :", e);
}
finally{
if(pdfReader != null){
pdfReader.close();
pdfReader = null;
}
}
}
return tableItem;
}
/**
* It gives a human readable version of the document permissions
* @param permissions
* @return
*/
private String getPermissionsVerbose(int permissions) {
StringBuffer buf = new StringBuffer();
if ((PdfWriter.ALLOW_PRINTING & permissions) == PdfWriter.ALLOW_PRINTING) buf.append(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Print"));
if ((PdfWriter.ALLOW_MODIFY_CONTENTS & permissions) == PdfWriter.ALLOW_MODIFY_CONTENTS) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Modify"));
if ((PdfWriter.ALLOW_COPY & permissions) == PdfWriter.ALLOW_COPY) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Copy or extract"));
if ((PdfWriter.ALLOW_MODIFY_ANNOTATIONS & permissions) == PdfWriter.ALLOW_MODIFY_ANNOTATIONS) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Add or modify text annotations"));
if ((PdfWriter.ALLOW_FILL_IN & permissions) == PdfWriter.ALLOW_FILL_IN) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Fill form fields"));
if ((PdfWriter.ALLOW_SCREENREADERS & permissions) == PdfWriter.ALLOW_SCREENREADERS) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Extract for use by accessibility dev."));
if ((PdfWriter.ALLOW_ASSEMBLY & permissions) == PdfWriter.ALLOW_ASSEMBLY) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Manipulate pages and add bookmarks"));
if ((PdfWriter.ALLOW_DEGRADED_PRINTING & permissions) == PdfWriter.ALLOW_DEGRADED_PRINTING) buf.append(", "+GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),"Low quality print"));
return buf.toString();
}
/**
* initialization of the document data
* @param reader
* @param tableItem
*/
@SuppressWarnings("unchecked")
private void initTableItemDocumentData(PdfReader reader, PdfSelectionTableItem tableItem){
if(reader!=null && tableItem != null){
HashMap<String, String> info = reader.getInfo();
if(info!=null && info.size()>0){
for (Map.Entry<String, String> entry: info.entrySet()) {
if(entry != null){
String key = entry.getKey();
String value = StringUtils.trimToEmpty(entry.getValue());
if(key.equals(TITLE)){
tableItem.getDocumentMetaData().setTitle(value);
}else if(key.equals(PRODUCER)){
tableItem.getDocumentMetaData().setProducer(value);
}else if(key.equals(AUTHOR)){
tableItem.getDocumentMetaData().setAuthor(value);
}else if(key.equals(SUBJECT)){
tableItem.getDocumentMetaData().setSubject(value);
}else if(key.equals(CREATOR)){
tableItem.getDocumentMetaData().setCreator(value);
}else if(key.equals(MODDATE)){
tableItem.getDocumentMetaData().setModificationDate(value);
}else if(key.equals(CREATIONDATE)){
tableItem.getDocumentMetaData().setCreationDate(value);
}else if(key.equals(KEYWORDS)){
tableItem.getDocumentMetaData().setKeywords(value);
}
}
}
}
}
}
}