为了实现pdf报表不可篡改,将pdf报表转换为内容全为图片的pdf报表。
实现思路:
1.将原pdf每页转换为图片数据(使用pdfbox.jar和fontbox.jar);
参考链接:http://blog.youkuaiyun.com/chenjhit/article/details/54344353
2.将图片数据转换为byte[]格式图片数据;
参考链接:http://www.cnblogs.com/haoqijifeng/p/5567976.html
3.将byte[]图片数据加入到输出pdf中(使用itext.jar)。
实现方法:
public static void pdfToImageToPdf(){
File file = new File("e:/in.pdf");
Document docOut = new Document();
docOut.setMargins(0, 0, 0, 0);
try {
FileOutputStream os = new FileOutputStream("e:/out.pdf");
PdfWriter.getInstance(docOut, os);
docOut.open();
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for(int i=0; i<pageCount; i++){
long t1 = System.currentTimeMillis();
ByteArrayOutputStream bb = new ByteArrayOutputStream();
BufferedImage image = renderer.renderImage(i, 1.25f); //第二个参数越大生成图片分辨率越高。
long t2 = System.currentTimeMillis();
ImageIO.write(image, "jpg",bb );
long t3 = System.currentTimeMillis();
Image jpg = Image.getInstance(bb.toByteArray());
long t4 = System.currentTimeMillis();
jpg.scalePercent(80.0f); //此处百分比与前面的分辨率参数相乘结果为1,则可保证等比输出。
jpg.setAlignment(Image.ALIGN_CENTER);
docOut.add(jpg);
long t5 = System.currentTimeMillis();
System.out.println((t2 - t1) + "***" + (t3 - t2) + "***" + (t4 - t3) + "***" + (t5 - t4));
}
docOut.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (DocumentException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
存在问题:
转换效率比较低(200页转换时间约为60秒),时间主要花费在renderer.renderImage(i, 1.5f)和ImageIO.write(image,”jpg”,bb)中,各位大神可有良策?