Страница 1 из 1

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

Добавлено: 01 дек 2004, 11:22
cULt
Привет, великие умы Инета!!
Мне срочно нужно узнать из Дельфей количество страниц в pdf и tiff-документе для дальнейших математических действий с этим числом - кто знает - чиркните мне, плз, а то курсач сыплется! :cry:
Вообще никак не могу сделать... :?

Добавлено: 04 сен 2005, 16:50
skriaxit
У меня сейчас стоит точно такая же задача. Может кто за год узнал как это сделать?

Добавлено: 05 сен 2005, 11:55
LAngel
А посмотреть формат 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;

Добавлено: 05 сен 2005, 12:17
LAngel
Более общий вариант. а то предыдущий для 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;

Добавлено: 05 сен 2005, 22:27
skriaxit
2LAngel,

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

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