java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。
-
Apache PDFBox:这是一个开源的 PDF 库,可以用来提取 PDF 文件中的文本内容。
-
iText:这是一个用于创建和处理 PDF 文件的库,可以用来提取 PDF 文件中的文本内容。
-
Tesseract OCR:这是一个开源的 OCR 引擎,可以用来识别图片中的文本。可以使用 Java Tesseract API 将 Tesseract 集成到 Java 项目中。
-
ABBYY FineReader:这是一个商业 OCR 软件,可以识别多种文件格式中的文本内容,包括 PDF 和图片格式。可以使用 Java API 将 ABBYY FineReader 集成到 Java 项目中。
对于图片文档不好转的情况,可以尝试以下方法:
-
尝试使用更高分辨率的图片。更高的分辨率可以提高 OCR 引擎的识别精度。
-
尝试使用更清晰的图片。使用更清晰的图片可以减少识别错误。
-
尝试手动调整图片的亮度和对比度,以便更好地展示图片中的文本。
-
尝试使用更高级的 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博客