java实现pdf转图片

旧城等待, 2022-05-23 06:15 429阅读 0赞

摘要:利用Apache的pdfbox包进行操作,将pdf分成多个png图片。

环境:win10+Eclipse Oxygen+jdk1.8.0

第三方库:70

注意:官方的pdfbox有2.0和1.8两种版本之分,在一些API上有差别。类似于Python2和Python3的区别,两者不能通用。我在一开始不了解这个区别,加之一些博客并没有明确说明,造成了很大困扰和时间浪费。本文是用的pdfbox2.0

问题1:fontbox和pdfbox的下载地址。

解答:可以在官网中下载。https://pdfbox.apache.org/download.cgi\#20x 百度搜索即可。点击左侧的download,在界面中选择下载。

70 1

问题2:只导入fontbox和pdfbox两个包为何会报错?

解答:需要导入commons-logging包,也是Apache的包。提供一些与日志相关的服务。

commons-logging的下载,可以在官网http://commons.apache.org/proper/commons-logging/download\_logging.cgi上下载,点击左侧的download,在界面中选择下载即可。

70 2

代码:

  1. /**
  2. * @author 夹心 E-mail: yanjiaxin8410@163.com
  3. * @version 创建时间:2018年5月18日 下午8:57:07
  4. * 类说明
  5. */
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.util.Scanner;
  10. import javax.imageio.ImageIO;
  11. import org.apache.pdfbox.pdmodel.PDDocument;
  12. import org.apache.pdfbox.rendering.PDFRenderer;
  13. public class PDF2png {
  14. //可自由确定起始页和终止页
  15. public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd) {
  16. // 将pdf装图片 并且自定义图片得格式大小
  17. File file = new File(fileAddress+"\\"+filename+".pdf");
  18. try {
  19. PDDocument doc = PDDocument.load(file);
  20. PDFRenderer renderer = new PDFRenderer(doc);
  21. int pageCount = doc.getNumberOfPages();
  22. for (int i = indexOfStart; i < indexOfEnd; i++) {
  23. BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
  24. // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
  25. ImageIO.write(image, "PNG", new File(fileAddress+"\\"+filename+"_"+(i+1)+".png"));
  26. }
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. //转换全部的pdf
  32. public static void pdf2png(String fileAddress,String filename) {
  33. // 将pdf装图片 并且自定义图片得格式大小
  34. File file = new File(fileAddress+"\\"+filename+".pdf");
  35. try {
  36. PDDocument doc = PDDocument.load(file);
  37. PDFRenderer renderer = new PDFRenderer(doc);
  38. int pageCount = doc.getNumberOfPages();
  39. for (int i = 0; i < pageCount; i++) {
  40. BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
  41. // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
  42. ImageIO.write(image, "PNG", new File(fileAddress+"\\"+filename+"_"+(i+1)+".png"));
  43. }
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. public static void main(String[] args) {
  49. Scanner sc = new Scanner(System.in);
  50. System.out.println("请输入需要转换的pdf的地址,例如 E:\软件\代码:");
  51. String fileAddress = sc.nextLine();
  52. System.out.println("请输入需要转换的pdf的名称,不要加.pdf后缀,例如 操作系统概念:");
  53. String filename =sc.nextLine();
  54. System.out.println("请输入开始转换的页码,从0开始,例如 5:");
  55. int indexOfStart=sc.nextInt();
  56. System.out.println("请输入停止转换的页码,-1为全部,例如 10:");
  57. int indexOfEnd=sc.nextInt();
  58. if (indexOfEnd==-1) {
  59. pdf2png(fileAddress, filename);
  60. }
  61. else {
  62. pdf2png(fileAddress, filename, indexOfStart, indexOfEnd);
  63. }
  64. }
  65. }

评价:

转换效率还是可以的,基本每秒转换一两张图片的速度。

图片的大小与清晰度和代码中的dpi设置有关,我尝试过96/144/198三个值,发现144比较合适。如果有特殊需求,需要更高清晰度的图片,可以自己手动调高dpi参数。

发表评论

表情:
评论列表 (有 0 条评论,429人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现PDF图片

    注意事项:转图片后需仔细核对,因PDF内的字体可能不是宋体等最常见字体,转图片后可能出现中文乱码现象,需要查看原PDF文件中对应字体,下载后安装在本地或服务器上。 需引入ja