C#使用Tabula插件解析PDF

使用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;
        }


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值