テーブルを含むPDFを持っています。主な目的は、同様のテーブル構造を ExcelSheet に反映させることです。
iTextSharp または PDFSharp を使用して PDF ストリームを読み取ると、テキスト要素の座標値を以前に持っていたストリームが削除されているプレーン テキストのように、テーブルの構造を失うことでプレーン テキストを取得できました。
座標を使用してストリームを処理し、テキスト値を Excel の正確な位置に配置するにはどうすればよいですか
テーブルを含むPDFを持っています。主な目的は、同様のテーブル構造を ExcelSheet に反映させることです。
iTextSharp または PDFSharp を使用して PDF ストリームを読み取ると、テキスト要素の座標値を以前に持っていたストリームが削除されているプレーン テキストのように、テーブルの構造を失うことでプレーン テキストを取得できました。
座標を使用してストリームを処理し、テキスト値を Excel の正確な位置に配置するにはどうすればよいですか
PDF の表形式の部分を Excel にインポートするという同じ問題がありました。私は次の方法で行いました:
ここでの問題は、バッファー内のデータが水平方向 (ご想像のとおり) ではなく、垂直方向に配置されていることです。そのため、これに関するコードも開発する必要がありました。クラスモジュールを使用して、「次の単語」、「次の行」、「単語を検索」などの機能を実装しました。
このコードが役に立ったら喜んで共有します。
編集:
a を使用しMSForms.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 形式が実現されました。