Encontre esta super funcion:
Código Delphi
[-]procedure TForm5.Button1Click(Sender: TObject);
var
wPage, hPage, xPPI, yPPI, wTwips, hTwips: integer;
pageRect, rendRect: TRect;
po: TPageOffset;
fr: TFormatRange;
lastOffset, currPage, pageCount: integer;
xOffset, yOffset: integer;
FPageOffsets: array of TPageOffset;
TextLenEx: TGetTextLengthEx;
firstPage: boolean;
begin
wPage := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH);
hPage := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT);
xPPI := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
yPPI := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
wTwips := MulDiv(wPage, 1440, xPPI);
hTwips := MulDiv(hPage, 1440, yPPI);
with pageRect do
begin
Left := 0;
Top := 0;
Right := wTwips;
Bottom := hTwips
end;
with rendRect do
begin
Left := 0;
Top := 0;
Right := pageRect.Right - (1440 * 4);
Bottom := pageRect.Bottom - (1440 * 4)
end;
po.mStart := 0;
with fr do
begin
hdc := Printer.Handle;
hdcTarget := Printer.Handle;
chrg.cpMin := po.mStart;
chrg.cpMax := -1;
end;
if RichEditVersion >= 2 then
begin
with TextLenEx do
begin
flags := GTL_DEFAULT;
codepage := CP_ACP;
end;
lastOffset := SendMessage(form2.docView.Handle, EM_GETTEXTLENGTHEX, wParam(@TextLenEx), 0)
end
else
lastOffset := SendMessage(form2.docView.Handle, WM_GETTEXTLENGTH, 0, 0);
SendMessage(form2.docView.Handle, EM_FORMATRANGE, 0, 0);
SaveDC(fr.hdc);
SetMapMode(fr.hdc, MM_TEXT);
xOffset := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
yOffset := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
xOffset := xOffset + MulDiv(1440 + 1440, xPPI, 1440);
yOffset := yOffset + MulDiv(1440 + 1440, yPPI, 1440);
SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil);
while ((fr.chrg.cpMin <> -1) and (fr.chrg.cpMin < lastOffset)) do
begin
fr.rc := rendRect;
fr.rcPage := pageRect;
po.mStart := fr.chrg.cpMin;
fr.chrg.cpMin := SendMessage(form2.docView.Handle, EM_FORMATRANGE, 0, Longint(@fr));
po.mEnd := fr.chrg.cpMin - 1;
po.rendRect := fr.rc;
if High(FPageOffsets) = -1 then SetLength(FPageOffsets, 1)
else
SetLength(FPageOffsets, Length(FPageOffsets) + 1);
FPageOffsets[High(FPageOffsets)] := po
end;
pageCount := Length(FPageOffsets);
ShowMessage(Format('Han sido enviadas %d paginas', [pageCount]));
SendMessage(form2.docView.Handle, EM_FORMATRANGE, 0, 0);
RestoreDC(fr.hdc, - 1);
Printer.BeginDoc;
fr.hdc := Printer.Handle;
fr.hdcTarget := Printer.Handle;
SaveDC(fr.hdc);
SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil);
firstPage := True;
currPage := 0; pageCount := 1; while (currPage < pageCount) do
begin
if firstPage then firstPage := False
else
Printer.NewPage;
SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil);
fr.rc := FPageOffsets[currPage].rendRect;
fr.rcPage := pageRect;
fr.chrg.cpMin := FPageOffsets[currPage].mStart;
fr.chrg.cpMax := FPageOffsets[currPage].mEnd;
fr.chrg.cpMin := SendMessage(form2.docView.Handle, EM_FORMATRANGE, 1, Longint(@fr));
Inc(currPage);
end;
RestoreDC(fr.hdc, - 1);
Printer.EndDoc;
fr.chrg.cpMin := SendMessage(form2.docView.Handle, EM_FORMATRANGE, 0, 0);
Finalize(FPageOffsets);
form5.Hide;
end;
Si alguien imprime con esta funcion notará que la impresion sale centrada en la pagina A4, sin embargo, los margenes de los 4 lados son excesivamente grandes, si alguien pudiera agregar a esta funcion los margenes en centimetros, este tema quedaria cerrado para siempre.
Atte
Americo