五分钟实现pdf分页

简介: 抱歉也开始用了这么“标题党”的标题。事情起源于前几天需要把个人资料的pdf文档一页一页的拆出来,好传到相关的网站上。直接截图到word再转pdf比较麻烦,所以想用工具直接转换。结果找了几个pdf阅读器,这类操作都需要会员或收费。作为一名程序员,这么简单的操作还要收费显然是一种羞耻(当然我是不会承认主要是因为qiong的),几分钟就可以代码解决的问题为啥要花钱呢?废话不多说,开搞。

背景

   抱歉也开始用了这么“标题党”的标题。事情起源于前几天需要把个人资料的pdf文档一页一页的拆出来,好传到相关的网站上。直接截图到word再转pdf比较麻烦,所以想用工具直接转换。结果找了几个pdf阅读器,这类操作都需要会员或收费。作为一名程序员,这么简单的操作还要收费显然是一种羞耻(当然我是不会承认主要是因为qiong的),几分钟就可以代码解决的问题为啥要花钱呢?废话不多说,开搞。

工具准备

   之前的文章Apache POI 详解及 Word 文档读取示例中,我们曾经用apache poi来实现对word文档的操作。对于pdf文件,也同样有apache的pdfbox(官网:https://pdfbox.apache.org/),和itextpdf(官网:https://itextpdf.com/)包可以使用。

PDFBox:

   PDFBox 是 Java 实现的 PDF 文档协作类库,提供 PDF 文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。PDFBox提供的主要功能有:

  • 从 PDF 提取文本
  • 合并 PDF 文档
  • PDF 文档加密与解密
  • Lucene 搜索引擎的集成
  • 填充 PDF/XFDF 表单数据
  • 从文本文件创建 PDF 文档
  • 从 PDF 页面创 建图片
  • 打印 PDF 文档

itextpdf:

   iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

依赖引入

   新建一个java maven工程,引入依赖包(这里使用的是itextpdf的5.5.1 和 pdfbox的2.0.15版本):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>pdf-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.1</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.15</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.15</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/jempbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>jempbox</artifactId>
            <version>1.8.16</version>
        </dependency>
    </dependencies>
</project>

pdf文件拆分导出实现

要实现功能:输入pdf文件路径,指定起止页码,截取这几页内容并写入新的pdf文件。例如起始页码1,截止页码3,则生成一个新文件,存储原pdf文档的1-3页。

这里使用的是itextpdf,代码如下:

/**
   * 导出pdf文档中的部分页到新的pdf文件
   * @param filePath 文件路径
   * @param newFile 写入目标文件路径
   * @param from 起始页码
   * @param end 结束页码
   */
  public static void pdfToSub(String filePath, String newFile, int from, int end) {
    Document document = null;
    PdfCopy copy = null;
    try {
      PdfReader reader = new PdfReader(filePath);
      //查询pdf文档页数
      int n = reader.getNumberOfPages();
      if (end == 0) {
        end = n;
      }
      document = new Document(reader.getPageSize(1));
      copy = new PdfCopy(document, new FileOutputStream(newFile));
      document.open();
      for (int j = from; j <= end; j++) {
        document.newPage();
        PdfImportedPage page = copy.getImportedPage(reader, j);
        copy.addPage(page);
      }
      document.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

main函数:

String filePath = "/Users/xxxx/Downloads/数据中台- 77ebooks.com.pdf";
String newFile = "/Users/xxxx/Downloads/1-3.pdf";
pdfToSub(filePath, newFile, 1, 3);

执行后在目录下可以看到结果文件:

读取pdf文件内容

使用pdfbox的pdfparser,代码如下:

/**
   * 读取pdf文档指定页数的文本内容
   * @param fileName 文件路径及文件名
   * @param from 开始页码
   * @param end 结束页码
   * @return
   */
  public static String readPdfByPage(String fileName, int from, int end) {
    String result = "";
    File file = new File(fileName);
    FileInputStream in = null;
    try {
      in = new FileInputStream(fileName);
      // 新建PDF解析器对象
      PDFParser parser = new PDFParser(new RandomAccessFile(file,"rw"));
      // 文件解析
      parser.parse();
      // 获取解析后得到的PDF文档对象
      PDDocument pdfDocument = parser.getPDDocument();
      int size = pdfDocument.getNumberOfPages();
      // 新建PDF文本剥离器
      PDFTextStripper stripper = new PDFTextStripper();
      stripper.setSortByPosition(false); //true则按照行进行读取,默认false
      // 设置起始页
      stripper.setStartPage(from);
      // 设置结束页
      stripper.setEndPage(end);
      // 从PDF文档中读取文本
      result = stripper.getText(pdfDocument);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
    }
    return result;
  }

执行后输出:

示例需要需要引入的package如下:

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

小结

   本篇对pdf的操作做了初步的尝试。后续将详解pdf文件格式,以及pdfbox和itextpdf的核心源码。

相关文章
|
14天前
|
前端开发 UED
🌟前端分页加载/懒加载预览PDF🌟
🌟前端分页加载/懒加载预览PDF🌟
|
SQL Java .NET
【java】itext pdf 分页
importjava.io.FileOutputStream;   importcom.lowagie.text.Document; importcom.lowagie.text.Element; importcom.
3404 0
|
1月前
|
Web App开发 Windows
【Windows】 chrome 如何下载网站在线预览PDF文件,保存到本地
【Windows】 chrome 如何下载网站在线预览PDF文件,保存到本地
146 0
|
1月前
|
前端开发
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
17 0
|
2月前
|
数据挖掘 数据安全/隐私保护 开发者
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
126 0
|
2月前
|
存储 缓存 Python
如何使用Python抓取PDF文件并自动下载到本地
如何使用Python抓取PDF文件并自动下载到本地
38 0
|
1月前
|
JSON 关系型数据库 数据库
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
|
1月前
|
JSON 关系型数据库 数据库
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
|
3月前
|
编解码 数据可视化 数据挖掘
【办公自动化】用Python将PDF文件转存为图片
【办公自动化】用Python将PDF文件转存为图片
71 1