Java中将pdf文件转成image后,pdf文件删除失败,怎么回事? 400 报错 private void pdfToJPG(String inputFile)
throws IOException {
// load a pdf from a byte buffer
File file = new File(inputFile);
RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,
channel.size());
PDFFile pdffile = new PDFFile(buf);
int totalpage =pdffile.getNumPages();
for (int i = 1; i <= totalpage; i++) {
if (i == 1) {
// draw the first page to an image
// 以图片的形式来描绘首页
PDFPage page = pdffile.getPage(i);
Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()
.getWidth(), (int) page.getBBox().getHeight());
// generate the image
// 生成图片
Image img = page.getImage(rect.width, rect.height, // width &
// height
rect, // clip rect
null, // null for the ImageObserver
true, // fill background with white
true // block until drawing is done
);
BufferedImage tag = new BufferedImage(rect.width, rect.height,
BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(img.getScaledInstance(rect.width, rect.height, Image.SCALE_SMOOTH), 0, 0, rect.width, rect.height,
null);
FileOutputStream out = new FileOutputStream( imagePath+"\"+fileName.substring(fileName.lastIndexOf("/")+1)
+ ".jpg"); // 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag); // JPEG编码
// 关闭输出流
out.close();
break;
}
}
buf.clear();
channel.close();
raf.close();
file.delete();
}
public void destroy(){
if(this.pdfFile.exists()){
System.out.println(this.pdfFile.delete());
}
}
生成图片后执行destroy,打印FALSE,pdf删除失败,求高手指点
注意你这句代码:
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,channel.size());这句代码通道建立了map映射,你在file.delete();这句代码的前面,仅仅把buffer 给 clear了
Clears this buffer. The position is set to zero, the limit is set to the capacity, and the mark is discarded.
此时并没有解除映射,所以你在删除之前还要把映射解除:public static <T> void unmap(final Object buffer) { AccessController.doPrivileged(new PrivilegedAction<T>(){ @Override public T run() { try { Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]); getCleanerMethod.setAccessible(true); sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(buffer, new Object[0]); cleaner.clean(); } catch(Exception e) { e.printStackTrace(); } return null; } }); }最终是:
unmap(buf);
file.delete()
这样就可以删除了,你试试。
######太谢谢了,加上这个就可以了,非常感谢版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。