如何应用PDFRenderer系统实现将PDF文档转换为图片的应用示例.docx
《如何应用PDFRenderer系统实现将PDF文档转换为图片的应用示例.docx》由会员分享,可在线阅读,更多相关《如何应用PDFRenderer系统实现将PDF文档转换为图片的应用示例.docx(19页珍藏版)》请在冰豆网上搜索。
如何应用PDFRenderer系统实现将PDF文档转换为图片的应用示例
1.1如何应用PDFRenderer系统实现将PDF文档转换为图片的应用示例
1.1.1应用PDFRenderer系统实现将PDF文档转换为图片的应用示例
1、构建示例测试Java应用程序项目
(1)在MyEclipse开发工具中创建一个项目名称为JavaPDFApp的Java应用程序项目
(2)设置项目名称为JavaPDFApp
(3)项目结果
2、将PDFRenderer系统文件加入到项目的编译环境中
(1)启动项目的属性菜单
(2)切换到JavaBuildPath页中的Libraries选项页
(3)将下载的PDFRenderer系统文件加入到项目的编译环境中
3、在MyEclipse开发工具中创建示例程序类
(1)示例程序类名称为PDFToImagePictureByPDFRenderer,程序包名称为com.bluedream.pdfrenderer
(2)将创建出PDFToImagePictureByPDFRenderer程序类的初始代码
4、编程PDFToImagePictureByPDFRenderer程序类的功能实现代码
(1)编程PDFToImagePictureByPDFRenderer程序类中的功能方法
(2)PDFToImagePictureByPDFRenderer程序类的完整代码示例
packagecom.bluedream.pdfrenderer;
importjava.awt.Image;
importjava.awt.Rectangle;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.RandomAccessFile;
importjava.lang.reflect.Method;
importjava.nio.MappedByteBuffer;
importjava.nio.channels.FileChannel;
importjava.security.AccessController;
importjava.security.PrivilegedAction;
importjava.util.UUID;
importcom.sun.image.codec.jpeg.ImageFormatException;
importcom.sun.image.codec.jpeg.JPEGCodec;
importcom.sun.image.codec.jpeg.JPEGEncodeParam;
importcom.sun.image.codec.jpeg.JPEGImageEncoder;
importcom.sun.pdfview.PDFFile;
importcom.sun.pdfview.PDFPage;
publicclassPDFToImagePictureByPDFRenderer{
publicPDFToImagePictureByPDFRenderer(){
super();
}
/**
*
*@paramorignalPDTFileName转换前的原始的PDF文件绝对路径和文件名称,比如StringorignalPDTFileName="D:
\\软件项目程序\\Demo1\\demo1.pdf";
*@paramresultImagePathName转换后的图片存储的目录路径名称(绝对路径),比如StringresultImagePathName="D:
\\软件项目程序\\Demo1\\result\\";
*@paramexePandParameters图片清晰度(n>0.0且n<7.0),为PDF的放大参数,也就转换后的图片的尺寸为原始的PDF页尺寸的倍数,默认为1.0(与原始的PDF文件页尺寸相同);<1.0为缩小,>1.0为放大
*@paramisPDFFileDeleted转换后是否要删除原始的PDF文件,=true删除原始的PDF文件,=false不删除原始的PDF文件
*/
publicbooleandoTransferPdfFileToPicture(StringorignalPDTFileName,StringresultImagePathName,floatexePandParameters,booleanisPDFFileDeleted){
RandomAccessFileoneRandomAccessFile=null;
MappedByteBufferoneMappedByteBuffer=null;
PDFFileonePDFFile=null;
FileOutputStreamoneFileOutputStream=null;
FileorignalPDTFile=null;
JPEGImageEncoderoneJPEGImageEncoder=null;
JPEGEncodeParamoneJPEGEncodeParam=null;
FileChanneloneFileChannel=null;
/**
*最终转换是否成功的返回状态标志,=false表示转换不成功,=true表示转换成功
*/
booleanisTransferOK=false;
orignalPDTFile=newFile(orignalPDTFileName);
try{
try{
/**
*以随机方式读取原始的PDF文档,并创建出RandomAccessFile类的对象实例
*/
oneRandomAccessFile=newRandomAccessFile(orignalPDTFile,"r");
}catch(FileNotFoundExceptione){
/**
*e.printStackTrace()是在标准错误输出流上打印整个Exception轨迹栈(会把从头到尾的方法都列出来,比较好查找错误),而System.out.print(e)只是打印了e.toString()方法返回的结果。
e.printStackTrace()的信息更丰富,更完整。
*e.printStackTrace()相当于System.out.print(e.getStackTrace().toString())
*/
e.printStackTrace();
}
/**
*FileChannel是一个读、写、映射和操作文件的通道,文件通道有可以被查询和修改的一个当前位置。
getChannel方法返回的文件通道是被连接到相同的底层文件。
*但通过FileInputStream的getChannel方法获取的文件通道是只读的,而通过FileOutputStream的getChannel的方法获取的文件通道是可写的,
*通过RandomAccessFile的getChannel的方法获取的文件通道,在创建时如果传递的参数是“r",则为只读,否则为”读写“或者“写”。
*/
oneFileChannel=oneRandomAccessFile.getChannel();
try{
/**
*在FileChannel上调用map()方法会创建一个由磁盘文件支持的虚拟内存映射(virtualmemorymapping)并在那块虚拟内存空间外部封装一个MappedByteBuffer对象。
由map()方法返回的MappedByteBuffer对象的行为在多数方面类似一个基于内存的缓冲区,只不过该对象的数据元素存储在磁盘上的一个文件中。
map()方法有mode、position和size三个参数。
映射文件的范围不应超过文件的实际大小,如果您请求一个超出文件大小的映射,文件会被增大以匹配映射的大小。
假如您给size参数传递的值是Integer.MAX_VALUE,文件大小的值会膨胀到超过2.1GB。
*/
oneMappedByteBuffer=
oneFileChannel.map(FileChannel.MapMode.READ_ONLY,0,oneFileChannel.size());
/**
*通过内存映射机制来访问一个文件会比使用常规方法读写高效得多,甚至比使用通道的效率都高。
因为不需要做明确的系统调用,那会很消耗时间。
*更重要的是,操作系统的虚拟内存可以自动缓存内存页(memorypage)。
这些页是用系统内存来缓存的,所以不会消耗Java虚拟机内存堆(memoryheap)。
*文件映射可以是可写的或只读的。
前两种映射模式MapMode.READ_ONLY和MapMode.READ_WRITE意义是很明显的,
*它们表示您希望获取的映射只读还是允许修改映射的文件。
请求的映射模式将受被调用map()方法的FileChannel对象的访问权限所限制。
*如果通道是以只读的权限打开的而您却请求MapMode.READ_WRITE模式,那么map()方法会抛出一个NonWritableChannelException异常;
*如果您在一个没有读权限的通道上请求MapMode.READ_ONLY映射模式,那么将产生NonReadableChannelException异常。
*不过在以read/write权限打开的通道上请求一个MapMode.READ_ONLY映射却是允许的。
*/
}catch(IOExceptione){
e.printStackTrace();
}
/**
*将PDF文件转换为PDFFile对象,从而可以进行处理
*/
try{
onePDFFile=newPDFFile(oneMappedByteBuffer);
}catch(IOExceptione){
e.printStackTrace();
}
/**
*获得待转换的PDF文件中的总页数
*/
inttotalPageNumbers=onePDFFile.getNumPages();
/**
*对待转换的PDF文件中的每一页进行转换处理
*/
for(intcurrentPageNumber=1;currentPageNumber<=totalPageNumbers;
currentPageNumber++){
/**
*获得指定页数的PDF页对象,它代表PDF文档文件中的某一页的内容
*/
PDFPageonePDFPage=onePDFFile.getPage(currentPageNu