org.jpedal.external.ExternalHandlers Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of OpenViewerFX Show documentation
Show all versions of OpenViewerFX Show documentation
Open Source (LGPL) JavaFX PDF Viewer for NetBeans plugin
/*
* ===========================================
* 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@
*
* ---------------
* ExternalHandlers.java
* ---------------
*/
package org.jpedal.external;
import java.awt.image.BufferedImage;
import java.util.Map;
import org.jpedal.FileAccess;
import org.jpedal.display.GUIModes;
import org.jpedal.javafx.JavaFXSupport;
import org.jpedal.images.ImageLibrary;
import org.jpedal.images.StandardImageLibrary;
import org.jpedal.io.PdfObjectReader;
import org.jpedal.objects.Javascript;
import org.jpedal.objects.acroforms.AcroRenderer;
import org.jpedal.objects.acroforms.actions.ActionHandler;
import org.jpedal.objects.acroforms.actions.EmptyActionHandler;
import org.jpedal.objects.acroforms.creation.FormFactory;
import org.jpedal.objects.acroforms.creation.SwingFormCreator;
import org.jpedal.objects.javascript.ExpressionEngine;
import org.jpedal.objects.raw.PdfObject;
import org.jpedal.parser.DecoderOptions;
import org.jpedal.parser.PDFtoImageConvertor;
import org.jpedal.parser.PdfStreamDecoder;
import org.jpedal.parser.ValueTypes;
import org.jpedal.parser.swing.PDFtoImageConvertorSwing;
import org.jpedal.render.DynamicVectorRenderer;
import org.jpedal.render.SwingDisplay;
import org.jpedal.utils.LogWriter;
public class ExternalHandlers {
private static final ClassLoader loader;
private static JavaFXSupport javaFXSupport;
private static final String fxClassName = "org.jpedal.fonts.glyph.javafx.JavaFXSupportImpl";
private static final boolean isXFAPresent;
private static final boolean ULCSupport;
public static ImageLibrary ImageLib = new StandardImageLibrary();
static {
loader = ExternalHandlers.class.getClassLoader();
/*
* javafx
*/
final String fxClassPath = "org/jpedal/fonts/glyph/javafx/JavaFXSupportImpl.class";
if (loader.getResource(fxClassPath) != null) {
try {
javaFXSupport = (JavaFXSupport) loader.loadClass(fxClassName).newInstance();
} catch (final Exception ex) {
javaFXSupport = null;
LogWriter.writeLog("[PDF] Unable to instance FX " + ex);
}
}
/*
* add additional image library support if available
*/
final String imageLib2ClassPath = "com/idrsolutions/image/JDeliImageSupport.class";
if (loader.getResource(imageLib2ClassPath) != null) {
try {
loader.loadClass("com.idrsolutions.image.JDeliImageSupport").newInstance();
} catch (final Exception ex) {
LogWriter.writeLog("[PDF] Unable to instance JDeli " + ex);
}
}
/*
* image library
*/
final String imageLibClassPath = "org/jpedal/JDeliHelper.class";
if (loader.getResource(imageLibClassPath) != null) {
try {
ImageLib = (ImageLibrary) loader.loadClass("org.jpedal.JDeliHelper").newInstance();
} catch (final Exception ex) {
ImageLib = new StandardImageLibrary();
LogWriter.writeLog("[PDF] Unable to instance JDeli " + ex);
}
}
/*
* ulc
*/
ULCSupport = loader.getResourceAsStream("com/ulcjava/base/application/ULCTextComponent.class") != null;
/*
* xfa
*/
final String xfaClassPath = "org/jpedal/objects/acroforms/AcroRendererXFA.class";
isXFAPresent = loader.getResource(xfaClassPath) != null;
}
public static boolean isXFAPresent() {
return isXFAPresent;
}
public static boolean isITextPresent() {
return false;
}
public static JavaFXSupport getFXHandler() {
return javaFXSupport;
}
public static boolean isULCPresent() {
return ULCSupport;
}
FormFactory userFormFactory;
AdditonalHandler additionalHandler;
/**
* default renderer for acroforms
*/
AcroRenderer formRenderer;
//Option to append the error thrown due to lack of CID jar to page decode report
public static boolean throwMissingCIDError;
private DynamicVectorRenderer customDVR;
ImageHandler customImageHandler;
private ActionHandler userActionHandler = new EmptyActionHandler();
// ImageHelper images;
private Object customSwingHandle;
private Object customPluginHandle;
private ExpressionEngine userExpressionEngine;
boolean useXFA;
/**
* needs to be accessed in several locations so declared here
*/
private Javascript javascript;
//custom class for flagging painting
RenderChangeListener customRenderChangeListener;
GlyphTracker customGlyphTracker;
ShapeTracker customShapeTracker;
private boolean alwaysUseXFA;
private Map jpedalActionHandlers;
CustomPrintHintingHandler customPrintHintingHandler;
ColorHandler customColorHandler; //new ExampleColorHandler();
ErrorTracker customErrorTracker; //new ExampleColorHandler();
private CustomFormPrint customFormPrint;
private CustomMessageHandler customMessageHandler;
//copy for callback
Object swingGUI;
private GUIModes modeSelected = GUIModes.SWING;
public ExternalHandlers() {
if (isXFAPresent) {
useXFA = true;
}
}
public ExternalHandlers(final GUIModes mode) {
this.modeSelected = mode;
if (isXFAPresent) {
useXFA = true;
}
}
public void addHandlers(final PdfStreamDecoder streamDecoder) {
streamDecoder.setObjectValue(ValueTypes.ImageHandler, customImageHandler);
streamDecoder.setObjectValue(Options.GlyphTracker, customGlyphTracker);
streamDecoder.setObjectValue(Options.ShapeTracker, customShapeTracker);
if (customErrorTracker != null) {
streamDecoder.setObjectValue(Options.ErrorTracker, customErrorTracker);
}
}
/**
* allows external helper classes to be added to JPedal to alter default
* functionality - not part of the API and should be used in conjunction
* with IDRsolutions only
*
if Options.FormsActionHandler is the type then the newHandler
* should be of the form org.jpedal.objects.acroforms.ActionHandler
*
* @param newHandler
* @param type
*/
public void addExternalHandler(final Object newHandler, final int type) {
switch (type) {
case Options.AdditionalHandler:
additionalHandler = (AdditonalHandler) newHandler;
break;
case Options.USE_XFA_IN_LEGACY_MODE:
alwaysUseXFA = ((Boolean) newHandler);
break;
case Options.USE_XFA:
useXFA = ((Boolean) newHandler);
break;
case Options.PluginHandler:
customPluginHandle = newHandler;
break;
case Options.MultiPageUpdate:
customSwingHandle = newHandler;
break;
case Options.ErrorTracker:
customErrorTracker = (ErrorTracker) newHandler;
break;
case Options.ExpressionEngine:
userExpressionEngine = (ExpressionEngine) newHandler;
break;
// case Options.LinkHandler:
//
// if (formRenderer != null)
// formRenderer.resetHandler(newHandler, this,Options.LinkHandler);
//
// break;
case Options.FormFactory:
userFormFactory = ((FormFactory) newHandler);
break;
case Options.GUIContainer:
swingGUI = newHandler;
break;
case Options.ImageHandler:
customImageHandler = (ImageHandler) newHandler;
break;
case Options.ColorHandler:
customColorHandler = (ColorHandler) newHandler;
break;
case Options.GlyphTracker:
customGlyphTracker = (GlyphTracker) newHandler;
break;
case Options.ShapeTracker:
customShapeTracker = (ShapeTracker) newHandler;
break;
// case Options.Renderer:
// //cast and assign here
// break;
// case Options.FormFactory:
// formRenderer.setFormFactory((FormFactory) newHandler);
// break;
//
// case Options.MultiPageUpdate:
// customSwingHandle = newHandler;
// break;
//
case Options.CustomFormPrint:
customFormPrint = (CustomFormPrint) newHandler;
break;
// case Options.StandardImageLibrary:
// images= (ImageHelper) newHandler;
// break;
// case Options.ExpressionEngine:
//
// userExpressionEngine = newHandler;
//
// if (Javascript.debugActionHandler)
// System.out.println("User expression engine set to " + userExpressionEngine + ' ' + newHandler);
//
// setJavascript();
// break;
//
// case Options.LinkHandler:
//
// if (formRenderer != null)
// formRenderer.resetHandler(newHandler, this,Options.LinkHandler);
//
// break;
//
// case Options.FormsActionHandler:
//
// if (formRenderer != null)
// formRenderer.resetHandler(newHandler, this,Options.FormsActionHandler);
//
// break;
//
//
case Options.JPedalActionHandler:
jpedalActionHandlers = (Map) newHandler;
break;
case Options.CustomMessageOutput:
customMessageHandler = (CustomMessageHandler) newHandler;
break;
case Options.RenderChangeListener:
customRenderChangeListener = (RenderChangeListener) newHandler;
break;
case Options.CustomPrintHintingHandler:
customPrintHintingHandler = (CustomPrintHintingHandler) newHandler;
break;
case Options.CustomOutput:
customDVR = (DynamicVectorRenderer) newHandler;
break;
case Options.FormsActionHandler:
userActionHandler = (ActionHandler) newHandler;
break;
default:
if (additionalHandler != null) {
additionalHandler.addExternalHandler(newHandler, type);
} else {
throw new IllegalArgumentException("Unknown type=" + type);
}
}
}
/**
* allows external helper classes to be accessed if needed - also allows
* user to access SwingGUI if running full Viewer package - not all Options
* available to get - please contact IDRsolutions if you are looking to use
*
* @param type
*/
public Object getExternalHandler(final int type) {
switch (type) {
case Options.FormFactory:
return formRenderer.getFormFactory();
case Options.MultiPageUpdate:
return customSwingHandle;
case Options.PluginHandler:
return customPluginHandle;
case Options.ExpressionEngine:
return userExpressionEngine;
case Options.ErrorTracker:
return customErrorTracker;
case Options.ImageHandler:
return customImageHandler;
case Options.ColorHandler:
return customColorHandler;
case Options.GlyphTracker:
return customGlyphTracker;
case Options.CustomPrintHintingHandler:
return customPrintHintingHandler;
case Options.ShapeTracker:
return customShapeTracker;
case Options.CustomFormPrint:
return customFormPrint;
// case Options.StandardImageLibrary:
// return images;
case Options.GUIContainer:
return swingGUI;
// case Options.Renderer:
// return null;
//
// case Options.FormFactory:
// return formRenderer.getFormFactory();
//
// case Options.MultiPageUpdate:
// return customSwingHandle;
//
// case Options.ExpressionEngine:
// return userExpressionEngine;
//
case Options.JPedalActionHandler:
return jpedalActionHandlers;
case Options.CustomMessageOutput:
return customMessageHandler;
// case Options.Display:
// return pages;
//
// case Options.CurrentOffset:
// return currentOffset;
//
case Options.CustomOutput:
return customDVR;
case Options.RenderChangeListener:
return customRenderChangeListener;
case Options.JPedalActionHandlers:
return jpedalActionHandlers;
default:
if (type == Options.UniqueAnnotationHandler) {
return null;
} else if (additionalHandler != null) {
return additionalHandler.getExternalHandler(type);
} else {
throw new IllegalArgumentException("Unknown type " + type);
}
}
}
/**
* Allow user to access javascript object if needed
*/
public Javascript getJavaScript() {
return javascript;
}
public FormFactory getUserFormFactory() {
return userFormFactory;
}
public void dispose() {
//AdditionalHandler
additionalHandler = null;
//PluginHandler
customPluginHandle = null;
//MultiPageUpdate
customSwingHandle = null;
//ErrorTracker
customErrorTracker = null;
//ExpressionEngine
userExpressionEngine = null;
//FormFactory
userFormFactory = null;
//GUIContainer
swingGUI = null;
//ImageHandler:
customImageHandler = null;
//ColorHandler:
customColorHandler = null;
//GlyphTracker:
customGlyphTracker = null;
//ShapeTracker:
customShapeTracker = null;
//CustomFormPrint:
customFormPrint = null;
//JPedalActionHandler:
jpedalActionHandlers = null;
//CustomMessageOutput:
customMessageHandler = null;
//RenderChangeListener:
customRenderChangeListener = null;
//CustomPrintHintingHandler:
customPrintHintingHandler = null;
//CustomOutput:
customDVR = null;
if (javascript != null) {
javascript.dispose();
}
javascript = null;
//dispose the javascript object before the formRenderer object as JS accesses the renderer object
if (formRenderer != null) {
formRenderer.dispose();
}
formRenderer = null;
userActionHandler = null;
}
/**
* Allow user to access Forms renderer object if needed
*/
public AcroRenderer getFormRenderer() {
return formRenderer;
}
/**
* Allow user to access Forms Action Handler object if needed
*/
public ActionHandler getFormActionHandler() {
return userActionHandler;
}
public void setJavaScript(final Javascript javascript) {
this.javascript = javascript;
}
/**
* allow user to explicitly disable XFAsupport in XFA version Otherwise
* should not be used
*
* @param useXFA
*/
public void useXFA(final boolean useXFA) {
this.useXFA = useXFA;
}
private static final String xfaClassName = "org.jpedal.objects.acroforms.AcroRendererXFA";
public void openPdfFile(final ExpressionEngine userExpressionEngine) {
initObjects(userExpressionEngine, new SwingFormCreator());
}
public static BufferedImage decode(final PdfObject pdfObject, final PdfObjectReader currentPdfFile, final PdfObject XObject, final int subtype, final int width, final int height, final int offsetImage, final float pageScaling) {
if (isXFAPresent) {
try {
final AcroRenderer formRenderer = (AcroRenderer) loader.loadClass(xfaClassName).newInstance();
return formRenderer.decode(pdfObject, currentPdfFile, XObject, subtype, width, height, offsetImage, pageScaling);
} catch (final Exception ex) {
LogWriter.writeLog("[PDF] Unable to instance XFA " + ex);
}
}
return null;
}
void initObjects(final ExpressionEngine userExpressionEngine1, final SwingFormCreator formCreator) {
if (isXFAPresent) {
try {
formRenderer = (AcroRenderer) loader.loadClass(xfaClassName).newInstance();
} catch (final Exception ex) {
LogWriter.writeLog("[PDF] Unable to instance XFA " + ex);
formRenderer = new AcroRenderer();
}
} else {
formRenderer = new AcroRenderer();
}
formRenderer.useXFAIfAvailable(useXFA);
formRenderer.init(formCreator);
formRenderer.alwaysuseXFA(alwaysUseXFA);
final FormFactory userFormFactory = this.userFormFactory;
if (userFormFactory != null) {
formRenderer.setFormFactory(userFormFactory);
}
/*
* setup Javascript object and pass into objects which use it
*/
javascript = new Javascript(userExpressionEngine1, formRenderer);
}
/**
* show if we are Swing or JavaFX
*/
public void setMode(final GUIModes mode) {
modeSelected = mode;
}
/**
* show if we are Swing or JavaFX
*
* @return
*/
public GUIModes getMode() {
return modeSelected;
}
public boolean isJavaFX() {
return false;
}
public void setDVR(final FileAccess fileAccess) {
fileAccess.setDVR(new SwingDisplay(1, fileAccess.getObjectStore(), false));
}
public PDFtoImageConvertor getConverter(final float multiplyer, final DecoderOptions options) {
return new PDFtoImageConvertorSwing(multiplyer, options);
}
}