使用Visual Studio添加依赖项:Tabula,版本:0.1.0
我做的PDF文件是这样的:

具体代码如下:
using Microsoft.AspNetCore.Mvc;
using System.Data;
// 导入以下包
using UglyToad.PdfPig;
using Tabula;
using Tabula.Extractors;
using UglyToad.PdfPig.Content;
namespace WebApplication1.Controllers
{
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
public static void Main()
{
ExtractTables("pdfPath", 1, 10);
}
/// <summary>
/// 处理OrderNo和OrderDate
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
public static List<string> GetOrderInfo(Page page)
{
List<string> info = new();
int count = 0;
foreach (Word word in page.GetWords()) {
if (count > 2) break;
if (count > 0) {
info.Add(word.Text);
}
count++;
}
return info;
}
/// <summary>
/// 提取表格的方法
/// </summary>
/// <param name="pdfPath"></param>
/// <param name="startNumber"></param>
/// <param name="endNumber"></param>
/// <returns></returns>
private static List<DataTable> ExtractTables(string pdfPath, int startNumber, int endNumber)
{
try {
using (UglyToad.PdfPig.PdfDocument document = UglyToad.PdfPig.PdfDocument.Open(pdfPath, new ParsingOptions() { ClipPaths = true })) {
ObjectExtractor oe = new ObjectExtractor(document);
IExtractionAlgorithm ea = new SpreadsheetExtractionAlgorithm();
var pagesNumber = document.NumberOfPages;
if (endNumber > pagesNumber) {
endNumber = pagesNumber;
}
if (startNumber > pagesNumber || endNumber > pagesNumber) {
throw new IndexOutOfRangeException("页码超出范围!");
}
List<DataTable> dtList = new List<DataTable>();
List<string> orderInfo = new();
// 提取 orderInfo 并存储在一个 DataTable 中
DataTable orderInfoTable = new DataTable("OrderInfo");
orderInfoTable.Columns.Add("Info", typeof(string));
for (int i = startNumber; i <= endNumber; i++) {
Page page1 = oe.ExtractPage(1).PdfPage;
orderInfo = GetOrderInfo(page1);
// 将 orderInfo 插入到 DataTable 中
if (i == startNumber) { // 确保只在第一次提取时插入 orderInfo
foreach (var info in orderInfo) {
DataRow dr = orderInfoTable.NewRow();
dr["Info"] = info;
orderInfoTable.Rows.Add(dr);
}
dtList.Add(orderInfoTable); // 添加到列表的第一个位置
}
PageArea page = oe.Extract(i);
List<Tabula.Table> tables = (List<Tabula.Table>)ea.Extract(page);
foreach (Tabula.Table tb in tables) {
DataTable dt = new DataTable();
var columnCount = tb.ColumnCount;
for (int b = 0; b < columnCount; b++) {
dt.Columns.Add(b.ToString(), typeof(string));
}
var rows = tb.Rows;
foreach (IReadOnlyList<Tabula.Cell> row in tb.Rows) {
DataRow dr = dt.NewRow();
for (int c = 0; c < columnCount; c++) {
dr[c] = row[c].GetText().Replace("\r", "");
}
dt.Rows.Add(dr);
}
dtList.Add(dt);
}
}
return dtList;
}
}
catch (Exception ex) {
throw ex;
}
}
/// <summary>
/// 处理DataTable数据,并插入表中
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private bool ProcessDataAsync(List<DataTable> dtList)
{
bool result = false;
try {
string orderNo = dtList[0].Rows[0][0].ToString();
string orderDate = dtList[0].Rows[1][0].ToString();
// 遍历 List<DataTable>
for (int i = 1; i < dtList.Count; i++) {
DataTable dt = dtList[i];
for (int j = 0; j < dt.Rows.Count; j++) {
if (dt.Rows[j][0].ToString().Equals("#")) {
continue;
}
// 以下是具体的业务处理,解析DataTable中的内容
// ...
}
}
}
catch (Exception ex) {
return result;
}
result = true;
return result;
}
}
}


1977

被折叠的 条评论
为什么被折叠?



