package jp.crwdev.app.util;
import java.io.IOException;
import jp.crwdev.app.gui.DebugWindow;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.Matrix;
import com.itextpdf.text.pdf.parser.PdfImageObject;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
public class DPIRenderListener implements RenderListener {
public class DPI {
public float dpiX;
public float dpiY;
public int width;
public int height;
public DPI(float x, float y){
dpiX = x;
dpiY = y;
width = 0;
height = 0;
mHasText = false;
}
public boolean hasText(){
return mHasText;
}
public float getResolution(){
float dpi = (float)Math.floor((dpiX + dpiY)/2.0f);
return dpi;
}
public String getString(){
int dpi = (int)Math.round((dpiX + dpiY)/2.0f);
return Integer.toString(dpi);
}
protected void setHasText(boolean hasText){
mHasText = hasText;
}
}
private DPI mDPI = new DPI(300f, 300f);
private boolean mRendered = false;
private boolean mHasText = false;
@Override
public void beginTextBlock() {
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo renderInfo) {
if(mRendered){
return;
}
try {
PdfImageObject imgObj = renderInfo.getImage();
PdfDictionary imgDic = imgObj.getDictionary();
PdfName filter = imgDic.getAsName(PdfName.FILTER);
int width = imgDic.getAsNumber( PdfName.WIDTH ).intValue();
int height = imgDic.getAsNumber( PdfName.HEIGHT ).intValue();
mDPI.width = width;
mDPI.height = height;
byte[] bytes = null;
if ( filter == PdfName.JBIG2DECODE ) {
//mDPI.width = width;
//mDPI.height = height;
} else {
bytes = imgObj.getImageAsBytes();
if (bytes == null) {
//mDPI.width = width;
//mDPI.height = height;
} else {
Image image = Image.getInstance(bytes);
//if ( image.getDpiX() > 0 && image.getDpiY() > 0 ) {
// mDPI.dpiX = image.getDpiX();
// mDPI.dpiY = image.getDpiY();
//}
//else {
Matrix ctm = renderInfo.getImageCTM();
float widthScale = ctm.get( Matrix.I11 );
float heightScale = ctm.get( Matrix.I22 );
mDPI.dpiX = image.getScaledWidth() / widthScale * 72f;
mDPI.dpiY = image.getScaledHeight() / heightScale * 72f;
//}
mRendered = true;
DebugWindow.log("renderImage", "imageDpi=("+image.getDpiX()+","+image.getDpiY()+")");
DebugWindow.log("renderImage", "ctmDPI=("+mDPI.dpiX+","+mDPI.dpiY+")");
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (BadElementException e) {
e.printStackTrace();
}
}
@Override
public void renderText(TextRenderInfo arg0) {
mDPI.setHasText(true);
}
public DPI getDPI(){
return mDPI;
}
}