Форум программистов, компьютерный форум CyberForum.ru
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация
 
 
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
14.03.2014, 09:10     Узнать количество страниц в документах с расширением *.pdf и *.tif #1
Приветствую всех форумчан!

Собственно, вопрос в сабже. Существуют ли какие-либо способы это узнать? В данный момент пока разбираюсь с pdf, копаюсь в библиотеке AcroPDF, но ничего дельного не нашёл. Может быть, как-то это можно сделать через OLE?

Пожалуйста, подскажите. Заранее благодарю.

Добавлено через 1 час 9 минут
Да, забыл уточнить - это нужно сделать в C++ Builder 6.
AdAgent
Объявления
14.03.2014, 09:10     Узнать количество страниц в документах с расширением *.pdf и *.tif
Avazart
Форумчанин
 Аватар для Avazart
5850 / 4559 / 191
Регистрация: 10.12.2010
Сообщений: 19,159
Записей в блоге: 16
14.03.2014, 23:50     Узнать количество страниц в документах с расширением *.pdf и *.tif #2
Разбором самого файла - это раз, второй через COM
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
17.03.2014, 04:05  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #3
Avazart, а что вы подразумеваете под разбором самого файла? И можно где-нибудь посмотреть примеры разбора подобных задач?
И ещё один вопрос - через SDK это возможно сделать? А то я прочитал на него документацию и там прямо есть функция получения количества страниц документа pdf.
Заранее благодарю за помощь.
Avazart
Форумчанин
 Аватар для Avazart
5850 / 4559 / 191
Регистрация: 10.12.2010
Сообщений: 19,159
Записей в блоге: 16
17.03.2014, 04:18     Узнать количество страниц в документах с расширением *.pdf и *.tif #4
Согласно формату файла.
Примерное описание- http://el-izdanie.narod.ru/gl3/3-2.htm
Старая тема- Кодконвертера файла rtf в pdf
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
03.04.2014, 09:57  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #5
Avazart, спасибо большое за подсказку по PDF, по нему получилось! Хочу задать ещё вопрос - где можно более подробно изучить COM для разбора tiff? Я нашёл, например, эти ссылки:

http://www.blong.com/Conferences/Bor...++COM/3190.htm
http://www.rsdn.ru/article/com/introcom.xml

А где ещё можно прочитать про COM? Просто почитал данные темы и не совсем понятно - как и куда что подключать, какие настройки выбирать при настройке COM-объекта и т.п.
Заранее благодарю за помощь!
AdAgent
Объявления
03.04.2014, 09:57     Узнать количество страниц в документах с расширением *.pdf и *.tif
Avazart
Форумчанин
 Аватар для Avazart
5850 / 4559 / 191
Регистрация: 10.12.2010
Сообщений: 19,159
Записей в блоге: 16
03.04.2014, 10:35     Узнать количество страниц в документах с расширением *.pdf и *.tif #6
Про tiff не знаю, думаю для него можно найти использовать библиотеку без COM
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
03.04.2014, 12:52     Узнать количество страниц в документах с расширением *.pdf и *.tif #7
Для TIFF можно OLE-интерфейс MODI из MDIVWCTL.DLL:

Код Delphi
1
2
3
4
5
6
7
var doc :IDocument;
begin
  CoInitialize(nil);
  doc := tdocument.Create(nil);
  doc.create1(tifpath);
 
// doc.Images.Count - искомое количество страниц в многостраничном документе
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
04.04.2014, 07:47  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #8
raxp, спасибо за направление мысли, я начал использовать этот интерфейс и вроде уже первые ростки появились (по крайней мере, код стал уже выполняться ). Но возник такой вопрос. Вот мой код, где я считываю количество страниц:

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
WideString file, fN, dN;
int kolvo = 0;
 
for (int i=0; i < ListView1->Items->Count; i++)
{
dN = ListView1->Items->Item[i]->SubItems->Strings[0];
fN = ListView1->Items->Item[i]->Caption;
file = dN+"\\"+fN;
 
try
{
IDocument *doc;
doc->Create(file);//указывает здесь на ошибку!
ListView1->Items->Item[i]->SubItems->Add(doc->Images->Count);
kolvo = kolvo + doc->Images->Count;
doc->Close(0);
}
catch (...)
{
ShowMessage("Ошибка! Не удалось считать количество страниц");
ListView1->Items->Item[i]->SubItems->
Add("Не удалось считать количество страниц!");
}
 
}
Компиляция в порядке проходит, но когда я нажимаю кнопку именно считывания tiff-файлов, он выдаёт ошибку Access Violation. Как это можно исправить? Или где-то есть ошибка в коде? MODI_TLB.h прописан, CoInitialize не помогает (происходит то же самое).
Заранее благодарю за помощь.
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
04.04.2014, 09:59     Узнать количество страниц в документах с расширением *.pdf и *.tif #9
MODI интерфейс должен быть зарегистрирован в системе.
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
04.04.2014, 10:23  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #10
raxp, а что значит "зарегистрирован"? Где об этом можно почитать, узнать, как это сделать? А то впервые с подобными вопросами сталкиваюсь, пока не совсем понимаю эту технологию.
Заранее благодарю за помощь.
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
04.04.2014, 12:14     Узнать количество страниц в документах с расширением *.pdf и *.tif #11
Это значит, что для работы с OLE/COM интерфейсом MODI (Microsoft Office Document Imaging) данной библиотеки требуется ее зарегистрировать или установить Microsoft Office Document Imaging.

http://office.microsoft.com/en-us/he...001049034.aspx
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
04.04.2014, 18:42  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #12
raxp, MODI уже был установлен к моменту создания программы. В чём ещё может быть тогда проблема?
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
04.04.2014, 23:02     Узнать количество страниц в документах с расширением *.pdf и *.tif #13
Если MODI установлен и работает как отдельное приложение, т.е. запустив его вы в нем можете открыть многостраничный tiff, то значит и его OLE/COM интерфейс будет доступен и должен работать.
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
07.04.2014, 11:01  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #14
raxp, а вы можете тогда объяснить - в чём моя ошибка работы с интерфейсом? И что в приведённом вами коде означают CoInitialize(nil), tdocument, create1? Заранее благодарю за разъяснение.
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
07.04.2014, 23:25     Узнать количество страниц в документах с расширением *.pdf и *.tif #15
1- http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
2- класс TOleServer, надстройка над классами TComponent, IUnknown
3- метод интерфейса IDocument для доступа к файлу через OLE

Впрочем, вот вам моя либа для подсчета количества страниц в PDF и многостраничных TIFF:
http://www.youtube.com/watch?v=fMVUdx1AwEg
Вложения
Тип файла: zip Описание API вызова библиотеки GetPagesPdfTiff.DLL.zip (8.97 Мб, 12 просмотров)
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
08.04.2014, 12:58  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #16
raxp, спасибо вам огромное за вашу помощь! Буду разбираться))) Вот правда что-то не хочет билдер в проект библиотеку подключать. А при явном подключении dll не может найти функцию getpages... Хотя все условия выполнил для того, чтобы всё хорошо работало.
Ну да ладно, буду копать тогда эту либу)
Avazart
Форумчанин
 Аватар для Avazart
5850 / 4559 / 191
Регистрация: 10.12.2010
Сообщений: 19,159
Записей в блоге: 16
08.04.2014, 13:18     Узнать количество страниц в документах с расширением *.pdf и *.tif #17
Код C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Пример вызова (под С):
 
function TestDLL()
{
  // определяем новый тип DLL 
  getpagesdll = DLL.DefineDLL("MyDLL");
 
  // описываем вызываемую функцию 
  // последний параметр - возвращаемое значение, должен быть указан обязательно 
  proc = getpagesdll.DefineProc("getpages", *char);
 
  // загружаем DLL в память, связывая имя DLL-файла с созданным ранее типом DLL
  lib = DLL.Load("GetPagesPdfTiff.dll", "MyDLL");
 
  // вызываем функцию
  lib.getpages(pchar path): uint;
}
Мм... а что за DLL.DefineDLL() ??
что за
getpagesdll.DefineProc("getpages", *char);
*char ??

Код Delphi
1
getpages: function(path: pansichar): UINT; stdcall;
Вероятно
Код C++
1
unsigned int getpages(const char* str);
ну директива stdcall
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
14.04.2014, 07:16  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #18
raxp, ещё раз благодарю за помощь, я разобрался, и программа начала считать страницы. Только очень странно.
В общем, суть моей программы в том, чтобы выводить файлы в список и возле них по нажатию определённой кнопки появляется количество страниц. В основном у меня одностраничные файлы. Но возле некоторых появляется значение "-1" вместо "1".
Затем ещё такая странность обнаружилась. Первые три файла из списка программа считывает нормально, а следующий после них файл он не может прочитать и выдаёт ошибку. Затем, после этого файла, программа вновь считывает три файла и вновь на следующий выдаёт ошибку, что не удалось считать количество страниц. И получаются такие группки по три файла, разделённые файлами, у которых не удалось считать количество страниц. Лично я не поверил, что так совпали косячные файлы и разделились так чётко. Сначала я думал, что может это так с моей директорией происходит и решил проверить на весь диск. Но эта проверка подтвердило то, что было и в первоначальной директории - ровно та же картина.
Подскажите пожалуйста, в чём может быть дело? Заранее благодарю за помощь.

Добавлено через 22 минуты
Чуть было не забыл - вот мой код:

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Memo2->Clear();
AnsiString file, fN, dN;
int kolvo = 0;
HMODULE LibHandle;
typedef int _cdecl(*dll_fucntion)(char *);
dll_fucntion MyDllFunction = NULL;
 
for (int i=0; i < ListView1->Items->Count; i++)
{
dN = ListView1->Items->Item[i]->SubItems->Strings[0];
fN = ListView1->Items->Item[i]->Caption;
file = dN+"\\"+fN;
int str = 0;
 
try
{
LibHandle = LoadLibrary("GetPagesPdfTiff.dll");
if (!LibHandle)
{
   ShowMessage("Файл GetPagesPdfTiff не найден!");
}
MyDllFunction = (dll_fucntion)GetProcAddress(LibHandle,"getpages");
if (!MyDllFunction)
{
    ShowMessage("Ошибка чтения функции! Ищите ошибку в коде программы!");
}
str = MyDllFunction(file.c_str());
ListView1->Items->Item[i]->SubItems->Add(IntToStr(str));
kolvo = kolvo + str;
//ListView1->Items->Item[i]->SubItems->Add(MyDllFunction(file.c_str()));
//kolvo = kolvo + StrToInt(MyDllFunction(file.c_str()));
MyDllFunction = NULL;
}
catch (...)
{
ShowMessage("Ошибка! Не удалось считать количество страниц");
 
ListView1->Items->Item[i]->SubItems->
Add("Не удалось считать количество страниц!");
}
 
}
  ListBox1->Items->Add("Общее количество страниц: "+IntToStr(kolvo));
  ShowMessage("FINISH");
  Button4->Enabled = false;
  Button6->Enabled = true;
  FreeLibrary(LibHandle);
}
Добавлено через 7 минут
UPD:
С "-1" вроде бы разобрался - он так реагирует, если заглавными буквами написано расширение - т.е. "TIF", а не "tif". И ещё если написано "tiff" ставится "-1". Если исправить на "tif", то всё считывает хорошо.
По поводу групп - при приведённом выше коде теперь образуются группы по 5 файлов, а не по 3 И я не понимаю почему, честно говоря))
Заранее благодарю за помощь.
raxp
Модератор
9563 / 6115 / 416
Регистрация: 28.12.2010
Сообщений: 19,717
Записей в блоге: 1
14.04.2014, 07:46     Узнать количество страниц в документах с расширением *.pdf и *.tif #19
С "-1" вроде бы разобрался - он так реагирует, если заглавными буквами написано расширение - т.е. "TIF", а не "tif". И ещё если написано "tiff" ставится "-1". Если исправить на "tif", то всё считывает хорошо.
с этим пофиксил, благодарю, приложил.

По поводу групп - при приведённом выше коде теперь образуются группы по 5 файлов, а не по 3 И я не понимаю
а вот тут лучше приложите свои tif-ки на которых выбивает мне для тестов, в приложенной инструкции указывал, что работает с однослойными TIFF, посмотрю что можно сделать.
Вложения
Тип файла: zip Описание API вызова библиотеки GetPagesPdfTiff.DLL.zip (8.97 Мб, 8 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2014, 08:12     Узнать количество страниц в документах с расширением *.pdf и *.tif
Еще ссылки по теме:

Как узнать количество вернувшихся записей SELECT ? C++ Builder БД
C++ Builder Узнать количество подключений в сеансах
C++ Builder Очистка файлов с определённым расширением

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kevolk75
Новичок
1 / 1 / 0
Регистрация: 03.03.2013
Сообщений: 23
14.04.2014, 08:12  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif #20
Благодарю за помощь!
Вот тифы, с которыми я работаю:

Тифы1.zip

Тифы2.zip

Тифы3.zip

Я воспользовался вашей программой во вложении - никаких ошибок не выдаёт, считает правильно. Может быть, мой код не справляется с множеством файлов?))
Yandex
Объявления
14.04.2014, 08:12     Узнать количество страниц в документах с расширением *.pdf и *.tif
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Задать вопрос
Опции темы

Текущее время: 14:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2015, vBulletin Solutions, Inc.
Яндекс.Метрика