Java PDF轉(zhuǎn)圖片、提取文本

需求:最近使用Java要做一個PDF上傳,自動生成封面縮略圖

調(diào)研結(jié)果

  • 1 icepdf => Java實(shí)現(xiàn) => 有亂碼問題
  • 2 pdfbox => Java實(shí)現(xiàn) => 有亂碼問題
  • 3 xpdf => C++實(shí)現(xiàn),需要使用Java調(diào)用該庫的可執(zhí)行文件 => 無亂碼問題

我測試了第1和第3中方案

icepdf使用

這個庫的問題在于在window系統(tǒng)上測試沒問題,把項(xiàng)目部署到Linux服務(wù)器上會出現(xiàn)部分PDF文件生成圖片亂碼問題,有人說是Linux服務(wù)器缺少字體,我試了安裝字體的方案也沒解決,有解決的朋友可以告訴我

添加依賴

       <!-- https://mvnrepository.com/artifact/org.icepdf.os/icepdf-core -->
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-core</artifactId>
            <version>6.2.2</version>
        </dependency>

編寫工具類

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.springframework.util.StringUtils;

/**
 * @author lism
 */
public class PdfUtils {
    /**
     * 生成一本書的縮略圖
     *
     * @param inputFile  需要生成縮略圖的書籍的完整路徑
     * @param outputFile 生成縮略圖的放置路徑
     */
    public static void generateBookImage(String inputFile, InputStream inputStream, String outputFile) {
        Document document = null;

        try {
            float rotation = 0f;
            //縮略圖顯示倍數(shù),1表示不縮放,0.5表示縮小到50%
            float zoom = 1f;

            document = new Document();
            if (!StringUtils.isEmpty(inputFile)) {

                document.setFile(inputFile);
            } else if (null != inputStream) {
                document.setInputStream(inputStream, null);
            }
            // maxPages = document.getPageTree().getNumberOfPages();

            BufferedImage image = (BufferedImage) document.getPageImage(0, GraphicsRenderingHints.SCREEN,
                    Page.BOUNDARY_CROPBOX, rotation, zoom);

            Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
            ImageWriter writer = (ImageWriter) iter.next();

            FileOutputStream out = new FileOutputStream(new File(outputFile));
            ImageOutputStream outImage = ImageIO.createImageOutputStream(out);

            writer.setOutput(outImage);
            writer.write(new IIOImage(image, null, null));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
       
       PdfUtils.generateBookImage("D:\\pdf\\QuestMobile.pdf", null,"D:\\pdf\\captureImage.jpg");
    }

}

使用xpdf實(shí)現(xiàn)(最終解決方案)

下載 https://www.xpdfreader.com/download.html
下載xpdf和中文字體,分別解壓縮。

xpdf.png

建立xpdf根目錄 d:\tool\xpdf

(1)并將xpdf-tools-win-4.00\bin64目錄下所有文件復(fù)制到 d:\xpdf 下。
(2)將xpdf-chinese-simplified 整個文件夾復(fù)制到 d:\xpdf 下。(該步驟及其以下步驟我在Linux服務(wù)器上未設(shè)置也沒亂碼,但是windows上沒設(shè)置就有問題)
(3) 復(fù)制 xpdf-tools-win-4.00\doc 路徑下的 sample-xpdfrc 文件到 d:\xpdf 下,并改名為 xpdfrc。
(4)修改文件 xpdfrc 第73行,將 textEncoding UTF-8 注釋打開,指定編碼為UTF-8,
(5)并在下面增加 textPageBreaks no 參數(shù),意思是在pdf文檔的兩頁間不加入分行符。
(6)在此文件最后增加以下內(nèi)容,聲明中文字體文件

#----- begin Chinese Simplified support package (2011-sep-02)
cidToUnicode Adobe-GB1 D:/tool/xpdf/xpdf-chinese-simplified/Adobe-GB1.cidToUnicode
unicodeMap ISO-2022-CN D:/tool/xpdf/xpdf-chinese-simplified/ISO-2022-CN.unicodeMap
unicodeMap EUC-CN D:/tool/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap
unicodeMap GBK D:/tool/xpdf/xpdf-chinese-simplified/GBK.unicodeMap
cMapDir Adobe-GB1 D:/tool/xpdf/xpdf-chinese-simplified/CMap
toUnicodeDir D:/tool/xpdf/xpdf-chinese-simplified/CMap
#displayCIDFontTT Adobe-GB1 D:/xpdf/xpdf-chinese-simplified/CMap/gkai00mp.ttf 
#fontFileCC Adobe-GB1 /usr/..../gkai00mp.ttf
#----- end Chinese Simplified support package

在命令行中使用

D:\tool\xpdf\pdftopng.exe  -f 1 -l 1 D:\test.pdf D:\testpng

-f 從第一頁,-l最后一頁
具體可以使用D:\tool\xpdf\pdftopng.exe --help查看命令

當(dāng)然xpdf還提供了提取文本的工具等

D:\tool\xpdf
λ ls
pdfdetach.exe*  pdfimages.exe*  pdftohtml.exe*  pdftoppm.exe*  pdftotext.exe*            xpdfrc
pdffonts.exe*   pdfinfo.exe*    pdftopng.exe*   pdftops.exe*   xpdf-chinese-simplified/

Java 方式調(diào)用demo

public static void main(String[] args) {
        try {
            String cmd = "d:\\tool\\xpdf\\pdftopng.exe  -f 1 -l 1 D:\\test.pdf D:\\testpng ";
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,100評論 25 709
  • 原來我在電子廠工作,那里時間很緊,加班更是家常便飯,基本上一天工作得十二個點(diǎn)以上,而且休息不會讓你超過十個小...
    啟言同學(xué)閱讀 272評論 0 0
  • 我對風(fēng)說 你會來嗎 你并未言語 我站在高山之巔 望著天空 等著風(fēng) 和你到來 風(fēng)清清的吹來 帶來了 你的訊息 風(fēng)和你...
    云煙夢澤閱讀 141評論 0 2
  • 一詩一文一個堅(jiān)持原創(chuàng)的平臺 / 每一天的詩歌和夢想,不要再和我擦肩而過 夜闌微雨驚殘夢 妙目慵瞠 足腕還輕 蘭指疏...
    一詩一文閱讀 430評論 0 2
  • 前幾天就在心里謀劃著想寫一篇關(guān)于內(nèi)衣發(fā)展史,以及深感內(nèi)衣是束縛女性之利器并覺得其"實(shí)!無!必!要!"的文章。那時還...
    獅小虎閱讀 273評論 0 0

友情鏈接更多精彩內(nèi)容