0

我有一个带有表格的 PDF。主要目标是在 ExcelSheet 中反映类似的表结构。

使用 iTextSharp 或 PDFSharp 读取 PDF 流我可以获得纯文本,因为在纯文本中,以前具有文本元素坐标值的流正在被剥离。

如何使用坐标处理流以将我的文本值放置在 excel 中的确切位置

4

2 回答 2

0

我在将 PDF 的表格部分导入 Excel 时遇到了同样的问题。我做了以下方式:

  • 手动打开PDF,全选并复制
  • 手动更改为 Excel
  • 启动一个 VBA,它读取剪贴板、解析数据并写入工作表

这里的问题是缓冲区中的数据不是水平排列 - 正如您所期望的那样 - 而是垂直排列。所以我也不得不围绕这个开发一些代码。我使用了一个类模块来实现诸如“下一个单词”、“下一行”、“搜索单词”等功能。

如果有帮助,我很乐意分享此代码。

编辑:

我利用 aMSForms.DataObject来阅读剪贴板。创建对 Microsoft Forms 2.0 对象库 (...\system32\FM20.DLL) 的引用后,创建一个名为的新类模块ClipClass并将以下代码放入:

Public P As Integer                   ' line pointer
Public T As String                    ' total text buffer
Public L As String                    ' current line

Public Property Get FirstLine() As String
    P = 1
    FirstLine = NextLine()
End Property

Public Property Get NextLine() As String
    L = ""
    Do Until Mid(T, P, 2) = vbCrLf
        L = L & Mid(T, P, 1)
        P = P + 1
    Loop
    NextLine = L
    P = P + 2
End Property

Public Property Get FindLine(Arg As String) As String
Dim Tmp As String

    Tmp = FirstLine()
    
    Do Until Tmp = Arg
        Tmp = NextLine()
    Loop
    FindLine = Tmp
End Property

Private Sub Class_Initialize()
Dim Buf As MSForms.DataObject
    
    Set Buf = New MSForms.DataObject   ' this object interfaces with the clipboard
    Buf.GetFromClipboard               ' copy Clipboard to Object
    T = Buf.GetText                    ' copy text from Object to string var
    L = ""
    P = 1
    Set Buf = Nothing                  ' clean up

End Sub

这为您提供了查找字符串和读出行所需的所有功能。现在有趣的部分....在我的情况下,我在 PDF 中有一个常量字符串,它始终位于第一个表格单元格上方 3 行;并且所有表格单元格在文本缓冲区中按列排列。这是由 Excel 工作表上的按钮调用的解析器

Sub Parse()
Dim C As ClipClass, Tmp As String, WS As Range
Dim WSRow As Integer, WSCol As Integer

    ' initialize
    Set WS = Worksheets("Table").[A1]
    Set C = New ClipClass                  ' this creates the class instance and implicitely
                                           ' fires its Initialize() code which grabs the Clipboard
    
    ' get to head of table
    Tmp = C.FindLine("identifying string before table starts")
    ' advance to one line before first table field - each field is terminated by CRLF
    Tmp = C.NextLine
    Tmp = C.NextLine

    ' PDF table is 3 col's x 7 rows organized col by col
    For WSCol = 1 To 3
        For WSRow = 1 To 7
            WS(WSRow, WSCol) = C.NextLine
        Next WSRow
    Next WSCol
End Sub
于 2011-09-21T07:33:02.113 回答
0

为了达到同样的效果,首先使用 iTextSharp 读取 PDF(也尝试使用 PDFCLown)。从 PDF 中获取各个块及其坐标。由于 PDF 遵循类似的模式,即发票文件,因此在逻辑上相应地获取数据,然后在NPOI的帮助下实现了生成的 excel 格式。

于 2012-04-26T13:20:49.197 回答