java 把pdf图片文档和文章文档转成文字的方法(此方法不好用,转换成文字可以,转成pdf不行)

  • Post author:
  • Post category:java


java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。

  1. Apache PDFBox:这是一个开源的 PDF 库,可以用来提取 PDF 文件中的文本内容。

  2. iText:这是一个用于创建和处理 PDF 文件的库,可以用来提取 PDF 文件中的文本内容。

  3. Tesseract OCR:这是一个开源的 OCR 引擎,可以用来识别图片中的文本。可以使用 Java Tesseract API 将 Tesseract 集成到 Java 项目中。

  4. ABBYY FineReader:这是一个商业 OCR 软件,可以识别多种文件格式中的文本内容,包括 PDF 和图片格式。可以使用 Java API 将 ABBYY FineReader 集成到 Java 项目中。

对于图片文档不好转的情况,可以尝试以下方法:

  1. 尝试使用更高分辨率的图片。更高的分辨率可以提高 OCR 引擎的识别精度。

  2. 尝试使用更清晰的图片。使用更清晰的图片可以减少识别错误。

  3. 尝试手动调整图片的亮度和对比度,以便更好地展示图片中的文本。

  4. 尝试使用更高级的 OCR 引擎,如 ABBYY FineReader,它具有更高的识别精度和更好的处理能力。

请注意,无论使用哪种方法,文本提取可能存在误差,需要手动进行校对和修正。

以下是使用 Apache PDFBox 库将 PDF 文档转换为文本的示例代码:

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class PdfToTextConverter {

    public static void main(String[] args) {
        PDDocument document = null;
        try {
            // 读取 PDF 文件
            document = PDDocument.load(new File("path/to/pdf"));

            // 创建 PDFTextStripper 对象
            PDFTextStripper stripper = new PDFTextStripper();

            // 设置文本提取的起始页和结束页
            stripper.setStartPage(1);
            stripper.setEndPage(document.getNumberOfPages());

            // 提取文本内容
            String text = stripper.getText(document);
            System.out.println(text);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

以下是使用 Tesseract OCR 库将图片文档转换为文本的示例代码:

PDF 文件中的页面只包含图像,而没有可选的文字层。这意味着,不能直接使用 Tesseract OCR 引擎来提取文本内容,因为 OCR 引擎需要文本层才能进行文字识别。

在这种情况下,需要使用 PDF 图像提取工具将每个页面转换为单独的图像文件(如 PNG 或 JPEG 格式),然后再使用 Tesseract OCR 引擎对每个图像文件进行 OCR 文字识别。

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>4.5.4</version>
</dependency>

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class PdfToTextConverter {

    public static void main(String[] args) {
        String tessData = "C:\\Program Files\\Tesseract-OCR\\tessdata"; // 修改为实际的路径
        // 设置 Tesseract OCR 引擎的语言
        Tesseract tesseract = new Tesseract();
        tesseract.setLanguage("chi_sim");//chi_sim  简体中文  chi_tra繁体中文 注意:在安装tesseract-ocr-w64-setup-v5.0.0.20190623.exe 的时候,是勾选了中文的。
        tesseract.setDatapath(tessData);
        tesseract.setPageSegMode(3);//PageSegMode.PSM_AUTO == 3
        tesseract.setTessVariable("user_defined_dpi", "300");
        // 设置字体
        tesseract.setTessVariable("textonly_pdf", "1");
        tesseract.setTessVariable("tessedit_create_pdf", "1");
        tesseract.setTessVariable("pdf_font_name", "Arial"); //选项来将不可识别的字符替换为占位符。
        // 定义 PDF 文件路径和输出文本文件路径
        String pdfFilePath = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTest.pdf";
        String outputPdfFilePath  = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTestOut.pdf";//这是输出路径,不是图片储存路径
        String outputTextFilePath  = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTestOut.txt";//这是输出路径,不是图片储存路径

        try {
            // 将 PDF 文件转换为图像文件,并保存在指定目录中
            PdfToImageConverter pdfToImageConverter = new PdfToImageConverter(pdfFilePath, 300);
            pdfToImageConverter.convertToImage("C:\\Users\\admin\\Desktop\\bookdemo\\folder");

//            //==========输出到PDF
//            PDDocument document = new PDDocument();
//            for (int i = 1; i <= 1; i++) {
//            //for (int i = 1; i <= pdfToImageConverter.getPageCount(); i++) {
//                String imagePath = "C:\\Users\\admin\\Desktop\\bookdemo\\folder\\page" + i + ".png";
//                File imageFile = new File(imagePath);
//                BufferedImage image = ImageIO.read(imageFile);
//                String ocrText = tesseract.doOCR(image);
//
//                PDPage page = new PDPage();
//                document.addPage(page);
//                PDPageContentStream contentStream = new PDPageContentStream(document, page);
//                contentStream.beginText();
//                //contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);
//                //contentStream.setFont(PDType1Font.HELVETICA, 12);
//                PDType0Font font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simhei.ttf"));
//                contentStream.setFont(font, 12);
//                contentStream.newLineAtOffset(100, 700);
//                //contentStream.showText(ocrText);
//                String[] lines = ocrText.split("\\r?\\n");
//                for (String line : lines) {
//                    contentStream.showText(line);
//                    contentStream.newLine();
//                }
//                contentStream.endText();
//                contentStream.close();
//            }
//
//            document.save(outputPdfFilePath );
//            document.close();

            //==========初始化输出文本文件
            File outputTextFile = new File(outputTextFilePath);
            if (outputTextFile.exists()) {
                outputTextFile.delete();
            }
            outputTextFile.createNewFile();

            // 逐个处理图像文件,并将 OCR 文本输出到文本文件中
            for (int i = 1; i <= pdfToImageConverter.getPageCount(); i++) {
                String imagePath = "C:\\Users\\admin\\Desktop\\bookdemo\\folder\\page" + i + ".png";
                File imageFile = new File(imagePath);

                // 使用 Tesseract OCR 引擎提取文本内容
                String ocrText = tesseract.doOCR(imageFile);

                // 将 OCR 文本追加到输出文本文件中
                FileUtils.writeStringToFile(outputTextFile, ocrText, "UTF-8", true);
            }

            System.out.println("PDF 文件转换完成。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其中用到的类:


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

public class PdfToImageConverter {
    private String pdfFilePath;
    /**
     * DPI 取值越高,输出的图片文件大小和渲染时间就越大(取值范围是 72 到 300)
     *
     * 72 DPI:适用于屏幕显示和网络共享的低分辨率图片,例如 Web 图片、电子邮件附件等。
     * 96 DPI:适用于打印机打印和屏幕显示的中等分辨率图片,例如办公文档、幻灯片、简单的海报等。
     * 150 DPI:适用于打印机打印的高质量图片,例如印刷品、照片等。
     * 300 DPI:适用于高质量打印、印刷和出版,例如印刷品、高质量照片、艺术品等。
     */
    private int dpi;

    public PdfToImageConverter(String pdfFilePath, int dpi) {
        this.pdfFilePath = pdfFilePath;
        this.dpi = dpi;
    }

    public void convertToImage(String outputImageFolder) throws IOException {
        PDDocument document = null;
        try {
            // 加载 PDF 文件
            document = PDDocument.load(new File(pdfFilePath));

            // 初始化 PDF 渲染器
            PDFRenderer pdfRenderer = new PDFRenderer(document);

            // 逐页将 PDF 文件渲染成图片,并保存到指定目录中
            for (int i = 0; i < document.getNumberOfPages(); i++) {
            //for (int i = 0; i < 1; i++) {
                BufferedImage image = pdfRenderer.renderImageWithDPI(i, dpi);
                String imagePath = outputImageFolder + File.separator + "page" + (i + 1) + ".png";
                ImageIO.write(image, "png", new File(imagePath));
            }
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }

    public int getPageCount() throws IOException {
        PDDocument document = null;
        try {
            document = PDDocument.load(new File(pdfFilePath));
            return document.getNumberOfPages();
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }
}

以下是关于Tesseract的常用网址

下载地址:https://digi.bib.uni-mannheim.de/tesseract/

官方网站:https://github.com/tesseract-ocr/tesseract

官方文档:https://github.com/tesseract-ocr/tessdoc

语言包地址:https://github.com/tesseract-ocr/tessdata

注意事项:

1.尽量不要下载dev(开发中的版本),alpha(内部测试版,一般不向外部发布,会有很多Bug),beta(公测版本,即针对所有用户公开的测试版本)等版本。

2.建议下载最新稳定版本:

tesseract-ocr-w64-setup-v5.0.0.20190623.exe 2019-06-23 11:30 38M

3.


注意




安装好后,先用命令行测试是否可以把单独的图片转成文字,如果可以再跑代码


安装好中文简体语言包


chi_sim.traineddata

tesseract image_file.png output_file.txt  -l chi_sim --psm 6
//其中 -l chi_sim 指定识别中文,--psm 6 指定页面分割模式为单独的一个文本行。

其他的请参考这个:

Tesseract-OCR 下载安装和使用_tesseract-ocr下载_半濠春水的博客-CSDN博客



版权声明:本文为liuruiaaa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。