Вверх ↑
Этот топик читают: Гость
Ответов: 537
Рейтинг: 14
#46: 2024-01-05 00:36:31 ЛС | профиль | цитата
Gunta писал(а):
Если кто-то знает другой более лёгкий способ, прошу поделится.

Сделал на python

import camelot
import os

def main():
pdf_path = os.path.join("input", "2.pdf")
pdf = camelot.read_pdf(pdf_path, flavor="lattice", pages="all")
for table in pdf:
csv_file = os.path.join("output", f"{table.page}.csv")
table.to_csv(csv_file, sep='\t', index=False, encoding='utf-16-le')
print(f"Saved {csv_file}")

if __name__ == "__main__":
main()
Нужно установить библиотеки

camelot-py==0.11.0
cffi==1.16.0
chardet==5.2.0
charset-normalizer==3.3.2
click==8.1.7
cryptography==41.0.7
distro==1.9.0
et-xmlfile==1.1.0
ghostscript==0.7
JPype1==1.5.0
numpy==1.26.3
opencv-python==4.9.0.80
openpyxl==3.1.2
packaging==23.2
pandas==2.1.4
pdfminer.six==20231228
pycparser==2.21
pypdf==3.17.4
python-dateutil==2.8.2
python3-ghostscript==0.5.0
pytz==2023.3.post1
six==1.16.0
tzdata==2023.4

Вырезает таблицы без всяких заморочек и быстро. Для теств нужно создать папку input и поместить туда файл 2.pdf переименовать, создать папку output. Скомпилировать, файл main.exe перенести рядом с созданными папками
карма: 4

0
Ответов: 700
Рейтинг: 145
#47: 2024-01-05 18:25:17 ЛС | профиль | цитата
Sersey писал(а):
Сделал на python

Я тоже пробовал делать на python но столкнулся с некоторыми проблемами:
1.Результат не 100 %, иногда простую таблицу в упор не видит.
2.Приложения на python не так просто переносить с одного компьютера на другой.
3.При использовании модулей типа auto-py-to-exe начинает блокировать встроенный защитник windows и орать антивирус.
Вот простая схема на VBJScript. Извлекает таблицы из PDF.
Как можно убедиться, из трёх PDF только в Test1.pdf таблица определяется на 100%.
https://forum.hiasm.com/getfile/39654
Для работы схемы MS Office (Word) должен быть установлен на компьютере.
При появлении сообщения от Word поставьте галочку "Больше не показывать это сообщение" и нажмите "ОК".
Сообщение Word.png

Проверено на
- Windows 10 (x64)
- Hiasm v4.05 build 186 (delphi) rev - 2405
- MS Office 365

Редактировалось 1 раз(а), последний 2024-01-05 18:26:16
карма: 15

0
Ответов: 537
Рейтинг: 14
#48: 2024-01-09 14:13:01 ЛС | профиль | цитата
Есть еще вариант сделать через макрос Excel, попробую сделать и сюда выложу код. Или может у вас получится сделать макрос. Интересует автоматизация процесса, вырезать все таблицы и сохранить в файл.

Редактировалось 1 раз(а), последний 2024-01-09 14:16:00
карма: 4

0
Ответов: 700
Рейтинг: 145
#49: 2024-01-16 16:27:24 ЛС | профиль | цитата
Два одинаковых PDF, один обычный другой как изображение.
Как не покажется странным, но pdf-картинка лучше распознаётся чем обычный pdf.
Выложил на Яндекс диск из-за размера файлов документов.
https://disk.yandex.ru/d/cti31qEwulcnLQ

Проверено на
- Windows 10 (x64)
- Hiasm v4.05 build 186 (delphi) rev - 2405
- MS Office 365
карма: 15

0
Ответов: 700
Рейтинг: 145
#50: 2024-01-16 18:06:26 ЛС | профиль | цитата
Даже такие PDF распознаёт.
https://forum.hiasm.com/getfile/39657

Проверено на
- Windows 10 (x64)
- Hiasm v4.05 build 186 (delphi) rev - 2405
- MS Office 365
карма: 15

0
файлы: 1pdf to excel — 2.zip [204.3KB] [85]
Ответов: 537
Рейтинг: 14
#51: 2024-01-17 10:29:59 ЛС | профиль | цитата
Посмотрел ваш файл, у меня очень плохо распознает таблицы и не все.
Сделал программу на Python, очень хорошо распознает.
https://drive.google.com/file/d/11L_fv-ls5uBjm_sCll9X1kR6rdxlgdu9/view?usp=sharing
В архиве, программа, исходник и инструкция
карма: 4

0
Ответов: 700
Рейтинг: 145
#52: 2024-01-17 15:04:56 ЛС | профиль | цитата
Sersey писал(а):
Сделал программу на Python, очень хорошо распознает.
https://drive.google.com/file/d/11L_fv-ls5uBjm_sCll9X1kR6rdxlgdu9/view?usp=sharing
В архиве, программа, исходник и инструкция

Не удалось запустить ваш вариант распознавателя PDF. Всё время одна и таже ошибка.

Traceback (most recent call last):
File "main.py", line 30, in <module>
File "main.py", line 9, in extract_tables_from_pdf
File "camelot\io.py", line 113, in read_pdf
File "camelot\handlers.py", line 176, in parse
File "camelot\parsers\lattice.py", line 421, in extract_tables
File "camelot\backends\ghostscript_backend.py", line 31, in convert
OSError: Ghostscript is not installed. You can install it using the instructions here: https://camelot-py.readthedocs.io/en/master/user/install-deps.html
[11464] Failed to execute script 'main' due to unhandled exception!

Редактировалось 2 раз(а), последний 2024-01-17 15:36:02
карма: 15

0
Ответов: 537
Рейтинг: 14
#53: 2024-01-18 00:02:56 ЛС | профиль | цитата
Gunta писал(а):
Не удалось запустить ваш вариант распознавателя PDF

Так похоже в питоне не понимаете. Сначала нужно установить сам питон, потом библиотеки из файла requirements.txt командой pip install -r requirement.txt . Установка пакетов. А у тебя, там же написано, что нет пакетов.
Команда python main.py camelot lattice "тут путь к пдф" это пример
Программа скомпилирована, пробуйте, или stream вооще все видит и распознает
Как в консоли напишете, так и будет. Для распознания использовал библиотеку camelot, до этого много тестировал, эта лучшая известная мне.


P.S Даже на c# делал прогу и проверял как распознает, гавно, еше хуже чем vbs через World, кошмар. Разные библиотеки тоже пробовал. Бред

Редактировалось 2 раз(а), последний 2024-01-18 00:48:31
карма: 4

0
Ответов: 700
Рейтинг: 145
#54: 2024-01-18 13:29:46 ЛС | профиль | цитата
Sersey, Да в том то и дело что распознавать pdf нужно не мне, а бухгалтерии.
Невозможно им объяснить, как пользоваться python. То что им нужно это нажать на кнопку, выбрать папку с файлами и далее загрузить в свой 1С.
Я уже писал ранее, что на python не так легко создать exe-файл чтобы он работал на другом компьютере без танцев с бубном.
Удалил все три версии Pyton, что были установлены у меня на компьютере.
Установил по новой версию 3.11. Установил все модули и зависимости и вот результат.

Команда - Команда " main.py" camelot lattice ".\PDF to Excel\readable_pdf.pdf"
Заканчивается ощибкой (ошибка в предыдущем моём сообщеннии).
Команда - " main.py" camelot stream ".\PDF to Excel\readable_pdf.pdf"
Создаёт файл 0.csv вот такого вида.
"Внимание! Оплата данного счет-договора означает согласие с условиями поставки товара. Уведомление об"
"оплате обязательно, в противном случае не гарантируется наличие товара на складе."
"Образец заполнения платежного поручения"
"БИК
044525593
АО ""АЛЬФА-БАНК"" г Москва"
"Сч. №
30101810200000000593"
"Банк получателя"
"Сч. №
40702810902870003369"
"7728456472
КПП 772801001"
"ИНН"
"Счет-договор № УТ-777 от 29 февраля 2020 г."
"ООО ""Сервер Гейт"", ИНН 7728456472, КПП 772801001, 117420, Москва г, Профсоюзная ул, дом № 57,"
"Поставщик:"
"комната 39, тел.: 8 800 222 86 42"
"Покупатель: Наш самый дорогой и любимый клиент"
"Москва, Красная площадь, д. 1
Доставка:"
"1.
Предметом настоящего Счета-договора является поставка товарно-материальных ценностей (далее - ""товар""), бывших в употреблении,"
"при этом все характеристики товаров позволяют их использовать по прямому назначению."
"2.
Оплата настоящего Счета-договора означает согласие Покупателя с условиями и сроками оплаты товара, его поставки"
"и гарантийного обслуживания."
"3.
Настоящий Счет-договор действителен в течение 2 (двух) дней банковских дней с момента его выставления включительно."
"При отсутствии оплаты в указанный срок настоящий Счет-договор признается недействительным."
"4.
Днем оплаты по настоящему Счету-договору является день зачисления денежных средств, указанных в Счете-договоре,"
"на расчетный счет Поставщика."
"5.
Оплата Счета-договора третьими лицами, а также неполная (частичная) оплата Счета-договора не допускается. Покупатель не имеет"
"права производить выборочную оплату позиций Счета-договора и требовать поставку товара по выбранным позициям."
"6.
Поставщик вправе не выполнять поставку товара до зачисления оплаты на расчетный счет."
"7.
Поставка товара может быть осуществлена:"
"1)
путем доставки товара Покупателю и за его счет силами Поставщика;"
"2)
посредством выборки товара Покупателем со склада Поставщика, расположенного по адресу: г. Москва, ул. Профсоюзная, д. 57"
"(далее – «самовывоз»)."
"8.
Способ поставки товара указывается в поле Счета-договора «Способ поставки». В зависимости от выбранного Покупателем способа"
"поставки товара применимы соответствующие пункты Счета-договора."
"9.
Доставка товара Поставщиком осуществляется по адресу, указанному Покупателем в поле Счета-договора «Способ поставки»."
"10. Поставщик обязан доставить оплаченный товар и передать его в транспортную компанию в течение 14 (четырнадцати) рабочих дней с момента"
"зачисления оплаты на расчетный счет."
"11. В случае, когда Покупатель осуществляет самовывоз товара, то товар должен быть принят Покупателем не позднее 10 (десяти) рабочих"
"дней со дня получения им информации о готовности товара для передачи от Поставщика. Указанная информация может быть направлена"
"телефонограммой, по электронной почте, посредством факсимильной связи."
"12. В случае непринятия товара в срок, указанный в п. 11. Счета-договора, Поставщик оставляет за собой право отказаться от исполнения"
"условий данного Счета-договора, вернув Покупателю предоплату за товар на его расчетный счет, с которого оплата товара была произведена, в течении"
"20 рабочих дней."
"13. Покупатель обязан принять товар лично или через уполномоченного представителя. Передача товара осуществляется при"
"предъявлении документа, удостоверяющего личность представителя Покупателя (паспорт гражданина РФ, дипломатический"
"паспорт, служебный паспорт и паспорт моряка (удостоверение личности моряка), и доверенности, оформленной в установленном"
"законодательством РФ порядке, оригинал которой передается Поставщику. Если Товар передается Покупателю в лице"
"руководителя, проставление оттиска печати Покупателя на товарной накладной обязательно, если представителю по доверенности"
"- проставление оттиска печати Покупателя не обязательно."
"14. Отсутствие у Покупателя при доставке товара надлежащим образом оформленной доверенности или отсутствие печати Покупателя"
"является основанием для отказа в передаче товара Покупателю и возврата товара на склад Поставщика. В этом случае товар"
"считается принятым Поставщиком на ответственное хранение на срок не более 3 (трех) календарных дней. По истечению"
"указанного срока Поставщик имеет право отказаться от исполнения условий данного Счета-договора."
"15. Подписание Покупателем или его уполномоченным представителем товарной накладной означает согласие Покупателя с"
"комплектностью и надлежащим внешним видом товара."
"16.
Гарантийное обслуживание товара, на который установлен гарантийный срок, не должно превышать 45 (Сорока пяти) календарных"
"дней. Условия предоставления гарантии размещены по ссылке: https://servergate.ru/guarantee.pdf"


Половина PDF вообще не обрабатываются.

Редактировалось 2 раз(а), последний 2024-01-18 13:33:19
карма: 15

0
Ответов: 537
Рейтинг: 14
#55: 2024-01-23 14:09:10 ЛС | профиль | цитата
Gunta писал(а):
Gunta


https://drive.google.com/file/d/110FEZTggtLUGRyILMbp7a6zZbmuSc3KM/view?usp=drive_link

Проблема была в том, что библиотека camelot нуждалась в библиотеке ghostscript, которая качается отдельно. Теперь в коде она линкуется и должна работать нормально (т. е. екзешник должен работать везде). Бинарник был переименован из main.exe в lib.dll. PDF to Excel.exe запускает lib.dll, как екзешник.

Если вам нужно будет скомпилировать программу, то нужен будет ghostscript. Все зависимости находятся в requirement.txt (pip install -r requirement.txt). Для компиляции нужен pyinstaller (можно установить через pip). pyinstaller ./main.py - эта команда компилирует программу (если перейти в директорию с проектом)
карма: 4

0
Ответов: 700
Рейтинг: 145
#56: 2024-01-23 21:46:42 ЛС | профиль | цитата
Sersey писал(а):
https://drive.google.com/file/d/110FEZTggtLUGRyILMbp7a6zZbmuSc3KM/view?usp=drive_link

Нет доступа.png
карма: 15

0
Ответов: 537
Рейтинг: 14
#57: 2024-01-24 00:38:19 ЛС | профиль | цитата
Прошу прощения, доступ есть
карма: 4

0
Ответов: 700
Рейтинг: 145
#58: 2024-01-24 07:20:27 ЛС | профиль | цитата
Sersey, Протестировал. Результаты не впечатлили. (PDF-файлы для тестов - https://disk.yandex.ru/d/PbyjMm4loWm5xA )
Python:
Извлекает таблицы из 2–5% PDF-файлов.
Не определяет таблицы, которые расположены внутри текста и в многостраничных PDF.
Хорошо определяет если таблица только одна на странице и в документе PDF можно выделить и скопировать текст.
VBJScript:
Находит и распознаёт таблицы в 80–90 % PDF-файлов.
Хорошо распознаёт таблицы в многостраничных и в отсканированных документах.
Главный недостаток – на компьютере должен быть установлен MS Word последних версий.

Редактировалось 1 раз(а), последний 2024-01-24 07:20:42
карма: 15

0
Ответов: 700
Рейтинг: 145
#59: 2024-02-28 11:30:25 ЛС | профиль | цитата
Пример замены строки "This program must be run under Win32", которая находится по смещению 0x00000050 в exe-файле, на свою такой же длинны. Пропатченная программа продолжит работать без каких-либо проблем. Зачем это делать? Пусть каждый решает для себя сам.

Add(MainForm,2953706,84,224)
{
Width=212
Height=142
Point(onClose)
link(onCreate,13223982:doExecute,[])
}
Add(ODialog,13223982,140,238)
{
link(onExecute,1196495:doEvent1,[])
}
Add(FileStream,3596279,245,252)
{
link(onLoad,11044859:doConvert,[])
}
Add(StreamConvertor,11044859,287,252)
{
link(onResult,5537819:doReplace,[])
}
Add(StreamConvertor,11651509,392,252)
{
Mode=1
link(onResult,10578036:doCopyFromStream,[])
}
Add(Memory,14419925,294,140)
{
Default=String(This program must be run under Win32)
link(onData,12731330:doStrPad,[])
}
Add(StreamConvertor,3077251,245,140)
{
Mode=2
Point(Data)
link(onResult,14419925:doValue,[])
link(Data,2353895:Text,[])
}
Add(Hub,1196495,189,238)
{
OutCount=5
link(onEvent1,3077251:doConvert,[(214,244)(214,146)])
link(onEvent2,5041833:doReplace,[(221,251)(221,195)])
link(onEvent3,3596279:doOpen,[])
link(onEvent4,3596279:doClose,[])
link(onEvent5,12257923:doString,[(235,272)(235,314)])
}
Add(Replace,5537819,329,252)
{
link(onReplace,11651509:doConvert,[])
link(Sub_str,14419925:Value,[(342,183)(300,183)])
link(Dest,11115230:Value,[(349,180)(447,180)])
}
Add(Replace,5041833,392,189)
{
SubStr="."
DestStr="-Patched."
link(onReplace,9531005:doValue,[])
}
Add(FileStream,10578036,441,238)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,7730295:Var2,[])
}
Add(Memory,9531005,441,189)
{
}
Add(Memory,11115230,441,140)
{
Default=String(This program must be run under Win32)
}
Add(StreamConvertor,4210091,392,140)
{
Mode=2
link(onResult,11115230:doValue,[])
}
Add(StrPad,12731330,343,140)
{
PadString=" "
PadLength=36
link(onStrPad,4210091:doConvert,[])
link(String,7604597:Text,[])
}
Add(VisualStrings,2353895,245,70)
{
Lines=#36:This program must be run under Win32|
Width=200
}
Add(VisualStrings,7604597,343,98)
{
Lines=#9:Hi hiasm!|
Width=88
}
Add(Message,6222676,413,308)
{
link(onMessage,2953706:doClose,[(463,314)(463,359)(74,359)(74,251)])
}
Add(FormatStr,12257923,364,308)
{
Mask="Файл - %1\r\nПропатчен! \r\nНовое имя файла - %2"
link(onFString,6222676:doMessage,[])
link(Str2,7730295:Var1,[(377,229)])
}
Add(GetDataEx,7730295,441,224)
{
link(Data,9531005:Value,[])
}

Просмотреть результаты можно любым HEX- просмотрщиком (Hex Viewer, Winhex и др.).
Без установки дополнительных программ содержимое бинарных файлов можно просмотреть с помощью:
1. Входящей в состав Windows (начиная с 7-ки) утилиты Certutil

Add(MainForm,8465996,91,56)
{
Point(onClose)
link(onCreate,13591510:doDelete,[])
}
Add(TempFileStream,13032543,308,56)
{
Extention=".bat"
link(onCreate,6551185:doExec,[])
}
Add(WinExec,6551185,350,56)
{
Mode=0
RunEvent=1
Point(onConsoleResult)
Point(doConsoleExec)
link(onExec,8465996:doClose,[(389,62)(389,48)(81,48)(81,83)])
}
Add(StreamConvertor,5465620,266,56)
{
Mode=7
Point(Data)
link(onResult,13032543:doCreate,[])
}
Add(FormatStr,16443353,224,56)
{
Mask="certutil -encodehex "%1" file.txt\r\nnotepad file.txt\r\nexit\r\n\r\n"
link(onFString,5465620:doConvert,[])
}
Add(ODialog,5706125,182,56)
{
link(onExecute,16443353:doString,[])
}
Add(FileTools,13591510,140,56)
{
FileName="file.txt"
link(onEnd,5706125:doExecute,[])
}

2. PowerShell (устанавливаем смещение и размер просматриваемого блока)

Add(MainForm,8465996,63,105)
{
Width=705
Height=361
Point(onClose)
link(onCreate,5706125:doExecute,[])
}
Add(WinExec,6551185,217,105)
{
FileName="powershell"
Mode=0
Point(onConsoleResult)
Point(doConsoleExec)
Point(onConsoleError)
link(onConsoleResult,14519708:doWork2,[])
link(onConsoleError,14519708:doWork3,[(270,132)])
}
Add(FormatStr,16443353,161,119)
{
DataCount=3
Mask="$offset = %1\r\n$chunkSize = %2\r\n$file = Get-Item '%3'\r\n$filestream = $file.OpenRead()\r\n[void]$filestream.Seek($offset, [System.IO.SeekOrigin]::Begin)\r\n$buffer = [byte[]]::new($chunkSize)\r\n$readCount = $filestream.Read($buffer, 0, $buffer.Length)\r\n$filestream.Dispose()\r\nif($readCount -lt $buffer.Length){\r\n $tmp = [byte[]]::new($readCount)\r\n [Array]::Copy($buffer, $tmp, $readCount)\r\n $buffer = $tmp\r\n}\r\n$buffer | Format-Hex"
link(onFString,6551185:doConsoleExec,[])
link(Str1,14057836:Text,[])
link(Str2,4658652:Text,[(174,96)(181,96)])
}
Add(ODialog,5706125,112,119)
{
link(onExecute,16443353:doString,[])
}
Add(Memo,9148442,336,119)
{
Width=689
Height=322
Align=5
Font=[Consolas,10,0,0,204]
ScrollBars=3
}
Add(Charset,9628050,287,119)
{
link(onCharset,9148442:doAdd,[])
}
Add(HubEx,14519708,266,119)
{
link(onEvent,9628050:doCharset,[])
}
Add(VisualStrings,14057836,161,42)
{
@Hint=#6:offset|
Lines=#10:0x00000000|
Width=74
AddHint(102,-20,41,13,@Hint)
}
Add(VisualStrings,4658652,175,70)
{
@Hint=#4:Size|
Lines=#10:0x00000100|
Width=74
AddHint(100,-15,35,13,@Hint)
}

3. Блокнота (только текстовые строки), просто открываем exe-файл в notepad.exe
ASCII text in exe.PNG
карма: 15

0
Ответов: 700
Рейтинг: 145
#60: 2024-03-02 09:48:43 ЛС | профиль | цитата
Список специальных папок.
ПКМ – открыть папку.

Add(MainForm,2953706,182,182)
{
Width=600
Height=451
Caption="Список специальных папок"
link(onCreate,279962:onWork,[])
}
Add(StringTable,7691691,280,196)
{
Width=584
Height=412
Align=5
Columns=#5:##=40|18:Название папки=120|8:Путь=400|
Point(doSort)
Point(onMouseDown)
link(onMouseDown,4871043:doEvent,[])
}
Add(IndexToChanel,4871043,336,203)
{
link(onEvent2,14749428:doPopupHere,[])
}
Add(PopupMenu,14749428,392,210)
{
Menu=#7:Открыть|
link(onClick,5792010:doSplit,[])
}
Add(StrMask,2627132,497,210)
{
Mask="::{*"
link(onFalse,3289686:doWork2,[])
link(onTrue,2852853:doStrCat,[(543,223)(543,230)])
}
Add(MultiStrData,5792010,441,210)
{
From=2
Count=1
link(Str,7691691:Select,[(447,201)(384,201)(384,243)(293,243)])
link(onPart1,2627132:doCompare,[])
}
Add(WinExec,877749,616,210)
{
FileName="explorer"
}
Add(StrCat,2852853,553,224)
{
Str1="Shell:"
link(onStrCat,3289686:doWork3,[(599,230)])
}
Add(HubEx,3289686,595,210)
{
link(onEvent,877749:doExec,[])
}
Add(VBJScript,279962,231,196)
{
@Hint=#7:SendKey|
WorkPoints=#6:onWork|
EventPoints=#7:onEvent|
Script=#23:Sub doWork(Data, Index)|5:Dim i|20:On Error Resume Next|48:Set objShell = CreateObject("Shell.Application")|0:|16:For i = 0 to 255|90:sys.onEvent i & ";" & objShell.Namespace(i).Title & ";" & objShell.Namespace(i).Self.Path|4:Next|7:End Sub|
UseName=0
link(onEvent,7691691:doAdd,[])
}

карма: 15

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)