PDF поток, чтобы преуспеть - PullRequest
       18

PDF поток, чтобы преуспеть

0 голосов
/ 21 сентября 2011

У меня есть PDF с таблицами в нем. Основная цель состоит в том, чтобы подобная структура таблицы была отражена в ExcelSheet.

Чтение потока PDF с помощью iTextSharp или PDFSharp Я мог получить простой текст с потерей структуры таблицы, как в обычном тексте, поток, который ранее имел значения координат для текстовых элементов, удаляется.

Как я могу иметь дело с потоком, используя координаты, чтобы поместить мои текстовые значения в точные позиции в Excel

Ответы [ 2 ]

0 голосов
/ 26 апреля 2012

Чтобы добиться того же самого вначале, PDF читался с помощью iTextSharp (также пробовал с PDFCLown).Отдельные куски с их координатами были извлечены из PDF.Поскольку PDF следовал аналогичному шаблону, который представлял собой файл Invoice, логически данные были получены соответствующим образом, а затем с помощью NPOI был получен формат Excel.

0 голосов
/ 21 сентября 2011

У меня была такая же проблема при импорте табличных частей PDF в Excel. Я сделал следующее:

  • открыть PDF вручную, выбрать все и скопировать
  • вручную изменить на Excel
  • запустить VBA, которая читает буфер обмена, анализирует данные и записывает на лист

Проблема здесь заключалась в том, что данные в буфере расположены не горизонтально - как вы ожидаете - но вертикально. Поэтому мне пришлось разработать некоторый код вокруг этого. Я использовал модуль класса для реализации таких функций, как «следующее слово», «следующая строка», «поиск слова» и т. Д.

Я рад поделиться этим кодом, если он поможет.

EDIT:

Я использую 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
...