Как узнать из Delphi количество страниц pdf-tiff-документа?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
cULt
Сообщения: 1
Зарегистрирован: 30 ноя 2004, 16:25

Привет, великие умы Инета!!
Мне срочно нужно узнать из Дельфей количество страниц в pdf и tiff-документе для дальнейших математических действий с этим числом - кто знает - чиркните мне, плз, а то курсач сыплется! :cry:
Вообще никак не могу сделать... :?
skriaxit
Сообщения: 5
Зарегистрирован: 31 авг 2005, 17:37
Контактная информация:

У меня сейчас стоит точно такая же задача. Может кто за год узнал как это сделать?
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

А посмотреть формат PDF файла??? :)

Код: Выделить всё

function GetPDFPageNumber(FName: TFileName): Integer;
var
  ST: TFileStream;
  S: String;
  c: Char;
  i : Integer;
begin
  ST := TFileStream.Create(FName, fmOpenRead);
  try
    S :='';
    While LowerCase(RightStr(S, 3)) <> 'obj' do
    begin
      S :='';
      ST.ReadBuffer(C, 1);
      while (C <> #13) and (C <> #10) do
      begin
        S := S + C;
        ST.ReadBuffer(C, 1);
      end;
    end;
    While LowerCase(LeftStr(S, 2)) <> '/n' do
    begin
      S :='';
      ST.ReadBuffer(C, 1);
      while (C <> #13) and (C <> #10) do
      begin
        S := S + C;
        ST.ReadBuffer(C, 1);
      end;
    end;
    S := Trim(RightStr(S, Length(S)-2));
    Result := StrToInt(S);
  finally
    ST.Free;
  end;
end;
uses StrUtils;
С уважением, Lost Angel...
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Более общий вариант. а то предыдущий для 1.5 версии уже не подходит:

Код: Выделить всё

function GetPDFPageNumber(FName: TFileName): Integer;
var
  ST: TFileStream;
  S, R: String;
  c: Char;
  i : Integer;
begin
  ST := TFileStream.Create(FName, fmOpenRead);
  try
    S :='';
    ST.ReadBuffer(C, 1);
    While pos('obj', S) = 0 do
    begin
      S :='';
      while (C <> #13) and (C <> #10) do
      begin
        S := S + LowerCase(c);
        ST.ReadBuffer(C, 1);
      end;
      while (C = #13) or (C = #10) do ST.ReadBuffer(C, 1);
    end;
    While pos('endobj', S) <= 0 do
    begin
      S := S + LowerCase(c);
      ST.ReadBuffer(C, 1);
    end;
    S := trim(copy(S, pos('/n', S)+2, Length(S) - pos('/n', s)-2));
    i := 1;
    R := '';
    while S[i] in ['0'..'9'] do
    begin
      R := R + S[i];
      inc(i);
    end;
    Result := StrToInt(R);
  finally
    ST.Free;
  end;
end;
С уважением, Lost Angel...
skriaxit
Сообщения: 5
Зарегистрирован: 31 авг 2005, 17:37
Контактная информация:

2LAngel,

К сожалению, эта функция будет работать менее, чем в половине случаев. Посмотри, например, pdf, созданный при помощи acrobat distiller'a и open office'a. Та же ситуация со всеми другими программами для создания pdf. А нужно универсальное решение.

PS: Конечно, можно покопаться в спецификации pdf и tiff и сваять решение, но это непростительная и ненужная трата времени. Я уверен, что уже существует готовое решение. Зачем изобретать велосипед, если его можно купить?
Ответить