All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jpedal.examples.viewer.gui.javafx.JavaFXSignaturesPanel Maven / Gradle / Ivy

There is a newer version: 20151002
Show newest version
/*
 * ===========================================
 * Java Pdf Extraction Decoding Access Library
 * ===========================================
 *
 * Project Info:  http://www.idrsolutions.com
 * Help section for developers at http://www.idrsolutions.com/support/
 *
 * (C) Copyright 1997-2017 IDRsolutions and Contributors.
 *
 * This file is part of JPedal/JPDF2HTML5
 *
     This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 *
 * ---------------
 * JavaFXSignaturesPanel.java
 * ---------------
 */

package org.jpedal.examples.viewer.gui.javafx;

import java.util.Iterator;
import javafx.scene.control.Tab;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
import org.jpedal.PdfDecoderInt;
import org.jpedal.objects.raw.FormObject;
import org.jpedal.objects.raw.PdfArrayIterator;
import org.jpedal.objects.raw.PdfDictionary;
import org.jpedal.objects.raw.PdfObject;

/**
 *
 * @author Simon
 */
public class JavaFXSignaturesPanel extends Tab {
    final TreeView signatureTree;
    final Image unlock;
    final Image lock;
    static final String signedText = "The following have digitally counter-signed this document";
    static final String blankText = "The following signature fields are not signed";
    
    public JavaFXSignaturesPanel(){
        final VBox content = new VBox();
        signatureTree = new TreeView();
        unlock = new Image(getClass().getResource("/org/jpedal/examples/viewer/res/unlock.png").toExternalForm());
        lock = new Image(getClass().getResource("/org/jpedal/examples/viewer/res/lock.gif").toExternalForm());
        
        signatureTree.setCellFactory(new Callback, TreeCell>() {
            @Override 
            public TreeCell call(final TreeView p) {
                return new SignaturesCell();
            }
        });
        
        content.getChildren().add(signatureTree);
        
        setContent(content);
        
    }
    
    public void reinitialise(final PdfDecoderInt decode_pdf, final Iterator signatureObjects){
        signatureTree.setRoot(null);
        
        final TreeItem root = new TreeItem("Signatures");
        final TreeItem signed = new TreeItem(signedText);
        final TreeItem blank = new TreeItem(blankText);
        
        
        // using getParent() == null was causing duplicate nodes to appear, so using manual checks instead
        boolean addedSigned = false;
        boolean addedBlank = false;
        
        
        while (signatureObjects.hasNext()){
            final FormObject formObj = signatureObjects.next();
            
            final PdfObject sigObject = formObj.getDictionary(PdfDictionary.V);
            
            decode_pdf.getIO().checkResolved(sigObject);
            
            if(sigObject == null){
                if(!addedBlank){
                    addedBlank = true;
                    root.getChildren().add(blank);
                }
                final TreeItem blankNode = new TreeItem(formObj.getTextStreamValue(PdfDictionary.T) + " on page " + formObj.getPageNumber());
                blank.getChildren().add(blankNode);
                
            }else{
                if(!addedSigned){
                    addedSigned=true;
                    root.getChildren().add(signed);
                }
                final String name = sigObject.getTextStreamValue(PdfDictionary.Name);
                
                final TreeItem owner = new TreeItem("Signed by " + name);
                signed.getChildren().add(owner);
                
                final TreeItem type = new TreeItem("Type");
                owner.getChildren().add(type);
                
                String filter = null;
                
                final PdfArrayIterator filters = sigObject.getMixedArray(PdfDictionary.Filter);
                
                if(filters != null && filters.hasMoreTokens()) {
                    filter = filters.getNextValueAsString(true);
                }
                    
                final TreeItem filterNode = new TreeItem("Filter " + filter);
                type.getChildren().add(filterNode);
                
                final String subFilter = sigObject.getName(PdfDictionary.SubFilter);
                
                final TreeItem subFilterNode = new TreeItem("Sub Filter: " + subFilter);
                type.getChildren().add(subFilterNode);
                
                final TreeItem details = new TreeItem("Details");
                owner.getChildren().add(details);
                
                final String rawDate = sigObject.getTextStreamValue(PdfDictionary.M);
                
                if(rawDate != null){
                    final StringBuilder date = new StringBuilder(rawDate);

                    date.delete(0, 2);
                    date.insert(4, '/');
                    date.insert(7, '/');
                    date.insert(10, ' ');
                    date.insert(13, ':');
                    date.insert(16, ':');
                    date.insert(19, ' ');
                    
                    final TreeItem time = new TreeItem("Time: " + date);
                    details.getChildren().add(time);
                }else{
                    final TreeItem time = new TreeItem("Time: unset");
                    details.getChildren().add(time);
                }
                
                final String reason = sigObject.getTextStreamValue(PdfDictionary.Reason);
                
                final TreeItem reasonNode = new TreeItem("Reason: " + reason);
                details.getChildren().add(reasonNode);
                
                final String location = sigObject.getTextStreamValue(PdfDictionary.Location);

                final TreeItem locationNode = new TreeItem("Location: " + location);
                details.getChildren().add(locationNode);
                
                final TreeItem field = new TreeItem("Field: " + formObj.getTextStreamValue(PdfDictionary.T)+ " on page " + formObj.getPageNumber());
                details.getChildren().add(field);
            }
        }
        signatureTree.setRoot(root);
    }
    
    private class SignaturesCell extends TreeCell{
        @Override
        public void updateItem(final String item, final boolean empty){
            super.updateItem(item, empty);
            if(empty){
                setText(null);
                setGraphic(null);
            }else{
                final TreeItem parent = getTreeItem().getParent();

                final String parentText = parent != null ? parent.getValue() : "";

                if(parentText.equals(signedText)){
                    setGraphic(new ImageView(lock));
                }else if(parentText.equals(blankText)){
                    setGraphic(new ImageView(unlock));
                }
                setText(item);
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy