package jp.crwdev.app.container.pdf;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfImageObject;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.jmupdf.enums.ImageType;
import com.jmupdf.page.Page;
import com.jmupdf.page.PageRect;
import com.jmupdf.page.PageRenderer;
import com.jmupdf.pdf.PdfDocument;
import jp.crwdev.app.container.ImageFileInfoBase;
import jp.crwdev.app.container.pdf.GhostscriptUtil.GhostscriptUtilEventListener;
import jp.crwdev.app.gui.DebugWindow;
import jp.crwdev.app.imagefilter.ImageFilterParam;
import jp.crwdev.app.imagefilter.ResizeFilter;
import jp.crwdev.app.util.DPIRenderListener;
import jp.crwdev.app.util.DPIRenderListener.DPI;
public class PdfImageFileInfo extends ImageFileInfoBase implements GhostscriptUtilEventListener {
/** PdfImageObject */
private PdfImageObject mPdfImage = null;
/** Name */
private int mNumber = 0;
private GhostscriptUtil mGSUtil = null;
private PdfDocument mPdfDocument = null;
private PdfReaderContentParser mParser = null;
public PdfImageFileInfo(ImageRenderInfo info){
super();
try {
PdfImageObject image = info.getImage();
mPdfImage = image;
String filetype = image.getFileType();
mFormat = filetype;
mWidth = 0;
mHeight = 0;
mNumber = info.getRef().getNumber();
}catch(Exception e){
}
}
public PdfImageFileInfo(GhostscriptUtil gs, int page){
super();
mGSUtil = gs;
mFormat = "jpeg";
mWidth = 0;
mHeight = 0;
mNumber = page;
}
public PdfImageFileInfo(PdfDocument doc, PdfReaderContentParser parser, int page){
super();
mPdfDocument = doc;
mParser = parser;
mFormat = "jpeg";
mWidth = 0;
mHeight = 0;
mNumber = page;
}
public PdfImageFileInfo(int number, PdfImageObject image, int width, int height, String format){
super();
mNumber = number;
mPdfImage = image;
mWidth = width;
mHeight = height;
mFormat = format;
}
@Override
public void update() {
if(mWidth != 0 && mHeight != 0){
return;
}
if(mPdfDocument != null){
// BufferedImage buffered = getImage();
// if(buffered != null){
// mWidth = buffered.getWidth();
// mHeight = buffered.getHeight();
// DebugWindow.log("update", "width=" + mWidth + " height=" + mHeight);
// }
}
if(mPdfImage != null){
try {
BufferedImage buffered = mPdfImage.getBufferedImage();
mWidth = buffered.getWidth();
mHeight = buffered.getHeight();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onComplete(int page, BufferedImage image) {
if(image != null){
mWidth = image.getWidth();
mHeight = image.getHeight();
}
}
@Override
public String getFileName() {
return Integer.toString(mNumber);
}
@Override
public String getSortString() {
return String.format("%05d", mNumber);
}
@Override
public String getFullPath() {
return Integer.toString(mNumber);
}
@Override
public InputStream getInputStream() {
try {
if(mPdfDocument != null){
return null;
}
if(mGSUtil != null){
File file = mGSUtil.getPageAsFile(mNumber);
if(file != null){
return new FileInputStream(file);
}
}
if(mPdfImage != null){
return new ByteArrayInputStream(mPdfImage.getImageAsBytes());
}
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
@Override
public BufferedImage getImage(boolean preview) {
if(mPdfDocument != null){
DebugWindow.log("getImage", "begin");
long start = System.currentTimeMillis();
Page page = mPdfDocument.getPage(mNumber);
PageRect boundBox = page.getBoundBox();
DPIRenderListener listener = new DPIRenderListener();
try {
mParser.processContent(mNumber, listener);
} catch (IOException e) {
e.printStackTrace();
}
DPI dpi = listener.getDPI();
float originalResolution = dpi.getResolution();
DebugWindow.log("getImage", "page=" + mNumber);
DebugWindow.log("getImage", "originalResolution=" + originalResolution);
if(!preview && dpi.hasText()){
originalResolution = 400.0f;
DebugWindow.log("getImage", "renderingResolution=" + originalResolution);
}
float scale = originalResolution / 72.0f;
PageRenderer render = new PageRenderer(page, scale, Page.PAGE_ROTATE_AUTO, ImageType.IMAGE_TYPE_RGB);
render.render(true);
DebugWindow.log("getImage", "size=(" + boundBox.getWidth() + "," + boundBox.getHeight() + ")");
DebugWindow.log("getImage", "dpiSize=(" + dpi.width + "," + dpi.height + ")");
BufferedImage image = render.getImage();
if(!preview && dpi.hasText()){
try {
float targetScale = dpi.getResolution()/72.0f;
ResizeFilter resize = new ResizeFilter();
ImageFilterParam param = new ImageFilterParam();
param.setResize(true);
param.setResizeDimension((int)(boundBox.getWidth() * targetScale), (int)(boundBox.getHeight() * targetScale));
image = resize.filter(image, param);
}catch(OutOfMemoryError e){
e.printStackTrace();
DebugWindow.log("getImage", "Out of Memory. " + e.getMessage());
}
}
long end = System.currentTimeMillis();
DebugWindow.log("getImage", "end. imageSize=(" + image.getWidth() + "," + image.getHeight() + ") time=" + (end-start));
render.dispose();
return image;
}
return null;
}
@Override
public void release() {
}
}