Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* ===========================================
* 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
*
@LICENSE@
*
* ---------------
* JavaFXImageIcon.java
* ---------------
*/
package org.jpedal.objects.acroforms.javafx;
import java.awt.image.BufferedImage;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Parent;
import javafx.scene.control.ButtonBase;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.transform.Transform;
import org.jpedal.io.PdfObjectReader;
import org.jpedal.objects.raw.FormObject;
import org.jpedal.objects.raw.FormStream;
import org.jpedal.objects.raw.PdfObject;
/**
* @author Simon
*/
public class JavaFXImageIcon extends ImageView {
PdfObject formObject;
/**
* used to tell the paint method that we need to scale up the image for printing
*/
private boolean currentlyPrinting;
private int printMultiplier = 1;
/**
* -1 means only one image, 0 means unselected, 1 means selected
* if there is only one image it is stored as the selected image
*/
private int selected = -1;
private static final int UNSELECTEDICON = 0;
private static final int SELECTEDICON = 1;
/**
* stores the root image for selected and unselected icons
*/
private Image rootImageSelected, rootImageUnselected;
/**
* stores the final image after any icon rotation
*/
private Image imageSelected, imageUnselected;
private PdfObject selObj;
private PdfObject unSelObj;
private PdfObjectReader currentpdffile;
private int subtype;
/**
* if 0 no change, 1 offset image, 2 invert image
*/
private int offsetImage;
/**
* the maximum scaling factor difference between the rootImage and the current Form dimentions
*/
protected static final float MAXSCALEFACTOR = 1.5f;
protected static final int iconWidth = -1;
protected static final int iconHeight = -1;
private final SimpleDoubleProperty xScale;
private final SimpleDoubleProperty yScale;
protected int iconRotation;
protected int iconOpp = 180;
/**
* the page rotation required for this image
*/
protected int pageRotate;
//private int iconRot;
/**
* used to tell paint method if we are displaying in single page mode,
* if so we rotate here, if not rotate is handled elsewhere.
*/
protected boolean displaySingle;
JavaFXImageIcon(final ButtonBase parentButton, final PdfObject formObject, final PdfObject imgObj, final PdfObjectReader pdfObjectReader, final int type, final int offset) {
//this.iconRot=iconRot;
this.formObject = formObject;
selObj = imgObj;
selected = -1;
xScale = new SimpleDoubleProperty(1);
yScale = new SimpleDoubleProperty(1);
currentpdffile = pdfObjectReader;
subtype = type;
offsetImage = offset;
setupButton(parentButton);
}
JavaFXImageIcon(final ButtonBase parentButton, final PdfObject formObject, final BufferedImage img, final int iconRot) {
this(parentButton, formObject, img == null ? null : SwingFXUtils.toFXImage(img, null), iconRot);
}
JavaFXImageIcon(final ButtonBase parentButton, final PdfObject formObject, final Image img, final int iconRot) {
iconRotation = iconRot;
this.formObject = formObject;
if (img != null) {
imageSelected = img;
} else { //if null store opaque image
imageSelected = SwingFXUtils.toFXImage(FormObject.getOpaqueImage(), null);
}
xScale = new SimpleDoubleProperty(1);
yScale = new SimpleDoubleProperty(1);
selected = -1;
setupButton(parentButton);
}
JavaFXImageIcon(final ButtonBase parentButton, final PdfObject formObject, final PdfObject selObject, final PdfObject unselObject, final int sel,
final PdfObjectReader pdfObjectReader, final int type, final int offset) {
//this.iconRot=iconRot;
this.formObject = formObject;
selObj = selObject;
unSelObj = unselObject;
selected = sel;
currentpdffile = pdfObjectReader;
subtype = type;
offsetImage = offset;
xScale = new SimpleDoubleProperty(1);
yScale = new SimpleDoubleProperty(1);
// if(selObj.getObjectRefAsString().equals("128 0 R") || selObj.getObjectRefAsString().equals("130 0 R"))
// debug = true;
setupButton(parentButton);
}
private JavaFXImageIcon() {
xScale = new SimpleDoubleProperty(1);
yScale = new SimpleDoubleProperty(1);
}
private void setupButton(final ButtonBase parentButton) {
this.fitWidthProperty().bind(parentButton.prefWidthProperty());
this.fitHeightProperty().bind(parentButton.prefHeightProperty());
// This listener detects when the parent of the button (PdfDecoderFX) has it's transformation changed
// - e.g. on a zoom in - and calls for the image to be redrawn
final ListChangeListener transListener = new ListChangeListener() {
@Override
public void onChanged(final ListChangeListener.Change c) {
c.next();
if (c.wasAdded()) {
final Transform newt = c.getAddedSubList().get(0);
xScale.set(Math.abs(newt.getMxx()));
yScale.set(Math.abs(newt.getMyy()));
setSelectedImage();
}
}
};
final ChangeListener listener = new ChangeListener() {
@Override
public void changed(final ObservableValue observable, final Parent oldValue, final Parent newValue) {
if (oldValue != null) {
oldValue.getTransforms().removeListener(transListener);
}
if (newValue != null) {
newValue.getTransforms().addListener(transListener);
}
}
};
parentButton.parentProperty().addListener(listener);
}
private void checkAndCreateimage() {
//check if pdf object reader is defined, as we still use opaque images which do NOT need redecoding
if (currentpdffile == null) {
return;
}
/* NOTE the image code may need changing so that we store up to a certain size image
* and not store large images, once the user has rescaled to a more normal size.
* we could store the root width and height for the 100% size and use 200% as the
* highest image size to keep.
*
* if we do this the best way would be to have an object that we move the decode routine to, and
* then when we read the 100% values from the image object we can store them in that size.
*/
//define normal sizes for normal use
int newWidth = (int) (this.getFitWidth() * xScale.get()), newHeight = (int) (this.getFitHeight() * yScale.get());
//if printing define larger sizes for root image, but dont change icon height and width
if (currentlyPrinting) {
newWidth = iconWidth * printMultiplier;
newHeight = iconHeight * printMultiplier;
}
//decode images at needed size
switch (selected) {
case UNSELECTEDICON:
if (rootImageUnselected == null
|| newWidth > (rootImageUnselected.getWidth())
|| newHeight > (rootImageUnselected.getHeight())
|| newWidth < (rootImageUnselected.getWidth() / MAXSCALEFACTOR)
|| newHeight < (rootImageUnselected.getHeight() / MAXSCALEFACTOR)) {
// Get the images from the stream as buffered images and then convert them to FX Images
final BufferedImage rootImageUnselectedAWT = FormStream.decode(formObject, currentpdffile, unSelObj, subtype, newWidth, newHeight, offsetImage, 1);
final BufferedImage imageUnselectedAWT = FormStream.rotate(rootImageUnselectedAWT, iconRotation);
rootImageUnselected = SwingFXUtils.toFXImage(rootImageUnselectedAWT, null);
imageUnselected = SwingFXUtils.toFXImage(imageUnselectedAWT, null);
}
break;
default: //or SELECTEDICON
if (rootImageSelected == null
|| newWidth > (rootImageSelected.getWidth())
|| newHeight > (rootImageSelected.getHeight())
|| newWidth < (rootImageSelected.getWidth() / MAXSCALEFACTOR)
|| newHeight < (rootImageSelected.getHeight() / MAXSCALEFACTOR)) {
// Get the images from the stream as buffered images and then convert them to FX Images
final BufferedImage rootImageSelectedAWT = FormStream.decode(formObject, currentpdffile, selObj, subtype, newWidth, newHeight, offsetImage, 1);
final BufferedImage imageSelectedAWT = FormStream.rotate(rootImageSelectedAWT, iconRotation);
if (rootImageSelectedAWT != null) {
rootImageSelected = SwingFXUtils.toFXImage(rootImageSelectedAWT, null);
}
if (imageSelectedAWT != null) {
imageSelected = SwingFXUtils.toFXImage(imageSelectedAWT, null);
}
} //icon rotation is always defined in the constructor so we dont need to change it
}
}
public void swapImage(final boolean selectedImage) {
if (selected == -1) {
return;
}
if (selectedImage) {
selected = SELECTEDICON;
} else {
selected = UNSELECTEDICON;
}
setSelectedImage();
}
/**
* generates higher quality images
*/
public void setPrinting(final boolean print, final int multiplier) {
currentlyPrinting = print;
printMultiplier = multiplier;
checkAndCreateimage();
}
private void setSelectedImage() {
final Image image;
checkAndCreateimage();
switch (selected) {
case UNSELECTEDICON:
image = imageUnselected;
break;
default: //or SELECTEDICON
image = imageSelected;
break;
}
setImage(image);
}
public Image getSelectedImage() {
final Image image;
checkAndCreateimage();
switch (selected) {
case UNSELECTEDICON:
image = imageUnselected;
break;
default: //or SELECTEDICON
image = imageSelected;
break;
}
return image;
}
}