tif转pdf,Java heap space如何处理

mfengch 2009-06-11 11:24:52
下列代码的红色部分会有Exception in thread "main" java.lang.OutOfMemoryError: Java heap space的异常,是由于tif图片分辨率为3307*4677,该如何处理

import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.media.jai.JAI;
import javax.media.jai.TileCache;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.JDialog;
import javax.swing.JOptionPane;

import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.media.imageio.plugins.tiff.TIFFImageReadParam;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDirectory;
import com.sun.media.jai.codecimpl.TIFFImageDecoder;

public class TiffToPDF {
Document document;
PdfContentByte cb;

public TiffToPDF(String filename, String[] strImages) throws Exception {
document = new Document();
FileOutputStream rech = new FileOutputStream(filename);
PdfWriter writer = PdfWriter.getInstance(document, rech);
document.open();
cb = writer.getDirectContent();
for (int i = 0; i < strImages.length; ++i) {
addImage(strImages[i]);
}

document.close();
}

public void addImage(String strImageName) throws Exception {
TileCache cache =
JAI.getDefaultInstance().getTileCache();
long size = 1024*1024*1024L; // 32 megabytes
cache.setMemoryCapacity(size);

System.out.println(strImageName);
File file = new File(strImageName);
SeekableStream stream = new FileSeekableStream(strImageName);
TIFFDirectory dir = new TIFFDirectory(stream, 0);
String[] names = ImageCodec.getDecoderNames(stream);
ImageDecoder dec = ImageCodec
.createImageDecoder(names[0], stream, null);
int total = dec.getNumPages();
ImageInputStream in = null;
in = ImageIO.createImageInputStream(file);

for (int k = 0; k < total; ++k) {
RenderedImage ri = dec.decodeAsRenderedImage(k);
Raster ra = ri.getData();

TIFFImageReadParam param = new TIFFImageReadParam();

// (2.1) Decode as "BufferedImage"
// PlanarImage pi1 = new RenderedImageAdapter(reader.read(k, param));

BufferedImage bi = new BufferedImage(ri.getColorModel(), Raster
.createWritableRaster(ri.getSampleModel(), ra
.getDataBuffer(), null), false, new Hashtable());
Image img = Image.getInstance(bi, null, true);
long h = 0;
long w = 0;
long IFDOffset = dir.getIFDOffset();
while (IFDOffset != 0L) {
dir = new TIFFDirectory(stream, IFDOffset, 0);
IFDOffset = dir.getNextIFDOffset();
h = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_LENGTH);
w = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_WIDTH);
}
float percent = 100;
int pos = 0;
if (w > 895)
percent = ((595 + 18) * 100 / w);
if (h > 842)
pos = (int) (842 - h * percent / 100);
else
pos = (int) (842 - h);
System.out.println(percent);
System.out.println(pos);
img.scalePercent(percent);
img.setAbsolutePosition(0, pos);
System.out.println("Image: " + k);

cb.addImage(img);
document.newPage();
}
stream.close();
if(in != null){
in.close();
}
// file.delete();
}

public static void main(String[] args) {
try {
String[] temp = { "C:\\pic\\A4.tif" };
TiffToPDF build = new TiffToPDF("A4.pdf", temp);
} catch (Exception e) {
e.printStackTrace();
}

}

}

...全文
521 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzj7390711 2011-01-05
  • 打赏
  • 举报
回复
请问楼主。字节太大的话你能转成功吗?现在我碰到这个问题。
gHost241 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zealVampire 的回复:]
启动的时候设大一点堆

java -X 查看帮助

-Xms <size> set initial Java heap size
-Xmx <size> set maximum Java heap size
[/Quote]
这样子应该是可以得...
一洽客服系统 2009-06-11
  • 打赏
  • 举报
回复
多大的图片啊 :)楼上正解 如果eclipse下可以再运行-》运行参数里设置(vm)参数 -Xms128M -Xmx512M 。。。。
zealVampire 2009-06-11
  • 打赏
  • 举报
回复
启动的时候设大一点堆

java -X 查看帮助

-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧