java進行PDF和圖片之間的相互轉換


簡介

在項目中我們有時候會遇到操作PDF文件的需求,如將PDF的每一頁轉換成圖片,今天我們就來實現一下相關功能。

實現

引入依賴

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.21</version>
</dependency>

pdfbox是一個開源的操作PDF的工具包,這里是 官方文檔

將PDF轉換成多張圖片

程序中使用的源PDF下載 阿里巴巴Java開發...1528284352.pdf

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

public class Client {

  public static void main(String[] args) throws Exception {
    testPdf2images();
  }


  private static void testPdf2images() throws Exception {
    List<byte[]> images = pdf2images(new File("D:/testpdf/阿里巴巴Java開發...1528284352.pdf"));
    AtomicInteger fileNameIndex = new AtomicInteger(1);
    for (byte[] image : images) {
      new ByteArrayInputStream(image).transferTo(
          new FileOutputStream("D:/testpdf/" + fileNameIndex.getAndIncrement() + ".png"));
    }
  }

  /**
   * 將PDF文件轉換成多張圖片
   *
   * @param pdfFile PDF源文件
   * @return 圖片字節數組列表
   */
  private static List<byte[]> pdf2images(File pdfFile) throws Exception {
    //加載PDF
    PDDocument pdDocument = PDDocument.load(pdfFile);
    //創建PDF渲染器
    PDFRenderer renderer = new PDFRenderer(pdDocument);
    int pages = pdDocument.getNumberOfPages();
    List<byte[]> images = new ArrayList<>();
    for (int i = 0; i < pages; i++) {
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      //將PDF的每一頁渲染成一張圖片
      BufferedImage image = renderer.renderImage(i);
      ImageIO.write(image, "png", output);
      images.add(output.toByteArray());
    }
    pdDocument.close();
    return images;
  }

}

創建的圖片列表如下

將圖片列表轉換成PDF

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Objects;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class Client2 {

  public static void main(String[] args) throws Exception {
    testImages2pdf();
  }

  private static void testImages2pdf() throws Exception {
    File file = new File("D:/testpdf");
    //過濾所有圖片文件
    File[] files = file.listFiles((f, s) -> s.endsWith(".png"));
    if (Objects.nonNull(files)) {
      //根據名稱排序
      Arrays.sort(files, Client2::compareImageFile);
      byte[] pdf = images2pdf(files);
      new ByteArrayInputStream(pdf).transferTo(
          new FileOutputStream("D:/testpdf/阿里巴巴java文檔.pdf"));
    }
  }

  /**
   * 根據圖片名稱排序
   */
  private static int compareImageFile(File f1, File f2) {
    String f1Name = f1.getName();
    String f2Name = f2.getName();
    return Integer.compare(Integer.parseInt(f1Name.substring(0, f1Name.lastIndexOf("."))),
        Integer.parseInt(f2Name.substring(0, f2Name.lastIndexOf("."))));
  }

  /**
   * 根據多張圖片生成PDF文件
   *
   * @param images 圖片列表
   * @return PDF文件
   */
  private static byte[] images2pdf(File... images) throws Exception {
    //創建空PDF
    PDDocument document = new PDDocument();
    for (File image : images) {
      InputStream input = new FileInputStream(image);
      //讀取圖片
      BufferedImage bufferedImage = ImageIO.read(input);
      float width = bufferedImage.getWidth();
      float height = bufferedImage.getHeight();
      //創建PDF的一頁
      PDPage page = new PDPage(new PDRectangle(width, height));
      document.addPage(page);
      PDImageXObject pdImageXObject = PDImageXObject.createFromFileByContent(image, document);
      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      //寫入圖片
      contentStream.drawImage(pdImageXObject, 0, 0);
      contentStream.close();
      input.close();
    }
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    document.save(output);
    document.close();
    return output.toByteArray();
  }
}

總結

遇到問題多google

參考

Java PDF轉圖片
Java: Create PDF pages from images using PDFBox library
在線處理PDF工具


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM