Извлечь данные из pdf в excel vba
Онлайн-конвертер позволяет преобразовать PDF-файл в таблицу Excel. Вы можете конвертировать PDF в XLS и XLSX или создать электронную таблицу из PDF-документа — это просто!
× Предупреждение: Превышено максимальное число файлов для этой функции! × Предупреждение: Произошла ошибка. Повторите попытку позже! × Предупреждение: Добавьте ещё один или несколько файлов! × Предупреждение: Дождитесь завершения загрузки всех файлов! × Предупреждение: Используйте кнопку «Установить пароль» для отправки пароля. × Предупреждение: Неверный пароль, повторите попытку! × Предупреждение: Введите пароль полностью. Поле «Пароль» не может быть пустым. × Предупреждение: Вы ввели верный пароль, но он не снимает ограничение на редактирование файла. Введите пароль с соответствующими правами доступа. × Предупреждение: Данная операция не применима к архиву!Как преобразовать PDF в Excel?
- Загрузите PDF-файл.
- Выберите Excel 2007-2013 (*.xlsx) или Excel 2003 или старше (*.xls) из выпадающего меню.
- Используйте дополнительные настройки, чтобы добиться оптимального результата сжатия.
- Нажмите «Начать».
Оставайтесь на связи:
Преобразуйте PDF в Excel онлайн
бесплатно в любом месте
Универсальный конвертер PDF в Excel
Всё просто. Загрузите PDF-документ с жёсткого диска / из облачного хранилища или перетащите в поле загрузки.
Загрузите PDF-файл и выберите формат электронной таблицы Microsoft Excel из выпадающего меню. Доступно два варианта: XLS и XLSX.
Затем нажмите «Начать», а PDF-конвертер позаботится об остальном.
Онлайн-конвертер PDF в Excel
Никаких вирусов и вредоносных программ. Просто скачайте готовую таблицу Excel.
Зачем конвертировать PDF в Excel?
Формат PDF универсален, но его сложно редактировать. Если вам надо извлечь и отредактировать таблицу, преобразуйте PDF в формат Excel.
Оптическое распознавание символов (OCR) позволяет редактировать даже отсканированные книги. Не тратьте время, чтобы скопировать текст вручную, мы обо всём позаботимся!
Безопасный конвертер PDF в Excel
Преобразуйте PDF-документ в Microsoft Excel на сайте PDF2Go и не беспокойтесь о безопасности файла.
SSL-шифрование, регулярная очистка сервера, безопасность загрузки и скачивания файлов. Все права на документы остаются за вами.
Для получения дополнительной информации ознакомьтесь с Политикой конфиденциальности.
В какой формат можно преобразовать?
С помощью PDF-конвертера вы можете преобразовать PDF в Excel, в частности, Microsoft XLS и XLSX. Преобразовать PDF-файл в другие форматы тоже можно!
Например:
Мобильный конвертер PDF-файлов
Конвертируйте PDF-файлы на компьютере, смартфоне или планшете!
PDF2Go работает везде — в поезде и в автобусе, дома и в офисе. Хотите преобразовать PDF в Excel? Просто подключитесь к интернету!
Оцените инструмент 4.3 / 5
Чтобы оставить отзыв, преобразуйте и скачайте хотя бы один файл
Извлечение таблиц из pdf (в excel), прив. w/vba
Я пытаюсь извлечь таблицы из pdf файлов с помощью vba и экспортировать их в excel. Если все работает так, как должно, оно должно идти автоматически. Проблема в том, что таблица не стандартизирована.
Это то, что у меня есть до сих пор.
- VBA (Excel) запускает XPDF и преобразует все .pdf файлы, найденные в текущей папке, в текстовый файл.
- VBA (Excel) читает каждый текстовый файл по строкам.
With New Scripting.FileSystemObject
With .OpenTextFile(strFileName, 1, False, 0)
If Not .AtEndOfStream Then .SkipLine
Do Until .AtEndOfStream
Все это прекрасно работает. Но теперь я сталкиваюсь с проблемой извлечения таблиц из текстовых файлов.То, что я пытаюсь сделать, это VBA, чтобы найти строку, например. "Year Income", а затем вывести данные после него в столбцы. (Пока таблица не закончится.)
Первая часть не очень сложна (найдите определенную строку), но как бы я обошел вторую часть. Текстовый файл будет выглядеть как этот Pastebin . Проблема в том, что текст не стандартизирован. Таким образом, например, некоторые таблицы имеют 3-летние столбцы (2010 2011 2012), а некоторые только две (или 1), некоторые таблицы имеют больше пробелов между столбцом, а некоторые не включают определенные строки (такие как Capital Asset, net).
Я думал о том, чтобы делать что-то подобное, но не уверен, как это сделать в VBA.
- Найти строку, определенную пользователем. например. "Таблица 1: Возврат лет".
- а. Следующая строка найти годы; если есть два, нам понадобятся три столбца на выходе (заголовки +, 2x год), если их три, нам понадобятся четыре (титры +, 3 раза в год).. и т.д.
б. Создайте столбец столбца + столбец за каждый год. - При достижении конца строки перейдите к следующей строке
- а. Читать текст → вывод в столбец 1.
б. Распознавать пробелы (пробелы > 3?) Как начало столбца 2. Чтение чисел → вывод в столбец 2.
с. (если столбец = 3) Признать пробелы как начало столбца 3. Чтение чисел → вывод в столбец 3.
д. (если столбец = 4) Распознавать пробелы как начало столбца 4. Считать числа → вывод в столбец 4. - Каждая строка, цикл 4.
- Следующая строка не включает числа - Конечная таблица. (возможно, easiet только пользовательский номер, после 15 символов нет номера конечной таблицы)
Я основывал свою первую версию на Pdf, чтобы преуспеть , но чтение онлайн-людей не рекомендуется OpenFile , а скорее FileSystemObject (хотя это, кажется, намного медленнее).
Любые указатели, чтобы начать меня, главным образом на шаге 2?
У вас есть несколько способов проанализировать текстовый файл и в зависимости от того, насколько сложно это может привести к тому, что вы опираетесь так или иначе. Я начал это, и он немного вышел из рук. наслаждайтесь.
На основе предоставленного вами примера и дополнительных комментариев я отметил следующее. Некоторые из них могут хорошо работать для простых файлов, но могут стать неудобными с более сложными файлами. Кроме того, могут быть несколько более эффективные методы или трюки к тому, что я использовал здесь, но это, безусловно, поможет вам достичь желаемого результата. Надеюсь, это имеет смысл в сочетании с предоставленным кодом:
- Вы можете использовать логические значения, чтобы помочь вам определить, какой "раздел" текстового файла вы находитесь. Т.е. используйте InStr в текущей строке, чтобыопределите, что вы находитесь в таблице, ища текст "Таблица", а затемкак только вы знаете, что находитесь в разделе "Таблица" начала файлаищет раздел "Активы" и т.д.
- Вы можете использовать несколько методов для определения количества лет (или столбцов), которое у вас есть. Функция Split вместе с циклом будетработа.
- Если ваши файлы всегда имеют постоянное форматирование, даже в определенных частях, вы можете воспользоваться этим. Например, если вы знаетестрока файла всегда будет иметь знак доллара перед ними, затемвы знаете, что это определит ширину столбцов, и вы можете использовать это напоследующие строки текста.
Следующий код будет извлекать детали активов из текстового файла, вы можете модифицировать его для извлечения других разделов. Он должен обрабатывать несколько строк. Надеюсь, я прокомментировал это достаточно. Посмотрите, и я отредактирую, если вам нужно помочь.
Dim fs As Scripting.FileSystemObject, fsFile As Scripting.TextStream
Dim sFileName As String, sLine As String, vYears As Variant
Dim iNoColumns As Integer, ii As Integer, iCount As Integer
Dim bIsTable As Boolean, bIsAssets As Boolean, bIsLiabilities As Boolean, bIsNetAssets As Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
Set fsFile = fs.OpenTextFile(sFileName, 1, False)
'Loop through the file as you've already done
Do While fsFile.AtEndOfStream <> True
'Determine flag positions in text file
' Always skip empty lines (including single spaceS)
If VBA.Len(sLine) > 1 Then
'We've found a new table so we can reset the booleans
If VBA.InStr(1, sLine, "Table") > 0 Then
'Perhaps you want to also have some sort of way to designate that a table has finished. Like so
If VBA.Instr(1, sLine, "Some text that designates the end of the table") Then
' If we're in the table section then we want to read in the data
If bIsTable Then
' Check for your different sections. You could make this constant if your text file allowed it.
If VBA.InStr(1, sLine, "Assets") > 0 And VBA.InStr(1, sLine, "Net") = 0 Then bIsAssets = True: bIsLiabilities = False: bIsNetAssets = False
If VBA.InStr(1, sLine, "Liabilities") > 0 Then bIsAssets = False: bIsLiabilities = True: bIsNetAssets = False
If VBA.InStr(1, sLine, "Net Assests") > 0 Then bIsAssets = True: bIsLiabilities = False: bIsNetAssets = True
'If we haven't triggered any of these booleans then we're at the column headings
If Not bIsAssets And Not bIsLiabilities And Not bIsNetAssets And VBA.InStr(1, sLine, "Table") = 0 Then
' Trim the current line to remove leading and trailing spaces then use the split function to determine the number of years
For ii = LBound(vYears) To UBound(vYears)
If VBA.Len(vYears(ii)) > 0 Then iNoColumns = iNoColumns + 1
'Now we can redefine some variables to hold the information (you'll want to redim after you've collected the info)
ReDim sAssets(1 To iNoColumns + 1, 1 To 100) As String
ReDim iColumns(1 To iNoColumns) As Integer
If bIsAssets Then
' Skip the heading line
If Not VBA.Trim$(sLine) = "Assets" Then
'Increment the counter
iCount = iCount + 1
' If iCount reaches it limit you'll have to redim preseve you sAssets array (I'll leave this to you)
If iCount > 99 Then
'You'll find other posts on stackoverflow to do this
'This will happen on the first row, it'll happen everytime you
'hit a $ sign but you could code to only do so the first time
If VBA.InStr(1, sLine, "$") > 0 Then
iColumns(1) = VBA.InStr(1, sLine, "$")
For ii = 2 To iNoColumns
' We need to start at the next character across
iColumns (ii) = VBA.InStr(iColumns(ii - 1) + 1, sLine, "$")
'The first part (the name) is simply up to the $ sign (trimmed of spaces)
sAssets(1, iCount) = VBA.Trim$(VBA.Mid$(sLine, 1, iColumns(1) - 1))
For ii = 2 To iNoColumns
' Then we can loop around for the rest
sAssets (ii, iCount) = VBA.Trim$(VBA.Mid$(sLine, iColumns(ii) + 1, iColumns(ii) - iColumns(ii - 1)))
'Now do the last column
If VBA.Len(sLine) > iColumns(iNoColumns) Then
sAssets(iNoColumns + 1, iCount) = VBA.Trim$(VBA.Right$(sLine, VBA.Len(sLine) - iColumns(iNoColumns)))
' Reset the counter
Set fsFile = Nothing
Set fs = Nothing
Я не могу проверить образцы данных, поскольку PasteBin был удален. Основываясь на том, что я могу почерпнуть из описания проблемы, мне кажется, что использование регулярных выражений упростит анализ данных.
Добавьте ссылку на скрипт Runtime scrrun.dll для FileSystemObject.
Добавьте ссылку на регулярные выражения Microsoft VBScript 5.5. библиотека для объекта RegExp.
Создайте экземпляр объекта RegEx с помощью Dim objRE As New RegExp
Задайте для свойства Pattern значение "(\ bd \b) " Вышеупомянутый шаблон должен соответствовать строкам, содержащим строки, такие как:20102010 20112010 2011 2012
Число пробелов между строками года не имеет значения, если существует хотя бы один (поскольку мы не ожидаем, что будем сталкиваться с такими строками, как 201020112012)
Установите для свойства Global значение True
Захваченные группы будут найдены в отдельных объектах Match из MatchCollection, возвращенных методом Execute объекта OBRERE объекта RegEx. Поэтому объявите соответствующие объекты:
Dim objMatches as MatchCollection
Dim objMatch as Match
Dim intMatchCount 'tells you how many year strings were found, if any
Предполагая, что вы создали объект FileSystemObject и просматриваете текстовый файл, считывая каждую строку в переменной strLine
Первый тест, чтобы увидеть, содержит ли текущая строка искомый шаблон:
If objRE.Test(strLine) Then
' skip over this line
Set objMatches = objRe.Execute(strLine)
For i = 0 To intMatchCount - 1
'processing code such as writing the years as column headings in Excel
Set objMatch = objMatches(i)
e.g. ActiveCell.Value = objMatch.Value
' subsequent lines beneath the line containing the year strings should
'have the amounts, which may be captured in a similar fashion using an
' additional RegExp object and a Pattern such as "(\b\d+\b)" for
'whole numbers or "(\b\d+\.\d+\b)" for floats. For currency, you
Это всего лишь приблизительная схема того, как я подхожу к этой проблеме. Я надеюсь, что в этом коде есть что-то, что поможет вам.
Предположим у нас есть набор из 30-страничных pdf-документов, каждый из которых содержит в себе различные листы, подписанные клиентом, при оформлении кредита или любого другого продукта. И лишь один лист содержит информацию (ФИО, паспортные данные, мобильный телефон и др.), которую необходимо извлечь. С помощью пары библиотек в Python, возможно реализовать алгоритм, который будет искать информативный лист и извлекать из него необходимую информацию. В качестве примера, для реализации алгоритма будет использоваться следующая страница из pdf-файла, которая содержит в себе таблицу с заголовком «Анкета участника конференции»:
Как и всегда реализация алгоритма начинается с импорта необходимых библиотек:
Библиотека fitz и PIL помогут в загрузке pdf-файлов и последующем разбиении на отдельные страницы. На библиотеку pytesseract возлагается основная задача, именно она будет просматривать каждую страницу и находить необходимую информацию.
Для того чтобы загрузить pdf-файл и разбить его на отдельные страницы воспользуемся функцией get_page_from_pdf:
На вход функции (path_to_pdf) нам нужно указать расположение pdf-файла, который мы хотим обработать, для этого создадим переменную, с указанием пути:
После вызова функции мы получим массив, который состоит из отдельных страниц обрабатываемого файла, массив обозначим переменной list_image:
Если бы все документы содержали одинаковую структуру (последовательность листов в документе), нам осталось бы указать номер страницы в документе и получить необходимую информацию. Однако, в большинстве случаев, это не так и нам приходиться просматривать страницу за страницей, пока не найдем нужную. С помощью функции find_target_page будем осуществлять поиск необходимой страницы:
Как правило, каждая страница содержит заголовок, который характеризует к какому из пунктов относится страница, в данном примере: «Анкета участника конференции». В первый параметр (image) – указываем страницу из list_image, второй параметр (search_header) – содержит название заголовка, по которому будет осуществляться поиск необходимой страницы.
Далее реализуем функцию, которая извлечет необходимую информацию:
Раннее, в переменную list_image постранично загрузили файл «Example.pdf». Осталось объединить реализованные функции, и обработать файл:
В цикле осуществляем поиск страницы, на наличие искомого заголовка с помощью функции find_target_page. Как только страница будет найдена, текст с этой страницы передаем на функцию get_info. Для начала найдем ФИО, для этого в параметр search_object передадим слово «фамилия», по которому алгоритм определит расположение искомого значения. Повторим процедуру, но уже для нахождения «контактный телефон». По завершении обработки, должен появиться следующий результат.
Резюме: для загрузки pdf-файла вам понадобится функция get_page_from_pdf. Если необходимо загрузить изображения (сканы документов), в этом поможет библиотека PIL, в интернете можно найти множество примеров, как это сделать. Для извлечения текста из картинки потребуется всего одна строчка кода:
Остальное – творческий процесс, ограниченный только вашими потребностями.
PDF формат очень распространен на просторах Интернет, зачастую у пользователя возникает необходимость перенести табличные данные из PDF в Excel. C 2013-й версии пакета MS Office Word научился открывать PDF файлы, а вот Excel напрямую работать с PDF до сих пор не умеет. Существует несколько способов, кроме банального перепечатывания данных, провести подобную операцию.
Прежде чем приступить к рассмотрению непосредственно переноса табличных данных из PDF в Excel, следует отметить, что рассмотренные рекомендации не относятся к PDF файлам, которые содержат нераспознанный текст в виде картинок (как правило, сканированные электронные аналоги печатных изданий).
Первый способ
Заключается в банальном выделении таблицы в PDF файле и копировании ее на лист Excel. Недостатком такого способа будет то, что данные скопируются в один столбец и придется их потом упорядочить по ячейкам.
Для приведенного выше примера, кроме ручного способа есть еще вариант, воспользоваться построением простой формулы для преобразования вертикального диапазона в таблицу. Таблицу будет достаточно легко преобразовать, т.к. она не имеет составных заголовков и строк, а также все ее ячейки заполнены данными, но что делать, если нужно преобразовать, например, такую таблицу.
Если бы проблема стояла только в преобразовании заголовка, можно было бы обойтись двумя формулами для преобразования вертикального диапазона или заголовок уже просто транспонировать вручную, но в самой таблице есть множество незаполненных ячеек и они при переносе игнорируются, другими словами, предугадать заранее количество столбцов не получится. Эту проблему решает второй способ.
Второй способ
В начале материала мы упомянули, что, хоть и Excel не умеет работать с PDF на прямую, но Word то умеет это делать, причем для этого даже не обязательно открывать pdf файл в Word 2013 и выше, достаточно скопировать таблицу, как и в первом способе, и вставить с сохранением форматирования, либо применением форматирования документа Word.
Способ хороший, но и он не лишен недостатков, к сожалению, вторую, более сложную таблицу удалось скопировать только после того, как pdf файл был открыт в самом текстовом процессоре MS Word (2016й версии), до этого, через буфер обмена, удавалось скопировать только строку заголовков. Так что, если через буфер обмена скопировать таблицу не получается, то можно попробовать открыть таблицу в Word, а потом скопировать ее в Excel.
Читайте также: