JAVA中pdf转图片的方法

9 篇文章 4 订阅

参考:http://www.cnblogs.com/pcheng/p/5704470.html

目录

一、icepdf。有收费版和开源版,几种方法里最推荐的。

二、pdfbox。转换效果还可以,能识别我手中文件大部分内容,有部分内容无法识别。

三、jpedal。效果不太理想,貌似对中文支持不太好,下面的lgpl版本是开源版。


  JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用。

一、icepdf。有收费版和开源版,几种方法里最推荐的。

转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽。因为,字体支持是要收费的,所以转换的图片会带有官方的水印。去水印的方法可以查看另一篇文章:icepdf去水印方法

1、下载icepdf的架包,并导入项目中,这里用到4个,如下:

2、附上代码例子:

String filePath = "c:/test.pdf";
  Document document = new Document();
  document.setFile(filePath);
  float scale = 2.5f;//缩放比例
  float rotation = 0f;//旋转角度
        
  for (int i = 0; i < document.getNumberOfPages(); i++) {
    BufferedImage image = (BufferedImage)
    document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
    RenderedImage rendImage = image;
    try {
        File file = new File("c:/iecPDF_" + i + ".png");
        ImageIO.write(rendImage, "png", file); 
    } catch (IOException e) {
        e.printStackTrace();
    }
      image.flush();
  }
  document.dispose();

  例子中是pdf转png格式的,也可以将12、13行改成jpg,转出jpg格式的,但是从转换效果来看png的清晰度会相对较高。有个小技巧是12行改成jpg,但13行使用png,也就是转换成jpg格式但有png清晰度的图片。

 

二、pdfbox。转换效果还可以,能识别我手中文件大部分内容,有部分内容无法识别。

1、下载pdfbox的架包,并导入项目,这里用到2个,如下:

2、附上代码例子:

File file = new File("c:\\test.pdf");
  try {
    PDDocument doc = PDDocument.load(file);
    PDFRenderer renderer = new PDFRenderer(doc);
    int pageCount = doc.getNumberOfPages();
    for(int i=0;i<pageCount;i++){
      BufferedImage image = renderer.renderImageWithDPI(i, 296);
//          BufferedImage image = renderer.renderImage(i, 2.5f);
      ImageIO.write(image, "PNG", new File("C:\\pdfbox_image.png"));
    }
  } catch (IOException e) {
    e.printStackTrace();
  }

  例子中rederImageWithDPI的第二个参数为dpi分辨率单位,可根据需求调节大小,代码第八行提供了架包里另一种转图片的方法,第二个参数为缩放比。

 

三、jpedal。效果不太理想,貌似对中文支持不太好,下面的lgpl版本是开源版。

 1、下载jpedal的架包,并导入项目中,如下:

2、附上代码例子:

PdfDecoder decode_pdf = new PdfDecoder(true);
  try {
    decode_pdf.openPdfFile("c:\\test.pdf"); //file
//   decode_pdf.openPdfFile("C:/jpedalPDF.pdf", "password"); //encrypted file
//      decode_pdf.openPdfArray(bytes); //bytes is byte[] array with PDF
//      decode_pdf.openPdfFileFromURL("http://www.mysite.com/jpedalPDF.pdf",false);
//      decode_pdf.openPdfFileFromInputStream(in, false); 

    int start = 1, end = decode_pdf.getPageCount();
    for(int i = start; i < end+1; i++){
      BufferedImage img=decode_pdf.getPageAsImage(i);
      try {
        ImageIO.write(img, "png", new File("C:\\jpedal_image.png"));
      } catch (IOException e) {
        e.printStackTrace();
      } 
    }
    decode_pdf.closePdfFile();
  } catch (PdfException e) {
    e.printStackTrace();
  }

  例子的3-7行还提供了几种不同的pdf打开方式,可以根据自己的需要选择使用。

     支持  数组  decode_pdf.openPdfArray(bytes); //bytes is byte[] array with PDF,类型转换的话,可以参考这篇:JAVA中文件与Byte数组相互转换的方法

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可能是因为字体问题导致的文乱码。你可以尝试使用更全面的文字体,或者手动指定字体来解决这个问题。 具体实现方法可以参考以下代码: ```java import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import com.sun.pdfview.PDFFile; import com.sun.pdfview.PDFPage; import com.sun.pdfview.PDFRenderer; public class Pdf2Image { public static void main(String[] args) throws IOException { // 加载pdf文件 File file = new File("test.pdf"); PDFFile pdfFile = new PDFFile(file); // 获取第一页 PDFPage page = pdfFile.getPage(0); // 获取页面宽度和高度 int width = (int) page.getBBox().getWidth(); int height = (int) page.getBBox().getHeight(); // 创建图片缓冲区 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 创建渲染器 PDFRenderer renderer = new PDFRenderer(page, new Graphics2DWrapper(image.createGraphics())); // 渲染页面到图片缓冲区 renderer.run(); // 保存图片到文件 FileOutputStream out = new FileOutputStream("test.png"); javax.imageio.ImageIO.write(image, "png", out); out.close(); } /** * 重写 Graphics2DWrapper 类,设置字体 */ static class Graphics2DWrapper extends Graphics2D { private Graphics2D g2d; public Graphics2DWrapper(Graphics2D g2d) { this.g2d = g2d; } @Override public void drawString(String str, float x, float y) { g2d.setFont(new Font("宋体", Font.PLAIN, 12)); // 设置字体 g2d.drawString(str, x, y); } // 其他方法省略... } } ``` 在上面的代码,重写了 Graphics2DWrapper 类,手动设置了字体为宋体。你可以根据自己的需要更改字体。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值