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

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

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

Добавлено через 1 час 9 минут
Да, забыл уточнить - это нужно сделать в C++ Builder 6.
AdAgent
Объявления
14.03.2014, 09:10    Узнать количество страниц в документах с расширением *.pdf и *.tif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 09:10    Узнать количество страниц в документах с расширением *.pdf и *.tif

Посмотрите здесь:

C++ Builder БД как сохранить данные с расширением .doc

C++ Builder SaveDialog - как сохранить файл с расширением

C++ Builder Как узнать имена и количество файлов в определенной папке

C++ Builder Работа с ini.Как в секции узнать количество ключей?

C++ Builder Как узнать количество форм в проекте

C++ Builder Поиск по словам в файлах с расширением *.mht

Avazart
Форумчанин
5076 / 4073 / 133
Регистрация: 10.12.2010
Сообщений: 16,055
Записей в блоге: 16
14.03.2014, 23:50     Узнать количество страниц в документах с расширением *.pdf и *.tif   #2
Разбором самого файла - это раз, второй через COM
kevolk75
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
17.03.2014, 04:05  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif   #3
Avazart, а что вы подразумеваете под разбором самого файла? И можно где-нибудь посмотреть примеры разбора подобных задач?
И ещё один вопрос - через SDK это возможно сделать? А то я прочитал на него документацию и там прямо есть функция получения количества страниц документа pdf.
Заранее благодарю за помощь.
Avazart
Форумчанин
5076 / 4073 / 133
Регистрация: 10.12.2010
Сообщений: 16,055
Записей в блоге: 16
17.03.2014, 04:18     Узнать количество страниц в документах с расширением *.pdf и *.tif   #4
Согласно формату файла.
Примерное описание- http://el-izdanie.narod.ru/gl3/3-2.htm
Старая тема- Кодконвертера файла rtf в pdf
kevolk75
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
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
Форумчанин
5076 / 4073 / 133
Регистрация: 10.12.2010
Сообщений: 16,055
Записей в блоге: 16
03.04.2014, 10:35     Узнать количество страниц в документах с расширением *.pdf и *.tif   #6
Про tiff не знаю, думаю для него можно найти использовать библиотеку без COM
raxp
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
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
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
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
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
04.04.2014, 09:59     Узнать количество страниц в документах с расширением *.pdf и *.tif   #9
MODI интерфейс должен быть зарегистрирован в системе.
kevolk75
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
04.04.2014, 10:23  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif   #10
raxp, а что значит "зарегистрирован"? Где об этом можно почитать, узнать, как это сделать? А то впервые с подобными вопросами сталкиваюсь, пока не совсем понимаю эту технологию.
Заранее благодарю за помощь.
raxp
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
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
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
04.04.2014, 18:42  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif   #12
raxp, MODI уже был установлен к моменту создания программы. В чём ещё может быть тогда проблема?
raxp
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
04.04.2014, 23:02     Узнать количество страниц в документах с расширением *.pdf и *.tif   #13
Если MODI установлен и работает как отдельное приложение, т.е. запустив его вы в нем можете открыть многостраничный tiff, то значит и его OLE/COM интерфейс будет доступен и должен работать.
kevolk75
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
07.04.2014, 11:01  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif   #14
raxp, а вы можете тогда объяснить - в чём моя ошибка работы с интерфейсом? И что в приведённом вами коде означают CoInitialize(nil), tdocument, create1? Заранее благодарю за разъяснение.
raxp
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
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 Мб, 6 просмотров)
kevolk75
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
08.04.2014, 12:58  [ТС]     Узнать количество страниц в документах с расширением *.pdf и *.tif   #16
raxp, спасибо вам огромное за вашу помощь! Буду разбираться))) Вот правда что-то не хочет билдер в проект библиотеку подключать. А при явном подключении dll не может найти функцию getpages... Хотя все условия выполнил для того, чтобы всё хорошо работало.
Ну да ладно, буду копать тогда эту либу)
Avazart
Форумчанин
5076 / 4073 / 133
Регистрация: 10.12.2010
Сообщений: 16,055
Записей в блоге: 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
Новичок
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 19
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
Модератор
7948 / 5024 / 265
Регистрация: 28.12.2010
Сообщений: 15,580
Записей в блоге: 345
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 Мб, 5 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2014, 08:12    Узнать количество страниц в документах с расширением *.pdf и *.tif

Еще ссылки по теме:

C++ Builder Список всех файлов с заданным расширением

C++ Builder Как открыть файл с расширением dat

C++ Builder Открыть документ с расширением .pdf

C++ Builder БД Как узнать количество вернувшихся записей SELECT ?

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

Тифы1.zip

Тифы2.zip

Тифы3.zip

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

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