Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++

Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++

Ответ
Поиск в этой теме
Непрочитано 26.10.2023, 10:02 #1
Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++
iliorik
 
Регистрация: 03.10.2009
Сообщений: 729

Написал программу для вычисления CRC32-IEEE. Может кому нужно будет для экспертизы.
В приложении файлы, которые нужно распаковать на диск С:, зайти в папку с файлами (C:\CRC32), и запустить файл "CRC32.reg".
Далее нажать "Да/Yes" и "Ок".
Есть ли предложения по улучшению или оптимизации кода?
Может есть возможность написания программы по формированию ИУЛ в формате doc или pdf для файла? Куда посмотреть, какие библиотеки и коды включить?

Код:
[Выделить все]
 
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <locale.h>
#include <windows.h>

using namespace std;

static const unsigned int crc32tab[256] = {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};

unsigned int crc32(unsigned char* buf, unsigned int size)
{
	unsigned int crc = 0xFFFFFFFF;
	for (unsigned int i = 0; i < size; i++)
	{
		crc = crc32tab[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
	}
	return crc ^ 0xFFFFFFFF;
}

int main(int argc, char* args[])
{
	std::string dummy;
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	std::string filename = "";
	for (int i = 1; i < argc; i++)
	{
		filename += args[i];
		filename += ' ';
	}
	if (argc < 2)
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: no file path specified" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	ifstream file(filename, ios::binary);
	if (!file.is_open())
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: file not found" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	file.seekg(0, ios::end);
	unsigned int size = file.tellg();
	file.seekg(0, ios::beg);

	unsigned char* buf = new unsigned char[size];
	file.read((char*)buf, size);
	file.close();

	unsigned int crc = crc32(buf, size);

	stringstream ss;
	ss << uppercase<< hex << crc /*the CRC32 number that you have computed somewhere*/;

	std::string resultString = ss.str();
	const char* output = resultString.c_str();
	const size_t len = strlen(output) + 1;
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
	memcpy(GlobalLock(hMem), output, len);
	GlobalUnlock(hMem);
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hMem);
	CloseClipboard();

	//cout << args[0] << endl;
	cout << "File: " << endl;
	cout << filename << endl;
	cout << endl;
	cout  << "CRC32-IEEE: " << endl;
	cout << resultString << endl;
	cout << endl;

	

	std::cout << "Код скопирован в буфер обмена" << std::endl;
	std::getline(std::cin, dummy);

	return 0;
Код обновлён в сообщении ниже

Вложения
Тип файла: zip CRC32.zip (136.4 Кб, 101 просмотров)

__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 20.06.2024 в 14:02.
Просмотров: 6376
 
Непрочитано 26.10.2023, 10:12
#2
Омская птица


 
Регистрация: 20.03.2012
Сообщений: 841


Ничего не понятно
Омская птица вне форума  
 
Автор темы   Непрочитано 26.10.2023, 10:51
#3
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Омская птица Посмотреть сообщение
Ничего не понятно
Если вам не очень интересен код, а нужен просто инструмент для считывания кода CRC32 из файла.
1. Скачиваете с данной страницы файл "CRC32.zip"
2. Распаковываете его на диск C:\
3. Запускаете файл "CRC32.reg". В открывшемся окне с названием "Редактор реестра" нажимаете "Да". В следующем окне "ОК"
4. Теперь при нажатии правой кнопкой на файле PDF, DOC, ZIP, или XML, вы увидете в меню новый пункт с названием CRC32. При нажатии на него выйдет окно терминала с кодом CRC32, а сам код копируется в буфер обмена.
ВЫ можете данный код CRC32 вставить в ваш документ (скорее всего в Информационно-удостоверяющий лист) нажав CTRL+V, либо нажатием правой клопкой мыши -> "Вставить"
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 26.10.2023, 11:02
#4
avatarez


 
Регистрация: 08.08.2019
Сообщений: 21


Не проще воспользоваться Тотальным Командиром? Я еще HashCheck использую.
avatarez вне форума  
 
Автор темы   Непрочитано 26.10.2023, 11:23
#5
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Это надо тотальный командер ставить, или HashCheck. А кому то всё это не интересно. А у кого то устанавливать всё это нельзя, так как лицензии нужно с сисадмином согласовывать.
Кому надо щелкнуть по файлу правой кнопкой, выбрать CRC32, и потом вставить контрольную сумму в документ - вот такое абсолютно бесплатное решение.
Код открыт - закладок нет.
Не совсем понимаю почему Экспертизы таких решений не предлагают. Они же простейшие.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 26.10.2023, 11:37
#6
avatarez


 
Регистрация: 08.08.2019
Сообщений: 21


Ввиду записи в HKEY_CLASSES_ROOT эту программу, к сожалению, тоже надо ставить с правами администратора. Ну и код скомпилирован в exe, так что не особо то и открыт.
avatarez вне форума  
 
Автор темы   Непрочитано 26.10.2023, 11:50
#7
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от avatarez Посмотреть сообщение
Ну и код скомпилирован в exe, так что не особо то и открыт
Код выложен в шапке. Можно скомпилировать самостоятельно (даже администратором организации). Других вариантов для windows кроме как компиляцию в "exe" не вижу.

Цитата:
Сообщение от avatarez Посмотреть сообщение
Ввиду записи в HKEY_CLASSES_ROOT эту программу, к сожалению, тоже надо ставить с правами администратора.
Администратор может её поставить, без покупки лицензии.
HashCheck - Copyright. TotalCommander - вообще платный. Оба выполнены не отечественными компаниями, значит для бюджетных и государственных организаций не подойдёт.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 26.10.2023, 13:28
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


какая прелесть, кстати - в ИУЛ с MD5 перешли на CRC32)

----- добавлено через ~57 мин. -----
Цитата:
Сообщение от iliorik Посмотреть сообщение
Теперь при нажатии правой кнопкой на файле PDF, DOC, ZIP, или XML, вы увидете в меню новый пункт с названием CRC32. При нажатии на него выйдет окно терминала с кодом CRC32, а сам код копируется в буфер обмена.
а если выделить несколько файлов - то в буфере останется CRC32 только для последнего файла)
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.10.2023, 15:31
#9
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
----- добавлено через ~57 мин. -----
Цитата:
Сообщение от iliorik Посмотреть сообщение
Теперь при нажатии правой кнопкой на файле PDF, DOC, ZIP, или XML, вы увидете в меню новый пункт с названием CRC32. При нажатии на него выйдет окно терминала с кодом CRC32, а сам код копируется в буфер обмена.
а если выделить несколько файлов - то в буфере останется CRC32 только для последнего файла)
да. программа была написана для определенной задачи. Быстро щелкать по файлу, и вставлять в word документ CRC32.
Если будет время, наверное допишу программу, что б создавала ИУЛ (или несколько ИУЛов для нескольких файлов)
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 26.10.2023 в 16:13.
iliorik вне форума  
 
Непрочитано 26.10.2023, 16:27
#10
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Мне не надо. Но все равно спасибо. Было интересно.
nickname2019 вне форума  
 
Непрочитано 26.10.2023, 20:50
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


и, кстати, можно использовать старый добрый драп-и-дроп, будет принимать любое количество файлов и без всяких административных прав. К примеру, на .Net это элементарно делается:

Код:
[Выделить все]
 
        private void Window_Drop(object sender, DragEventArgs e)
        {
            e.Effects = DragDropEffects.None;
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] lFileNames = e.Data.GetData(DataFormats.FileDrop) as string[];
                if ((lFileNames != null) && (lFileNames.Length > 0))
                {
                    foreach (string lFileName in lFileNames)
                    {
                        if (File.Exists(lFileName))
                        {
                            // И тут считаем хэш очередного файла, получаем его размер и т.д.

                        }
                    }
                }
            }
        }
т.е. делается маленькое WPF приложение, для основного окна которого выставляется AllowDrop="True" (разрешить принимать данные перетаскиванием) и подключается вышеупомянутый обработчик Drop="Window_Drop".
Сергей812 вне форума  
 
Непрочитано 27.10.2023, 03:09
#12
Автон

СЦБ
 
Регистрация: 09.03.2006
Сообщений: 89


Я себе для таких целей создал ИУЛ в Word. Полями сослался на свойства самого документа. Затем макросом на VBA выбираю файл PDF, макрос записывает в свойства размер файла, дату, CRC32. Поля подтягивают всё это сразу в ИУЛ.
То же самое есть и для ИУЛа в Excel
Автон вне форума  
 
Автор темы   Непрочитано 27.10.2023, 10:14
#13
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Автон Посмотреть сообщение
Я себе для таких целей создал ИУЛ в Word. Полями сослался на свойства самого документа. Затем макросом на VBA выбираю файл PDF, макрос записывает в свойства размер файла, дату, CRC32. Поля подтягивают всё это сразу в ИУЛ.
То же самое есть и для ИУЛа в Excel
Много действий. Хочу что бы щелкнул по файлу, и рядом уже ИУЛ в Word без всяких макросов.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
К примеру, на .Net это элементарно делается:
.Net не интересен. Нужно либо компилировать в файл все нужные dll, либо фрамеворки на компьютер пользователя ставить. Считаю для таких простейших решений .Net излишеством
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 27.10.2023, 10:41
#14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от iliorik Посмотреть сообщение
Хочу что бы щелкнул по файлу, и рядом уже ИУЛ в Word без всяких макросов.
Цитата:
Сообщение от iliorik Посмотреть сообщение
Считаю для таких простейших решений .Net излишеством
Это два взаимоисключающих утверждения.
Я как то писал подобное в виде аддона для ворда, для ГИПов, только не CRC32, а для md5... там простейший код. Все как хочется, по клику на файл и вставка в ворд, без всяких танцев с бубном.
Boxa вне форума  
 
Непрочитано 27.10.2023, 12:30
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от iliorik Посмотреть сообщение
.Net не интересен. Нужно либо компилировать в файл все нужные dll, либо фрамеворки на компьютер пользователя ставить. Считаю для таких простейших решений .Net излишеством
это очень надо постараться на рабочей машине с Windows не найти .Net Фреймворк Просто в зависимости от версии окошек разная минимальная дефолтная версия Фреймворка.

----- добавлено через ~13 мин. -----
Если, конечно, до сих пор не работаете в версиях Windows выпусков до 2003 года)
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.10.2023, 14:12
#16
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Я как то писал программы под Net, вот тогда и столкнулся с этим. Особенно когда плагин для Naviswork включаться без фрамеворка отказался.
После этого какие то простые вещи, стараюсь писать на C++.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 27.10.2023, 16:22
#17
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Кажется мне, что в программе файл перед подсчетом crc полностью копируется в память.
Если это так, то при больших файлах могут быть тормоза, связанные с выделением памяти.
Можно один раз выделить память на небольшой блок, туда читать частями файл и считать crc тоже частями. Это может быть существенно быстрее для больших файлов.
nickname2019 вне форума  
 
Автор темы   Непрочитано 20.06.2024, 10:19
#18
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Переписал код с учётом пожеланий nickname2019
Размер буфера устанавливается в переменной buffer_size
Код:
[Выделить все]
 
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <locale.h>
#include <windows.h>

using namespace std;

const int buffer_size = 512*1024; // Размер буфера 512кб

unsigned int crc32(unsigned int crc, const unsigned char* buf, size_t size) {
	static unsigned int table[256];

	if (!table[1]) {
		unsigned int poly = 0xEDB88320;
		for (size_t i = 0; i < 256; ++i) {
			unsigned int c = i;
			for (size_t j = 0; j < 8; ++j) {
				c = (c & 1) ? (poly ^ (c >> 1)) : (c >> 1);
			}
			table[i] = c;
		}
	}

	crc = crc ^ 0xFFFFFFFF;
	for (size_t i = 0; i < size; ++i) {
		crc = table[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
	}

	return crc ^ 0xFFFFFFFF;
}

int main(int argc, char* args[])
{
	std::string dummy;
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	std::string filename = "";
	for (int i = 1; i < argc; i++)
	{
		filename += args[i];
		filename += ' ';
	}
	if (argc < 2)
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: no file path specified" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	ifstream file(filename, ios::binary);
	if (!file.is_open())
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: file not found" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	unsigned char buffer[buffer_size];
	unsigned int crc = 0x0000000;

	while (!file.eof()) {
		file.read(reinterpret_cast<char*>(buffer), buffer_size); // Считываем данные из файла в буфер
		size_t bytes_read = file.gcount(); // Получаем количество считанных байт
		crc = crc32(crc, buffer, bytes_read); // Вычисляем crc32 для считанных данных
	}

	file.close();

	stringstream ss;
	ss << uppercase << hex << crc  /*the CRC32 number that you have computed somewhere*/;

	std::string resultString = ss.str();
	resultString = std::string(8 - resultString.length(), '0') + resultString; //зполняем нулями начало, если нет символов
	const char* output = resultString.c_str();
	const size_t len = strlen(output) + 1;
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
	memcpy(GlobalLock(hMem), output, len);
	GlobalUnlock(hMem);
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hMem);
	CloseClipboard();

	//cout << args[0] << endl;
	cout << "File: " << endl;
	cout << filename << endl;
	cout << endl;
	cout << "CRC32-IEEE: " << endl;
	cout << resultString << endl;
	cout << endl;



	std::cout << "Код скопирован в буфер обмена" << std::endl;
	std::getline(std::cin, dummy);

	return 0;
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 20.06.2024 в 11:27. Причина: 083 - добавил заполнением нулями начало строки
iliorik вне форума  
 
Непрочитано 20.06.2024, 15:03
#19
Автон

СЦБ
 
Регистрация: 09.03.2006
Сообщений: 89


Как вариант, ИУЛ со встроенной функцией CRC32, имени файла, размера файла, даты изменения файла.
Как пользоваться: двойной клик, куда показывает стрелка, выбор файла.
Вложения
Тип файла: zip ИУЛ.zip (81.1 Кб, 102 просмотров)
Автон вне форума  
 
Автор темы   Непрочитано 21.06.2024, 11:01
#20
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Автон Посмотреть сообщение
Как вариант, ИУЛ со встроенной функцией CRC32, имени файла, размера файла, даты изменения файла.
Как пользоваться: двойной клик, куда показывает стрелка, выбор файла.
Хорошая штука. Но не подойдёт тем, у кого нет Microsoft Word.
Скоро сделаю на основе ИУЛ в .rtf формате. Всё из одной программы будет создаваться, без стороннего ПО
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 21.06.2024, 11:54
#21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Offtop: Осталось только дописать парсер pdf файлов и генерацию таблицы в соответствии с ГОСТ, как то так:
Миниатюры
Нажмите на изображение для увеличения
Название: 95ee48c405df0b02073f465be56bbc01[1].png
Просмотров: 265
Размер:	32.4 Кб
ID:	263503  
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 12:25
#22
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Boxa Посмотреть сообщение
дописать парсер pdf файлов
Круто. Всё с кнопочками и как надо
Можешь код на с++ из класса DocProps взять. Он собирает нужные данные по файлу
Хотя на с# некоторые моменты будет проще написать. Например дату и время изменения файла
Код:
[Выделить все]
 #include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <locale.h>
#include <windows.h>
//для времени и даты файла
#include <chrono>
#include <ctime>
#include <filesystem>
//для записи в rtf файл 
#include <regex>

using namespace std;

//const int buffer_size = 1048576; // 1 МБ
const int buffer_size = 512*1024; // 512 КБ


unsigned int crc32(unsigned int crc, const unsigned char* buf, size_t size) {
	static unsigned int table[256];

	if (!table[1]) {
		unsigned int poly = 0xEDB88320;
		for (size_t i = 0; i < 256; ++i) {
			unsigned int c = i;
			for (size_t j = 0; j < 8; ++j) {
				c = (c & 1) ? (poly ^ (c >> 1)) : (c >> 1);
			}
			table[i] = c;
		}
	}

	crc = crc ^ 0xFFFFFFFF;
	for (size_t i = 0; i < size; ++i) {
		crc = table[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
	}

	return crc ^ 0xFFFFFFFF;
}

class DocProps
{
	template <typename TP>
	std::time_t to_time_t(TP tp)
	{
		using namespace std::chrono;
		auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now()
			+ system_clock::now());
		return system_clock::to_time_t(sctp);
	}
public:
	string changesDate;
	string changesTime;
	string crcCode;
	string name;
	string filename;
	string path_to_file;

	//вычисляем crc код и записываем в crcCode
	void crcRead()
	{
		ifstream file(path_to_file, ios::binary);
		if (!file.is_open())
		{
			cout << path_to_file << endl;
			cout << "Error: file not found" << endl;
		}
		else
		{
			unsigned char buffer[buffer_size];
			unsigned int crc = 0x0000000;

			while (!file.eof()) {
				file.read(reinterpret_cast<char*>(buffer), buffer_size); // Считываем данные из файла в буфер
				size_t bytes_read = file.gcount(); // Получаем количество считанных байт
				crc = crc32(crc, buffer, bytes_read); // Вычисляем crc32 для считанных данных
			}

			file.close();

			stringstream ss;
			ss << uppercase << hex << crc << dec  /*the CRC32 number that you have computed somewhere*/;

			crcCode = ss.str();
			crcCode = std::string(8 - crcCode.length(), '0') + crcCode; //зполняем нулями начало, если нет символов
		}
	}

	//записываем имя файла в переменную filename
	void readName()
	{
		size_t found = path_to_file.find_last_of("\\");
		filename = path_to_file.substr(found + 1);
		//убираем расширение
		size_t pos = filename.find_last_of('.');
		if (pos != string::npos) { // If a dot is found
			name = filename.substr(0, pos); // Remove the extension by getting a substring from the beginning to the last dot position
		}
	}
	void readTimeDataChanges()
	{
		std::filesystem::file_time_type ftime = std::filesystem::last_write_time(path_to_file);
		std::time_t tt = to_time_t(ftime);
		std::tm* tm = std::localtime(&tt);

		char dateChanges[11];
		std::strftime(dateChanges, 11, "%d.%m.%Y", tm);
		changesDate = dateChanges;

		char timeChanges[6];
		std::strftime(timeChanges, 6, "%H:%M", tm);
		changesTime = timeChanges;
	}
	void readProps()
	{
		readName();
		readTimeDataChanges();
	}
};

void changeRTF(DocProps dp_, string filename_)
{
	std::ifstream inFile(filename_);
	std::string content((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
	inFile.close();

	std::regex fileNameRegex("\\$FileName");
	content = std::regex_replace(content, fileNameRegex, dp_.filename);

	std::regex nameRegex("\\$Name");
	content = std::regex_replace(content, nameRegex, dp_.name);

	std::regex crcCodeRegex("\\$ControlSumm");
	content = std::regex_replace(content, crcCodeRegex, dp_.crcCode);

	std::regex dateRegex("\\$Date");
	content = std::regex_replace(content, dateRegex, dp_.changesDate);

	std::regex timeRegex("\\$Time");
	content = std::regex_replace(content, timeRegex, dp_.changesTime);

	std::ofstream outFile(dp_.name+"-УЛ.rtf");
	outFile << content;
	outFile.close();
}

int main(int argc, char* args[])
{
	std::string dummy;
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	DocProps dp;

	dp.path_to_file = "";
	for (int i = 1; i < argc; i++)
	{
		dp.path_to_file += args[i];
		dp.path_to_file += ' ';
	}
	if (argc < 2)
	{
		cout << args[0] << endl;
		cout << dp.path_to_file << endl;
		cout << "Error: no file path specified" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	dp.crcRead();
	dp.readProps();
	std::filesystem::path thisPath = std::filesystem::current_path();
	changeRTF(dp, "Example.rtf");
	
	const char* output = dp.crcCode.c_str();
	const size_t len = strlen(output) + 1;
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
	memcpy(GlobalLock(hMem), output, len);
	GlobalUnlock(hMem);
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hMem);
	CloseClipboard();

	//cout << args[0] << endl;
	cout << "File: " << endl;
	cout << dp.filename << endl;
	cout << endl;
	cout << "CRC32-IEEE: " << endl;
	cout << dp.crcCode << endl;
	cout << endl;
	cout << "Date: " << endl;
	cout << dp.changesDate << endl;
	cout << endl;
	cout << "Time: " << endl;
	cout << dp.changesTime << endl;
	cout << endl;
	cout << "Path to file: " << endl;
	cout << dp.path_to_file << endl;
	cout << endl;



	std::cout << "Код скопирован в буфер обмена" << std::endl;
	std::getline(std::cin, dummy);

	return 0;
}
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 21.06.2024 в 12:30.
iliorik вне форума  
 
Непрочитано 21.06.2024, 12:54
#23
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от iliorik Посмотреть сообщение
Можешь код на с++ из класса DocProps взять. Он собирает нужные данные по файлу
Хотя на с# некоторые моменты будет проще написать. Например дату и время изменения файла
Посмотрел код... вот тут непонятка, дату изменения файла, нельзя брать из файловой системы, т.к. файл может быть просто перенесен или скопирован, дату изменения нужно брать из внутренних свойств самой пдфки, у нее там это есть.
И есть куда развиваться, т.к. имя файла, дата изменения и CRC32-IEEE - маловато =)
Вкус приходит во время еды... У себя я сделал, что парсятся титульники, штампы всех листов внутри пдф-ки и на основе полученных данных формируются графы таблицы: шифр, наименования, характера работ, ФИО исполнителей (на картинке я фамилии руками заменил на ###) и все остальное...
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 13:16
#24
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Boxa Посмотреть сообщение
Посмотрел код... вот тут непонятка, дату изменения файла, нельзя брать из файловой системы, т.к. файл может быть просто перенесен или скопирован, дату изменения нужно брать из внутренних свойств самой пдфки, у нее там это есть.
У нас экспертиза сверяет дату изменения из файловой системы. При копировании pdf, дата изменения остаётся и не меняется, пока его не пересохранят. К тому же не только файлы pdf нужно передавать. Например xml, или zip архив с BIM моделью. И как с ними быть?

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вкус приходит во время еды... У себя я сделал, что парсятся титульники, штампы всех листов внутри пдф-ки и на основе полученных данных формируются графы таблицы: шифр, наименования, характера работ, ФИО исполнителей (на картинке я фамилии руками заменил на ###) и все остальное...
Это несомненно так. Но для этого должен быть стандарт разработки документов определённый. Возможно я попробую нейросетку написать, которая из титульника будет название объекта и название раздела брать. Но это когда я начну нейросети изучать (думаю как раз там на C# писать буду).
Пока что хочется какой то более универсальный инструмент разработать. Что бы правой кнопкой мышки на файл нажал, выбрал нужный пункт в контекстном меню, и рядом появился ИУЛ (при этом независимо, есть ли microsoft или нет)
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 21.06.2024, 13:24
#25
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Как быть не знаю, но бывает и вот такая ситуация: см вложение и потому у нас экспертиза требует внутреннюю дату изменений из пдфки
Миниатюры
Нажмите на изображение для увеличения
Название: 111.png
Просмотров: 51
Размер:	18.5 Кб
ID:	263504  
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 14:22
#26
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Boxa Посмотреть сообщение
Как быть не знаю, но бывает и вот такая ситуация: см вложение и потому у нас экспертиза требует внутреннюю дату изменений из пдфки
Если немножко поковыряться в файлах, эти даты можно изменить любым блокнотом. Как по мне именно они не о чём не говорят. Всё таки данные о файле из файловой системы тяжелее подделать (если мы говорим о достоверности последних внесённых изменений в файл).
Но если нужно будет, при помощи с++ считать такое из файла значит тоже не сложно будет. Главное понять как эти метаданные сохранены в pdf
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot 2024-06-21 141420.png
Просмотров: 26
Размер:	104.1 Кб
ID:	263505  Нажмите на изображение для увеличения
Название: Screenshot 2024-06-21 142034.png
Просмотров: 25
Размер:	12.7 Кб
ID:	263506  
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 21.06.2024 в 14:35.
iliorik вне форума  
 
Непрочитано 21.06.2024, 15:58
1 | #27
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,055


По устройству PDF есть краткое руководство от авторов: https://www.adobe.com/technology/pdf...DFTutorial.pdf. Это если есть желание свой PDF-писатель с нуля сделать, чтобы ни от кого не зависеть.

Но скорее всего, есть готовые библиотеки для чтения/записи. Писать с нуля какой-нибудь код упаковки Deflate или zip - это совсем для мазохистов. Под шарп я использовал https://itextpdf.com/, (тут и тут) под плюсы не подскажу, надо гуглить.

С датами у меня на прошлой работе техотдел всех тренировал, еще до того, как это стало государственным геморроем. Даты смотрели кто попало и где попало. Одним подавай в свойствах файла, другим внутри PDF. Были даже случаи, когда даты по-разному округлялись в разных программах из-за спорных микросекунд, и техотдел заставлял переделывать PDF, потому что "даты неправильные, тут одна минута написана, а у файла целых две". Очевидно, в программе придется сделать настройки на несколько экранов, что делать с датами - заменять, унифицировать, рандомизировать и т.д. по списку всех возможных идиотских предложений.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 21.06.2024, 16:32
#28
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
По устройству PDF есть краткое руководство от авторов: https://www.adobe.com/technology/pdf...DFTutorial.pdf. Это если есть желание свой PDF-писатель с нуля сделать, чтобы ни от кого не зависеть.
Спасибо. Гляну. Но как я понял там не так сложно всё, если не зашифровано.

Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Но скорее всего, есть готовые библиотеки для чтения/записи. Писать с нуля какой-нибудь код упаковки Deflate или zip - это совсем для мазохистов. Под шарп я использовал https://itextpdf.com/, (тут и тут) под плюсы не подскажу, надо гуглить.
Вот не хотелось бы из за пары строк, которые спарсить можно, библиотеками приложение нагружать. Хотя ничего плохого в этом нет, но всё же. Хочется легковесных решений.

Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
С датами у меня на прошлой работе техотдел всех тренировал, еще до того, как это стало государственным геморроем. Даты смотрели кто попало и где попало. Одним подавай в свойствах файла, другим внутри PDF. Были даже случаи, когда даты по-разному округлялись в разных программах из-за спорных микросекунд, и техотдел заставлял переделывать PDF, потому что "даты неправильные, тут одна минута написана, а у файла целых две". Очевидно, в программе придется сделать настройки на несколько экранов, что делать с датами - заменять, унифицировать, рандомизировать и т.д. по списку всех возможных идиотских предложений.
Все требуют эти даты и по разному (у каждой экспертизы свои требования), как будто эти даты что то дают, их какие угодно в файле вписать нельзя. Вот crc-ieee или md5 метод проверки файла, другое дело. Тут уже так просто не подгонишь файл. Ну и всегда понятно какой именно файл был на проверке.
Опять же, несколько раз просмотрел ГОСТ 2.051-2013. Про даты ни слова ни полей не нашёл. Описали бы какие даты имеются ввиду. Откуда эти даты вообще в ИУЛ пришли?
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 21.06.2024, 17:01
#29
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,055


Цитата:
Сообщение от iliorik Посмотреть сообщение
не так сложно всё
Как и все в программировании. Легко написать программу, которая делает что-нибудь простое. Например, записывает PDF с ИУЛом. Потому что для этого надо реализовать 0.01% от всех возможностей формата. Но если надо прочитать файл, который записал кто-то еще, надо реализовать 100% формата. Программа, записывающая минимальный файл, пишется за день-другой. Программа, читающая произвольный файл - за 10-20 лет.
Цитата:
Сообщение от iliorik Посмотреть сообщение
спарсить можно
Я, когда с техотделом воевал, вручную парсил: в Far Manager открывал, и заменял теги ModifyDate, CreateDate, MetadataDate (примеры этих тегов по ссылке выше есть). Но внутри файла могут лежать пожатые объекты и хз что еще. Парсить упаковку из нескольких форматов сжатия в нуля из принципа - дурная затея. А без этого программа никак не даст гарантии, что она все исправила. Единственное легковесное решение - генерить ИУЛ; как писать тексты и рисовать линии, в учебнике показано. Но потом же туда надо будет фамилии вставлять, или сканы подписей - и пойдет история развития программы годы наматывать.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 21.06.2024, 17:31
#30
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Единственное легковесное решение - генерить ИУЛ; как писать тексты и рисовать линии, в учебнике показано
На интересную мысль вы меня натолкнули. Может стоит liblatex.h использовать? Не, она для формул больше и научных текстов.
Наверное что то попроще есть, в плане того что бы красивые линии и тексты делать в pdf, считывать метаданные pdf разделов проекта и смотреть на титульный лист.
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 21.06.2024 в 17:59.
iliorik вне форума  
 
Непрочитано 22.06.2024, 05:08
#31
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,055


Цитата:
Сообщение от iliorik Посмотреть сообщение
красивые линии и тексты делать в pdf
Делать в pdf можно без подготовки, если нужно просто записать файл фиксированного формата с нуля. Там достаточно несколько строк подставить в шаблон:
Код:
[Выделить все]
 
#include <fstream>

void write(std::ofstream &pdf, char const* name)
{
    pdf <<  "%PDF-1.2\n"
            "1 0 obj\n"
            "<<\n"
            "/Type /Page\n"
            "/Parent 5 0 R\n"
            "/Resources 3 0 R\n"
            "/Contents 2 0 R\n"
            ">>\n"
            "endobj\n"
            "2 0 obj\n"
            "<< /Length 51 >>\n"
            "stream\n"
            "BT\n"
            "/F1 24 Tf\n"
            "1 0 0 1 150 200 Tm\n"
            "(" << name << ")Tj\n"
            "ET\n"
            "100 100 m\n"
            "300 100 l\n"
            "300 300 l\n"
            "100 300 l\n"
            "100 100 l\n"
            "s\n"
            "endstream\n"
            "endobj\n"
            "3 0 obj\n"
            "<<\n"
            "/ProcSet[/PDF/Text]\n"
            "/Font <</F1 4 0 R >>\n"
            ">>\n"
            "endobj\n"
            "4 0 obj\n"
            "<<\n"
            "/Type /Font\n"
            "/Subtype /Type1\n"
            "/Name /F1\n"
            "/BaseFont/Helvetica\n"
            ">>\n"
            "endobj\n"
            "5 0 obj\n"
            "<<\n"
            "/Type /Pages\n"
            "/Kids [ 1 0 R ]\n"
            "/Count 1\n"
            "/MediaBox\n"
            "[ 0 0 400 400 ] >>\n"
            "endobj\n"
            "6 0 obj\n"
            "<<\n"
            "/Type /Catalog\n"
            "/Pages 5 0 R\n"
            ">>\n"
            "endobj\n"
            "trailer\n"
            "<<\n"
            "/Root 6 0 R\n"
            ">>";
}

int main()
{
    std::ofstream pdf("iul.pdf");
    write(pdf, "Name");
}
А читать чужое - на несколько лет работы. Потому что файл может взяться откуда попало. Например, из онлайн-сервиса по уменьшению размера файла. И любая часть файла может, например, оказаться сжатой архиватором (в PDF есть встроенная архивация в бинарный поток). И тогда ее не получится "просто распарсить и поменять дату". Откуда программа "по щелчку одной левой", например, возьмет фамилии разработчиков? Или как она проверит, не записан ли уже CRC в иуле? Прочитает из исходного PDF? Примерно так: Почему так сложно извлекать текст из PDF?, Текст любой ценой: PDF. На хабре вообще полезно поискать, что думают программисты про этот формат.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 24.06.2024, 09:18
#32
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Откуда программа "по щелчку одной левой", например, возьмет фамилии разработчиков? Или как она проверит, не записан ли уже CRC в иуле?
Вот поэтому я думаю, что без нейросетей не обойтись. Подключить OCR, и при помощи нейросетей, обучить извлекать из титулов и штампов всю нужную информацию.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 25.06.2024, 04:59
#33
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,055


Следующие темы будут называться:
  • Помогите написать декодер JPEG без внешних библиотек
  • Помогите написать декодер PNG без внешних библиотек
  • Помогите написать декодер TIFF без внешних библиотек
  • Помогите написать декодер Deflate без внешних библиотек
  • Помогите написать декодер Zip без внешних библиотек
  • Помогите написать декодер Fax Group 4 без внешних библиотек
  • Помогите написать декодер Pdf без внешних библиотек
  • Помогите написать OCR без внешних библиотек
  • Помогите написать нейросеть без внешних библиотек
  • Помогите перевести нейросеть на GPU без внешних библиотек
  • Помогите найди миллион-другой образцов ИУЛ для обучения нейросети
Нубий-IV вне форума  
 
Автор темы   Непрочитано 25.06.2024, 09:49
#34
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Следующие темы будут называться:
Согласен, так бы и было. Но это никому не интересно на данном форуме, поэтому таких тем не будет.
Тут только crc32 для ИУЛ думаю обсуждать.
Когда напишу что то работающее по вытягиванию информации из pdf (если напишу, может надоест и брошу всё это), тогда выложу с новой темой. А потом увяжу две программы между собой, и будет счастье.
Пока в части ИУЛ вижу только создание (или редактирование готовых) RTF документов по клику правой кнопкой мышки.
Такая принципиальная концепция моей программы, минимум действий для определённого результата, при этом не должно быть привязок к стороннему ПО (типа Microsoft Word)
Пока задача была кликнуть по файлу и потом через Ctrl+v вставить код CRC32 в нужное поле.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 25.06.2024, 14:45
#35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


даже если умудритесь написать программу, которая учитывает все организационную "рукожопость" многих проектных организаций - то они (организации) просто начнут еще больше "косячить") Никогда исправление ошибок за других не приводило к уменьшению количества ошибок...
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 15:01
#36
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
даже если умудритесь написать программу, которая учитывает все организационную "рукожопость" многих проектных организаций - то они (организации) просто начнут еще больше "косячить") Никогда исправление ошибок за других не приводило к уменьшению количества ошибок...
Мне вот даже интересно. Если я вижу ошибки, и что должно было быть, может ли нейросеть это тоже увидеть? Мы же как то видим, что что то не так..
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 25.06.2024, 16:01
#37
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от iliorik Посмотреть сообщение
Мы же как то видим, что что то не так..
не факт - "правильность" того или иного варианта решения вещь достаточно субъективная:
  1. это может быть "закрепленный" в памяти исполнителя вариант при массовом использовании подобных решений;
  2. может быть навязанный вариант на основании то, что большинство других так делает;
  3. вариант, закрепленный целевым указанием сверху (требованиями НТД или, например, волеизъявлением руководства);
и т.д.
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 16:19
#38
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Ну например, взглянув на титульный лист, мы сразу понимаем где название объекта, где название раздела, где фамилия исполнителя, и где наименование организации (я понимаю что это очень непростая процедура будет в плане нейросетей).
Результат конечно субъективный, но он не отличается от тысячи других субъективных результатов.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 25.06.2024, 16:31
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от iliorik Посмотреть сообщение
мы сразу понимаем где название объекта, где название раздела, где фамилия исполнителя, и где наименование организации
поменяйте поля титульного листа местами и сам текст сделайте на совершенно неизвестном для читающего языке...)
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 16:49
#40
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
поменяйте поля титульного листа местами
Я всё равно пойму где название объекта, а где название раздела. И даже фамилию от названия организации отличу.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
сам текст сделайте на совершенно неизвестном для читающего языке
А такой pdf с разделом документации я отправлю обратно, с вопросом, что это, и как по этому строить в РФ
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 25.06.2024, 17:03
#41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


вопрос - зачем все усложнять? Если проектные организации годами "клали болт" на внутреннюю организацию работ - значит, сейчас будут "пожинать" плоды своей лени и пофигизма, пытаясь сдать документацию по новым правилам. Кто придерживался хотя бы минимального порядка производства работ...
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 17:18
#42
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вопрос - зачем все усложнять?
Я стараюсь упростить. Клик правой мышки - результат.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если проектные организации годами "клали болт" на внутреннюю организацию работ - значит, сейчас будут "пожинать" плоды своей лени и пофигизма, пытаясь сдать документацию по новым правилам. Кто придерживался хотя бы минимального порядка производства работ...
Ну то сильно "клали болт", обычно идут лесом. Либо доводят до нормального результата, который хотя бы соответствует как то требованию ГОСТ 21.101. Но при этом всё равно титулы у всех немного разные. И просто угадать по координатам где какой текст, не очень то и просто.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 26.06.2024, 03:01
#43
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,055


Цитата:
Сообщение от iliorik Посмотреть сообщение
угадать по координатам где какой текст
Надо не забыть, что в PDF может не быть текста. Могут быть буквы; по одно штучке; не по порядку. Могут быть линии - если шрифт был векторный. Надо проанализировать все линии на чертеже, и определить, не сложились ли они в буквы, а буквы - в слова. И вариант со сканированными чертежами не забыть, чтобы рукописные фамилии из штампа распознать, и чтоб без ошибок там.
Цитата:
Сообщение от iliorik Посмотреть сообщение
Я стараюсь упростить. Клик правой мышки
Слишком сложно. Алиса, сделай иул!
Нубий-IV вне форума  
 
Автор темы   Непрочитано 26.06.2024, 09:31
#44
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Надо не забыть, что в PDF может не быть текста. Могут быть буквы; по одно штучке; не по порядку. Могут быть линии - если шрифт был векторный. Надо проанализировать все линии на чертеже, и определить, не сложились ли они в буквы, а буквы - в слова. И вариант со сканированными чертежами не забыть, чтобы рукописные фамилии из штампа распознать, и чтоб без ошибок там.
поэтому только перевод в пиксели, и распознавание пикселей. Благо нейросети неплохо такое умеют, примеры есть, обучить тоже не проблема.
Хотя можно условие добавить, если в PDF нет текста, то "распознование пикселей". Всё таки быстрее будет работать

Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Слишком сложно. Алиса, сделай иул!
Не поддерживаю Алису. Слишком ограниченное корпоративными стандартами решение.
__________________
///BIM мертв\\\

Последний раз редактировалось iliorik, 26.06.2024 в 09:37.
iliorik вне форума  
 
Непрочитано 26.06.2024, 09:33
#45
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


как понимаю, составление ИУЛ листа занимает основное время - которое тратится на проектирование. Все остальное делается в пару "щелчков". Правда, как максимально автоматизировать процесс генерации проектной документации, не имея централизованного задания параметров проекта и его компонентов - слабо себе представляю. Видимо, тоже ИИ)

А если параметры проекта задаются централизовано - то зачем заниматься расшифровкой титульных листов для генерации ИУЛ...
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.06.2024, 10:08
#46
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
как понимаю, составление ИУЛ листа занимает основное время - которое тратится на проектирование. Все остальное делается в пару "щелчков". Правда, как максимально автоматизировать процесс генерации проектной документации, не имея централизованного задания параметров проекта и его компонентов - слабо себе представляю. Видимо, тоже ИИ)
Началось всё с того, что никто вообще не понимал из моих коллег, что это такое, и как этот номер получить.
Вначале догадались в архиве WinRAR посмотреть, но переписывать вручную - это время, и могут быть ошибки.
Потом я сделал подсчёт CRC, но опять же занимало время на выделение, копирование, вставку (следующий этап был, автоматическое копирование в буфер, и вставка из него Ctrl+V)
Сейчас есть несколько ИУЛ в rtf, в которых автоматически заполняются поля: CRC, дата, время (Остальные поля заполнены, файл автоматически выбирается по названию файла)
И если раньше загрузка в экспертизу занимала какое то время, то теперь это делается легко и моментально.
Такие мелочи упрощают жизнь проектировщику, и оставляют больше времени и умственных сил на само проектирование, а не на заполнение бланков.
__________________
///BIM мертв\\\
iliorik вне форума  
 
Непрочитано 26.06.2024, 10:31
#47
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Offtop: 21.06.2024
Цитата:
Сообщение от iliorik Посмотреть сообщение
Скоро сделаю на основе ИУЛ в .rtf формате. Всё из одной программы будет создаваться, без стороннего ПО
26.06.2024
Цитата:
Сообщение от iliorik Посмотреть сообщение
Сейчас есть несколько ИУЛ в rtf, в которых автоматически заполняются поля: CRC, дата, время (Остальные поля заполнены, файл автоматически выбирается по названию файла)
а в середине от практической утилиты фантазии унесли куда-то в автоматическое распознавание титульных листов с использованием ИИ)
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.06.2024, 10:39
#48
iliorik


 
Регистрация: 03.10.2009
Сообщений: 729


Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
автоматическое распознавание титульных листов с использованием ИИ
Это просто идея, которая возникла в процессе разработки программы. Пока такого решения нет, делаем так, как получается, при этом быстро и эффективно.
Ну а когда я сделаю распознавание, она же мне не только для ИУЛ пригодится, а например для заполнения полей pdf файла всех проектов которые у меня есть (Название, Автор и т д.). Очень удобно будет искать и сортировать по заполненным полям файлы на диске.
__________________
///BIM мертв\\\
iliorik вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++