package bd.amazed.docscissors.doc;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.JPanel;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.jeborker.app.JeboorkerConstants;
import org.rr.jeborker.metadata.comicbook.ArchiveHandlerFactory;
import org.rr.jeborker.metadata.comicbook.IArchiveHandler;
import org.rr.jeborker.metadata.pdf.PDFRenderer;
import org.rr.pm.image.IImageProvider;
import org.rr.pm.image.ImageProviderFactory;
import org.rr.pm.image.ImageUtils;
/**
* Provides an object to decode pdf files and provide a rasterizer if required -
* Normal usage is to create instance of PdfDecoder and access via public
* methods. Examples showing usage in org.jpedal.examples
* <p/>
* We recommend you access JPedal using only public methods listed in API
*/
public class JDocumentDecoderPanel extends JPanel {
private interface IScissorsRenderer {
public abstract BufferedImage renderPage(int pageIndex) throws IOException;
}
private IScissorsRenderer rendererInstance;
private BufferedImage currentPage;
/**
* routine to open PDF file and extract key info from pdf file so we can
* decode any pages. Does not actually decode the pages themselves. Also
* reads the form data. You must explicitly close any open files with
* closePdfFile() to Java will not release all the memory
*/
public void openPdfFile(final DocumentInfo docInfo) {
final IResourceHandler filePath = docInfo.getOriginalFile();
if(JeboorkerConstants.SUPPORTED_MIMES.MIME_PDF.getMime().equals(filePath.getMimeType(true))) {
rendererInstance = new IScissorsRenderer() {
PDFRenderer pdfRendererInstance = PDFRenderer.getPDFRendererInstance(filePath);
@Override
public BufferedImage renderPage(int pageIndex) throws IOException {
BufferedImage renderPage = pdfRendererInstance.renderPage(pageIndex);
return ImageUtils.crop(renderPage, new Rectangle((int)docInfo.getNormalizedWidth(), (int) docInfo.getNormalizedHeight()), Color.WHITE);
}};
} else if(JeboorkerConstants.SUPPORTED_MIMES.MIME_CBZ.getMime().equals(filePath.getMimeType(true)) ||
JeboorkerConstants.SUPPORTED_MIMES.MIME_CBR.getMime().equals(filePath.getMimeType(true))) {
rendererInstance = new IScissorsRenderer() {
IArchiveHandler handler = ArchiveHandlerFactory.getHandlerInitialized(filePath);
@Override
public BufferedImage renderPage(int pageIndex) throws IOException {
String archiveEntry = handler.getArchiveEntries().get(pageIndex - 1);
byte[] archiveEntryBytes = handler.getArchiveEntry(archiveEntry);
IResourceHandler virtualResourceHandler = ResourceHandlerFactory.getVirtualResourceHandler(archiveEntry, archiveEntryBytes);
IImageProvider imageProvider = ImageProviderFactory.getImageProvider(virtualResourceHandler);
BufferedImage renderPage = imageProvider.getImage();
return ImageUtils.crop(renderPage, new Rectangle((int)docInfo.getNormalizedWidth(), (int) docInfo.getNormalizedHeight()), Color.WHITE);
}};
}
}
/**
* decode a page, - <b>page</b> must be between 1 and
* <b>PdfDecoder.getPageCount()</b> - Will kill off if already running
*
* returns minus page if trying to open linearized page not yet available
* @throws ScissorsDocumentException
*/
public void decodePage(int page) throws ScissorsDocumentException {
currentPage = getPageAsImage(page);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(currentPage, 0, 0, this.getWidth(), this.getHeight(), null);
}
public void paint(Graphics g) {
super.paint(g);
}
/**
* generate BufferedImage of a page in current file
*
* Page size is defined by CropBox
* @throws ScissorsDocumentException
*/
public BufferedImage getPageAsImage(int pageIndex) throws ScissorsDocumentException {
try {
return rendererInstance.renderPage(pageIndex);
} catch (IOException e) {
throw new ScissorsDocumentException(e);
}
}
final public Dimension getMaximumSize() {
if(currentPage != null) {
return new Dimension(currentPage.getWidth(), currentPage.getHeight());
}
return new Dimension(800,600);
}
final public Dimension getMinimumSize() {
return new Dimension(100,100);
}
/**
* get sizes of panel <BR>
* This is the PDF pagesize (as set in the PDF from pagesize) -
* It now includes any scaling factor you have set (ie a PDF size 800 * 600
* with a scaling factor of 2 will return 1600 *1200)
*/
public Dimension getPreferredSize() {
return getMaximumSize();
}
}