[PDFBox]后台操作pdf的工具类

  PDFBox是Apache下的一个操作pdf的类库。其也提供了一个命令行的工具,也提供了java调用的第三方类库。

  下载地址:https://pdfbox.apache.org/

  

  下面的实验基于JDK8+pdfbox-2.0.13.jar+pdfbox-app-2.0.13.jar(命令行工具库)

1.命令行使用

  文档参考:https://pdfbox.apache.org/2.0/commandline.html

  命令行工具可以提取pdf中的图片、文本,合并pdf与拆分pdf,pdf转换为图片等操作。

1.提取图片

java -jar pdfbox-app-2.0.13.jar ExtractImages ./1.pdf

  会在同文件夹下提取出pdf中的图片。

2.提取文字

java -jar pdfbox-app-2.0.13.jar ExtractText ./1.pdf ./text.txt

  当然还可以指定起始页号等参数。

3.pdf转换为图片

java -jar pdfbox-app-2.0.13.jar PDFToImage ./1.pdf

  结果每页生成一张图片。当然可以指定起始页号、生产图片的名称前缀等信息。默认生成的图片命名如下:(pdfname+page)

  还有许多命令行操作可以参考官网的文档,对于参数都有详细的解释。这种方式可以封装为工具类用Runtime多线程执行操作pdf。

2.Java中作为类库使用

  感觉这个工具还不是太方便,写入pdf表格等直接操作pdf的可以考虑用itext代替。这个就当做命令行工具实现pdf转换图片、提取文字等操作就可以了。关于itext的使用参考:https://www.cnblogs.com/qlqwjy/p/8213989.html

依赖的jar包:

commons-logging-1.0.4.jar、pdfbox-2.0.13.jar、fontbox-2.0.13.jar

package cn.qlq;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
import org.apache.pdfbox.text.PDFTextStripper;

public class PDFBoxTest {
    public static void main(String[] args) throws IOException {
        createBlankPDF();
    }

    /**
     * PDF中增加图片
     *
     * @throws IOException
     * @throws InvalidPasswordException
     */
    public static void addImg2PDF() throws IOException, InvalidPasswordException {
        try (PDDocument doc = PDDocument.load(new File("G:/blank.pdf"))) {
            PDPage page = doc.getPage(0);
            PDImageXObject pdImage = PDImageXObject.createFromFile("G:/0101.jpg", doc);

            try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true,
                    true)) {
                // contentStream.drawImage(ximage, 20, 20 );
                // better method inspired by
                // http://stackoverflow.com/a/22318681/535646
                // reduce this value if the image is too large
                float scale = 1f;
                contentStream.drawImage(pdImage, 20, 20, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
            }
            doc.save("G:/blank.pdf");
        }
    }

    /**
     * PDF文件中增加JS脚本
     *
     * @throws IOException
     * @throws InvalidPasswordException
     */
    public static void addJavaScript2PDF() throws IOException, InvalidPasswordException {
        try (PDDocument document = PDDocument.load(new File("G:/blank.pdf"))) {
            PDActionJavaScript javascript = new PDActionJavaScript(
                    "app.alert( {cMsg: ‘PDFBox rocks!‘, nIcon: 3, nType: 0, cTitle: ‘PDFBox Javascript example‘ } );");
            document.getDocumentCatalog().setOpenAction(javascript);
            if (document.isEncrypted()) {
                throw new IOException("Encrypted documents are not supported for this example");
            }
            document.save("G:/blank.pdf");
        }
    }

    /**
     * 阅读PDF文件的内容,支持阅读中文(如果需要阅读指定页面的PDF自己改写此方法)
     *
     * @throws IOException
     * @throws InvalidPasswordException
     */
    public static void readPDFText() throws IOException, InvalidPasswordException {
        try (PDDocument document = PDDocument.load(new File("G:/jl.pdf"))) {
            AccessPermission ap = document.getCurrentAccessPermission();
            if (!ap.canExtractContent()) {
                throw new IOException("You do not have permission to extract text");
            }

            PDFTextStripper stripper = new PDFTextStripper();

            stripper.setSortByPosition(true);

            for (int p = 1; p <= document.getNumberOfPages(); ++p) {
                stripper.setStartPage(p);
                stripper.setEndPage(p);

                String text = stripper.getText(document);

                String pageStr = String.format("page %d:", p);
                System.out.println(pageStr);
                for (int i = 0; i < pageStr.length(); ++i) {
                    System.out.print("-");
                }
                System.out.println();
                System.out.println(text.trim());
                System.out.println();
            }
        }
    }

    /**
     * 创建空的PDF文件并且添加一个空白页,多页可以插入多个PDPage
     *
     * @throws IOException
     */
    public static void createBlankPDF() throws IOException {
        String filename = "G:/blank.pdf";

        try (PDDocument doc = new PDDocument()) {
            // a valid PDF document requires at least one page
            PDPage blankPage = new PDPage();
            doc.addPage(blankPage);
            doc.save(filename);
        }
    }

    /**
     * 图片转换为PDF文件
     *
     * @throws IOException
     */
    public static void img2PDF() throws IOException {
        String imagePath = "G:/0101.jpg";
        String pdfPath = "G:/0101.pdf";

        try (PDDocument doc = new PDDocument()) {
            PDPage page = new PDPage();
            doc.addPage(page);

            PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc);

            try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
                contents.drawImage(pdImage, 20, 20);

            }
            doc.save(pdfPath);
        }
    }

    /**
     * 创建PDF文件并写入内容(暂时不支持写入中文)
     *
     * @throws IOException
     */
    public static void createPDF() throws IOException {
        String filename = "G:/Test.pdf";
        String message = "pdf";// 字体不能有中文,暂时不支持中文

        try (PDDocument doc = new PDDocument()) {
            PDPage page = new PDPage();
            doc.addPage(page);

            PDFont font = PDType1Font.HELVETICA_BOLD;

            try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
                contents.beginText();
                contents.setFont(font, 12);
                contents.newLineAtOffset(100, 700);
                contents.showText(message);
                contents.endText();
            }

            doc.save(filename);
        }
    }
}

原文地址:https://www.cnblogs.com/qlqwjy/p/10299433.html

时间: 2024-11-08 23:10:48

[PDFBox]后台操作pdf的工具类的相关文章

Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类

FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

Arrays是专门用于操作数组的工具类

排序或者查找数组里面的内容 多值传递 集合转数组 数组转集合 数组转字符串 /* Arrays 是用于操作数组的工具类,里面全是静态的,和Collections是用来操作集合的工具类是不一样的 当import导入的没有说明static,那么就说明是导入包中的所有类, 如果说明是static的时候就说明导入的是某个类的所有静态成员,记得要加上static的说明符号. import static java.lang.System.*; */ import java.util.*; public cl

和键盘操作相关的工具类KeyBoardUtils

和键盘操作相关的工具类 package com.flyou.utils; import android.content.Context; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; /** * 打开或关闭软键盘 * * @author flyou * */ public class KeyBoardUtils { /** * 打卡软键盘 * * @param mEditTe

跟王老师学集合(十):操作集合的工具类:Collections

操作集合的工具类:Collections 主讲人:王少华  QQ群号:483773664 Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合元素实现同步控制等方法. 一.排序操作 (一).方法 Collections提供了如下几个方法用于对List集合元素进行排序 static void reverse(List list):反转指定List集合中元素的顺序 static void shu

与WIFI操作相关的工具类

与WIFI操作相关的工具类 package com.flyou.utils; import java.util.List; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiInfo; import android

自定义的操作Cookie的工具类

可以在SpringMVC等环境中使用的操作Cookie的工具类 package utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.h

Collections工具类:操作集合的工具类

Collections工具类:操作集合的工具类 Java提供了一个操作Set List Map等集合的工具类:Collections,该工具类提供了大量方法对集合元素进行排序.查询和修改等操作.还提供了将集合对象设置为不可变,对集合对象实现同步控制等方法. 排序操作 ArrayList arrayList = new ArrayList(); arrayList.add(2); arrayList.add(-1); arrayList.add(4); arrayList.add(6); Syst

office转pdf windows-linux-java工具类

概述 该文档详细描述了在windows和Linux环境下安装openoffice的全过程以及用java代码实现office转pdf文件的操作,文档中以Apache_OpenOffice_4.1.5_Win_x86_install_zh-CN.exe和Apache_OpenOffice_4.1.3_Linux_x86-64_install-rpm_zh-CN.tar.gz为例. Windows: 1.安装Apache_OpenOffice_4.1.5_Win_x86_install_zh-CN.e

操作Wifi的工具类

有时候需要打开关闭wifi,或者是坚持状态什么的,这里我写了个工具类来完成各种操作,今后还会添加其他的功能.比如链接某个加密/不加密的wifi WifiAdmin.java package com.kale.socketactivity; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.net.wifi.ScanResult; import andr