La Web del Programador: Comunidad de Programadores
 
    Pregunta:  11730 - COMO SABER CUANTAS HOJAS OCUPA CUALQUIER ARCHIVO
Autor:  Maria del Carmen Ontiveros
Hola! Necesito ayuda con esto por favor envienme algo relacionado con mi inquietud.
Estoy realizando una aplicación donde obtengo un archivo de cualquier directorio, necesito saber cuantas páginas ocupa ese archivo para mandarlo a imprimir.

  Respuesta:  Luis Fernandez
Bueno, como la anterior respuesta ha sido un poco pobre ahi te mando algo de código que he hecho. Analizalo y veras como te va bien. Yo lo he probado y funciona. Es un poco mas extendido de lo que necesitas pero pienso que asi es mejor. Si tienes dudas consultamelo sin problemas

Esta no tiene nada que ver con lo que pides pero es muy interesante
====================================================================
function CountLines(const Filename:String):Integer;
const
BufferSize=1024;
SearchByte=10;
var
FileHandle,BytesRead,Index:Integer;
Buffer:array[1..BufferSize] of byte;
begin
try
FileHandle:=FileOpen(Filename,fmOpenRead or fmShareDenyWrite);
BytesRead:=FileRead(FileHandle,Buffer[1],BufferSize);
if(BytesRead>0) then Result:=1 else Result:=0;
repeat
for index:=1 to Min(BufferSize,BytesRead) do
begin
if (Buffer[index]=SearchByte) then inc(Result);
end;//for
BytesRead:=FileRead(FileHandle,Buffer[1],BufferSize);
until (BytesRead<=0);
finally
fileclose(FileHandle);
end;
end;

================================================================================
Esta es por si quieres ponerle cabecera al escrito (¡¡¡con logo y todo!!!)

procedure TForm1.Cabecera(iMargenIzq, iMargenDer, iMargenSup, iPagina: Integer;
sTitulo: String);// logo: TBitmap);
var
X, Y: Integer;
Rect1: TRect;
begin
// Añade al título el número de página.
sTitulo := sTitulo + '. Página: ' + IntToStr(iPagina);
X := iMargenIzq;
Y := iMargenSup div 4;
// Dibuja el título de la página.
Printer.Canvas.TextOut(X, 3 * Y, sTitulo);
// dibuja el logotipo de la empresa.
X := Round(iMargenDer * 0.75);
Rect1 := Rect(X, Y, iMargenDer, 3 * Y);
//Printer.Canvas.StretchDraw(Rect1, logo);
// Dibuja una línea de separación.
Printer.Canvas.MoveTo(iMargenIzq, iMargenSup);
Printer.Canvas.Pen.Width := 2;
Printer.Canvas.LineTo(iMargenDer, iMargenSup);
end;

===============================================================
Esta es la que pides

procedure TForm1.SpeedButton2Click(Sender: TObject);
var
sTitulo: String;
iInterLinea: integer;
iNumLinea: integer;
iTotalLineas: integer;
x, y, i: integer;
iMargenIzq, iMargenDer, iMargenInf, iMargenSup : Integer;
begin
if PrintDialog1.Execute then
begin
try
Screen.Cursor := crHourGlass;
// Abre el fichero a imprimir.
// Inicia el trabajo de impresión.
Printer.BeginDoc;

// Imprime con el mismo tipo de fuente definida
// en el control TRichEdit.
// Debe tenerse en cuenta que si TRcihEdit es demasiado
// ancho no se imprimirá la línea completa.
Printer.Canvas.Font.name:=RichEdit1.Selattributes.name;
Printer.Canvas.Font.Size:=RichEdit1.SelAttributes.size;
Printer.Canvas.Font.color:=RichEdit1.SelAttributes.color;
Printer.Canvas.Font.style:=RichEdit1.SelAttributes.style;

// Calcula el espacio entre líneas.
iInterLinea := Printer.Canvas.TextHeight('A') + 10;

// Inicializa el aspecto del documento.
iMargenIzq := Printer.PageWidth div 5;
iMargenDer := Round(Printer.PageWidth * 0.95);
iMargenSup := iInterLinea * 4;
iMargenInf := Printer.PageHeight - iInterLinea * 2;
sTitulo := 'Hola';//FormMemo.Caption;

// Cálculo del total de líneas por página.
iTotalLineas := (iMargenInf - iMargenSup) div iInterLinea;

// Imprime la cabecera de página.
//Cabecera(iMargenIzq, iMargenDer, iMargenSup, Printer.PageNumber, sTitulo);//, logo);
iNumLinea := 1;
for i:= 0 to RichEdit1.Lines.Count -1 do
begin
// Imprime línea a línea.
Y := iNumLinea * iInterLinea + iMargenSup;
X := iMargenIzq;
//Printer.Canvas.TextOut(X,Y,RichEdit1.Lines[i]);
// Actualiza el número de línea. Si se alcanza
// el final de la página se abre una nueva.
Inc(iNumLinea);
If iNumLinea > iTotalLineas Then
begin
iNumLinea := 1;
Printer.NewPage;
Edit2.Text:=inttostr(Printer.PageNumber); //aqui te indica en numero de paginas
//Cabecera(iMargenIzq, iMargenDer, iMargenSup, Printer.PageNumber, sTitulo);//, logo);
end;
end;
// Cierra el trabajo de impresión.
Printer.Abort;
//Printer.EndDoc; //Si sequiere imprimir desactivar linea anterior
// y activar esta
except
Printer.Abort;
end;
end;
Screen.Cursor := crDefault;
end;

  Respuesta:  Luis Fernandez Fernandez
La solucion más rapida y sencilla es utilizar QuickReport y en vez de ejecutar Print, hacerlo con Preview. De esta forma ves en pantalla el informe con el numero total de paginas y si te interesa desde alli lo mandas imprimir.
Otra mas costosa es contar las lineas que tiene el fichero; por ejemplo cargado en un Memo; implementas una funcion que imprima X lineas por pagina y hallar las paginas es sencillo basta con dividir