Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2011, 10:02   #1
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию В чем загвоства, C++

Прога

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if (OpenDialog1->Execute())
   {
      LoadPdfFile(OpenDialog1->FileName);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadPdfFile(AnsiString filename)
{
   TStringList *pdf = new TStringList;
   AnsiString pdf_file = filename;

   pdf->LoadFromFile(pdf_file);
   int i, j;
   for (i; i<pdf->Text.Length(); i++)
   {
    if (Text.Pos("Page"))
    {
    j++;
    }
   }
   MessageDlg("Документ содержит " + IntToStr(j) + " страниц", mtInformation, TMsgDlgButtons() << mbOK, 0);

   delete pdf;
}
То есть я выбираю pdf файл, и пытаюсь найти там слово Page, но он что то не ищет, результат выводит 0
$ergius
Sergius X вне форума Ответить с цитированием
Старый 06.06.2011, 10:05   #2
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Откройте pdf файл с помощью блокнота и найдите там слово Page
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 06.06.2011, 10:19   #3
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

что вы имели в виду? Мне нужно посчитать сколько страниц содержит в себе выбранный файл pdf. Начало страницы начинается с /Page
$ergius
Sergius X вне форума Ответить с цитированием
Старый 06.06.2011, 10:27   #4
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Я открыл pdf файл с помощью блокнота и увидел это...
Цитата:
ўЂі5«п±Yќ§чІ|©нк
Р’EЉ6w!UFI=«*оКЫY1N— jрBу‘э+JVжј¶т3<6ЦЙpн+Ѓ9@ЯЇ>µ¦тЪk<±v 9гЁП8ч*Kя
Таким же образом открывает файл pdf ваш алгоритм и видит тоже самое.
Используйте акробатовские библиотеки для открытия и чтения pdf файлов.

upd: хотя действительно есть слова Page, Pages... Попробуйте найти /Count, справа от него количество страниц

Pos - ищет первую попавшуюся строку в тексте.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 06.06.2011 в 10:38.
Sparkman вне форума Ответить с цитированием
Старый 06.06.2011, 10:33   #5
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

То что вы скопировали, это всего лишь навсего текст. Просмотрите весь файл и вы увидите допустим это:
Код:
3 0 obj
<< 
   /Type /Page
   /Parent 2 0 R
   /Resources << 
   /ProcSet [/PDF /Text ]
   /Font << 
   /F1 6 0 R
   /F2 9 0 R
>>
>>
   /MediaBox [0 0 595 842]
   /Contents 4 0 R
>>
endobj
Это описание объекта содержащего страницу, вот я и хочу посчитать сколько страниц содежит файл

Count не подходит, так как он не везде указан. А страница начинается именно с /Page. Но есть еще проблемка в том что по идее он будет учитывать такие слова как Pages, PageMode, а мне это надо как то обойти...
$ergius

Последний раз редактировалось Sergius X; 06.06.2011 в 10:35.
Sergius X вне форума Ответить с цитированием
Старый 07.06.2011, 06:23   #6
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

Ну я сделал так:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if (OpenDialog1->Execute())
   {
      LoadPdfFile(OpenDialog1->FileName);
      CreateXMLFile(OpenDialog1->FileName);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadPdfFile(AnsiString filename)
{
   TStringList *pdf = new TStringList;
   AnsiString pdf_file = filename;

   pdf->LoadFromFile(pdf_file);
   int i, j;

   for (i; i<pdf->Count; i++)
   {
    if (pdf->Strings[i].Pos("Page"))
    {
    j++;
    }
   }
   MessageDlg("Документ содержит " + IntToStr(j) + " страниц", mtInformation, TMsgDlgButtons() << mbOK, 0);

   delete pdf;
}
Теперь надо как то избавиться от проблемы того что он считает не только слово "Page", но и похожие "PageMode", "Pages"
$ergius
Sergius X вне форума Ответить с цитированием
Старый 07.06.2011, 06:35   #7
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

проверяйте символ за словом "Page", если там не "s" или "M", то увеличить счетчик.
Pos возвращает индекс первой буквы искомой строки, а не логическое значение.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 07.06.2011, 06:51   #8
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Sparkman Посмотреть сообщение
проверяйте символ
А не могли бы это кодом набросать?))
$ergius
Sergius X вне форума Ответить с цитированием
Старый 07.06.2011, 07:00   #9
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Цитата:
Сообщение от Sergius X Посмотреть сообщение
А не могли бы это кодом набросать?))
Примерно так:
Код:
   for (i; i<pdf->Count; i++)
   {
    if (pdf->Strings[i][pdf->Strings[i].Pos("Page")+4] !="s")&&(pdf->Strings[i][pdf->Strings[i].Pos("Page")+4] !="M")
    {
    j++;
    }
   }
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 07.06.2011, 17:28   #10
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

Да и встречаются не только слова где следующая буква s или M, но и другие могут быть, которые неизвестны
Лучше наверное как нибудь сделать
Код:
if (pdf->Strings[i][pdf->Strings[i].Pos("Page")+4] ="")
Только тогда выдает вот это:
[C++ Error] Unit1.cpp(37): E2034 Cannot convert 'char *' to 'char'
[C++ Warning] Unit1.cpp(37): W8060 Possibly incorrect assignment

А на ваш код выдает
[C++ Error] Unit1.cpp(37): E2034 Cannot convert 'char' to 'char *'
[C++ Error] Unit1.cpp(37): E2188 Expression syntax
[C++ Error] Unit1.cpp(42): E2379 Statement missing ;
$ergius

Последний раз редактировалось Sergius X; 07.06.2011 в 17:58.
Sergius X вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем дело? sanja155 Помощь студентам 1 17.12.2010 01:51
В чем ошибка? bwitcher Помощь студентам 8 11.12.2010 14:46
В ЧЕМ ОШИБКА? salmanbaz Общие вопросы C/C++ 5 11.01.2009 13:21
В чем я не прав?С++ diden Помощь студентам 3 23.05.2008 18:32
Чем отличается AX от BX? veter_s_morya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.05.2008 16:50