我有一个带有表格的 PDF。主要目标是在 ExcelSheet 中反映类似的表结构。
使用 iTextSharp 或 PDFSharp 读取 PDF 流我可以获得纯文本,因为在纯文本中,以前具有文本元素坐标值的流正在被剥离。
如何使用坐标处理流以将我的文本值放置在 excel 中的确切位置
我有一个带有表格的 PDF。主要目标是在 ExcelSheet 中反映类似的表结构。
使用 iTextSharp 或 PDFSharp 读取 PDF 流我可以获得纯文本,因为在纯文本中,以前具有文本元素坐标值的流正在被剥离。
如何使用坐标处理流以将我的文本值放置在 excel 中的确切位置
我在将 PDF 的表格部分导入 Excel 时遇到了同样的问题。我做了以下方式:
这里的问题是缓冲区中的数据不是水平排列 - 正如您所期望的那样 - 而是垂直排列。所以我也不得不围绕这个开发一些代码。我使用了一个类模块来实现诸如“下一个单词”、“下一行”、“搜索单词”等功能。
如果有帮助,我很乐意分享此代码。
编辑:
我利用 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
为了达到同样的效果,首先使用 iTextSharp 读取 PDF(也尝试使用 PDFCLown)。从 PDF 中获取各个块及其坐标。由于 PDF 遵循类似的模式,即发票文件,因此在逻辑上相应地获取数据,然后在NPOI的帮助下实现了生成的 excel 格式。