PDF如何实现按行读取
https://res.ygyg.cn/userbusipub/M00/14/AC/CicmImJ7DcmAfB6vAAQLhfInluc603.pdf
这是PDF链接,试过aliyun的ocr识别,但是ocr好像不能精确定位到哪一行
import com.spire.pdf.*;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class ExtractTable {
public static void main(String[] args)throws IOException {
//加载PDF文档
PdfDocument pdf = new PdfDocument();
//pdf.loadFromFile("test.pdf");
URL url = new URL("https://res.ygyg.cn/userbusipub/M00/14/AC/CicmImJ7DcmAfB6vAAQLhfInluc603.pdf");
//打开链接
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
pdf.loadFromStream(inStream);
//创建StringBuilder类的实例
StringBuilder builder = new StringBuilder();
//抽取表格
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
PdfTable[] tableLists ;
for (int page = 0; page < pdf.getPages().getCount(); page++)
{
tableLists = extractor.extractTable(page);
if (tableLists != null && tableLists.length > 0)
{
for (PdfTable table : tableLists)
{
int row = table.getRowCount();
int column = table.getColumnCount();
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
String text = table.getText(i, j);
builder.append(text+" ");
}
builder.append("\r\n");
}
}
}
}
//控制台输出
System.out.println(builder.toString());
//将提取的表格内容写入txt文档
FileWriter fileWriter = new FileWriter("ExtractedTable.txt");
fileWriter.write(builder.toString());
fileWriter.flush();
fileWriter.close();
}
}
看你的测试pdf是表格内容,使用pef转表格可以完整的转换出来,那么按照你的需求按行读取,思路为,将pad内的表格内容读取出来,
遍历表格内容,如果将其转存可以存为excel
下面是示例代码
我屏蔽的事转excel部分,有帮助点一下采纳哦,有问题可以继续讨论
import pdfplumber
import xlwt
# 定义保存Excel的位置
# workbook = xlwt.Workbook() #定义workbook
# sheet = workbook.add_sheet('Sheet1') #添加sheet
# i = 0 # Excel起始位置
# path = input("请输入PDF文件位置:")
path = "CicmImJ7DcmAfB6vAAQLhfInluc603.pdf" # 导入PDF路径
pdf = pdfplumber.open(path)
print('\n')
print('开始读取数据')
print('\n')
for page in pdf.pages:
# 获取当前页面的全部文本信息,包括表格中的文字
# print(page.extract_text())
for table in page.extract_tables():
# print(table)
# 按行遍历pdf表格
for row in table:
# 打印数据
print(row)
# # 写入excel
# for j in range(len(row)):
# sheet.write(i, j, row[j])
# i += 1
print("读取完成")
print('---------- 分割线 ----------')
pdf.close()
# 保存Excel表
# workbook.save('PDFresult.xls')
# print('\n')
# print('写入excel成功')
# print('保存位置:')
# print('PDFresult.xls')
# print('\n')
# input('PDF取读完毕,按任意键退出')
貌似表格识别可以,但是你也是需要自己处理一下
这个不如转换成word来读取,如果要读取pdf的话,就需要研究一下pdf是怎样保存文本的(json数格式),
Free Spire.PDF for Java可以识别和读取PDF表格数据(官方文档:Java 提取 PDF 中的表格),读取出来结果基本跟表格一致,一行一行的
import com.spire.pdf.*;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractTable {
public static void main(String[] args)throws IOException {
//实例化PdfDocument类的对象
PdfDocument pdf = new PdfDocument();
//加载PDF文档
pdf.loadFromFile("test.pdf");
//创建StringBuilder类的实例
StringBuilder builder = new StringBuilder();
//创建PdfTableExtractor类的对象
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
//遍历每一页
for (int page = 0; page < pdf.getPages().getCount(); page++)
{
//提取页面中的表格存入PdfTable[]数组
PdfTable[] tableLists = extractor.extractTable(page);
if (tableLists != null && tableLists.length > 0)
{
//遍历表格
for (PdfTable table : tableLists)
{
int row = table.getRowCount();//获取表格行
int column = table.getColumnCount();//获取表格列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
//获取表格中的文本内容
String text = table.getText(i, j);
//将获取的text写入StringBuilder容器
builder.append(text+" ");
}
builder.append("\r\n");
}
}
}
}
//保存为txt文档
FileWriter fileWriter = new FileWriter("ExtractedTable.txt");
fileWriter.write(builder.toString());
fileWriter.flush();
fileWriter.close();
}
}
读取结果: