0

テーブルを含むPDFを持っています。主な目的は、同様のテーブル構造を ExcelSheet に反映させることです。

iTextSharp または PDFSharp を使用して PDF ストリームを読み取ると、テキスト要素の座標値を以前に持っていたストリームが削除されているプレーン テキストのように、テーブルの構造を失うことでプレーン テキストを取得できました。

座標を使用してストリームを処理し、テキスト値を Excel の正確な位置に配置するにはどうすればよいですか

4

2 に答える 2

0

PDF の表形式の部分を Excel にインポートするという同じ問題がありました。私は次の方法で行いました:

  • 手動で PDF を開き、すべてを選択してコピーする
  • 手動で Excel に変更
  • クリップボードを読み取り、データを解析してシートに書き出す VBA を開始する

ここでの問題は、バッファー内のデータが水平方向 (ご想像のとおり) ではなく、垂直方向に配置されていることです。そのため、これに関するコードも開発する必要がありました。クラスモジュールを使用して、「次の単語」、「次の行」、「単語を検索」などの機能を実装しました。

このコードが役に立ったら喜んで共有します。

編集:

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
于 2011-09-21T07:33:02.113 に答える
0

最初に同じことを達成するために、iTextSharp を使用して PDF を読み取りました (PDFCLown でも試しました)。座標を持つ個々のチャンクは PDF から取得されました。PDF は請求書ファイルと同様のパターンに従っていたため、論理的にはそれに応じてデータが取得され、NPOIの助けを借りて結果の Excel 形式が実現されました。

于 2012-04-26T13:20:49.197 に答える