Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Procedure ShowFax(MessageId:integer;var Page: TfrPage;var ShowFaxQuery:TSDQuery;LowQualityPreview:boolean);
- var F1:TFileStream;
- Var BlobStream:TStream;
- var Attr,Filename:Pchar;
- var i,j:longword;
- var p:PByteArray;
- var b,TinyB:TBitMap;
- var Tif:Pointer;
- var w,h,bw,bh,iw:longword;
- var raster:array of longword;
- var frpic:TfrPictureView;
- var XRes,Yres:single;
- var Ypos:longword;
- var ReadResult:integer;
- var CurrentPageNumber:integer;
- var TinyRect:TRect;
- procedure WritePageNumberOnBitmap(var SBitmap:TBitMap;SPageNumber,FaxOrientation:integer);
- var PSize:TSize;
- var TextPageNumber:string;
- var LB:Tbitmap;
- var Rect:TRect;
- begin
- if SystemVariables.PrintPositionPageNumber<>'0' then
- begin
- LB:=Tbitmap.Create;
- //297 высота
- //210 ширина
- //20 отступ снизу
- LB.Canvas.Font.Size:=16;
- //
- TextPageNumber:=IntToStr(SPageNumber);
- PSize:=LB.Canvas.TextExtent(TextPageNumber);
- //
- LB.Height:=PSize.cy;
- LB.Width:=PSize.cx;
- LB.Canvas.TextOut(0,0,TextPageNumber);
- if (FaxOrientation=0) or (FaxOrientation=2) then
- begin
- //сверху страницы
- if (SystemVariables.PrintPositionPageNumber='1') then
- Rect.Top:=Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
- //снизу страницы
- if (SystemVariables.PrintPositionPageNumber='2') then
- Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DYmm)/3){отступ текста});
- //
- Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DXmm)/3))) div 2;
- Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DXmm)/3);
- Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DYmm)/3);
- end;
- //
- if (FaxOrientation=1) or (FaxOrientation=3) then
- begin
- //сверху страницы
- if (SystemVariables.PrintPositionPageNumber='1') then
- Rect.Top:=Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
- //снизу страницы
- if (SystemVariables.PrintPositionPageNumber='2') then
- Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DXmm)/3){отступ текста});
- //
- Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DYmm)/3))) div 2;
- Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DYmm)/3);
- Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DXmm)/3);
- end;
- //
- SBitmap.Canvas.StretchDraw(Rect,LB);
- //
- LB.Free;
- end;
- end;
- begin
- Application.ProcessMessages;
- CurrentPageNumber:=0;
- ShowFaxQuery.Active:=False;
- ShowFaxQuery.SQL.Clear;
- ShowFaxQuery.SQL.Add('select fax from faxmessages where id=:id;');
- ShowFaxQuery.ParamByName('id').AsInteger:=MessageId;
- ShowFaxQuery.Active:=True;
- if (ShowFaxQuery.RecordCount>0) then
- begin
- CheckTempDir;
- Filename:=Pchar(ExtractFilePath(Application.EXEName)+'temp\'+'tmp#'+IntToStr(MessageId)+'#tif.tif');
- //загружаем в поток
- BlobStream:=ShowFaxQuery.CreateBlobStream(ShowFaxQuery.FieldByName('fax'),bmRead);
- F1:=TFileStream.Create(Filename,fmCreate);
- F1.CopyFrom(BlobStream,0);
- F1.Free;
- BlobStream.Free;
- ShowFaxQuery.Active:=False;
- ShowFaxQuery.SQL.Clear;
- //открываем в бмп
- Attr:='rw';
- tif:=TiffOpen(Filename,Attr);
- //
- frpic:=TfrPictureView(Page.FindObject('Picture1'));
- frpic.FillColor:=clWhite;
- frpic.IsPrinting:=False;
- //
- if tif<>nil then
- begin
- repeat
- TiffGetField(tif,TIFFTAG_IMAGEWIDTH,Addr(w));
- TiffGetField(tif,TIFFTAG_IMAGELENGTH,Addr(h));
- TiffGetField(tif,TIFFTAG_XRESOLUTION,Addr(XRes));
- TiffGetField(tif,TIFFTAG_YRESOLUTION,Addr(Yres));
- SetLength(raster,w*h+1);
- case (FaxOrientation) of
- 0:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
- 1:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPRIGHT,0);
- 2:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTRIGHT,0);
- 3:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTLEFT,0)
- else
- ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
- end;
- b:=TBitMap.Create;
- b.pixelformat:=pf8bit;
- b.Canvas.Pen.Color:=clWhite;
- b.Canvas.Brush.Color:=clWhite;
- b.Transparent:=false;
- //
- if (FaxOrientation=0) or (FaxOrientation=2) then
- begin
- b.width:=Trunc(A4InchWidth*Xres);
- b.height:=Trunc(A4InchHeight*Yres);
- end;
- //
- if (FaxOrientation=1) or (FaxOrientation=3) then
- begin
- b.width:=Trunc(A4InchHeight*Yres);
- b.height:=Trunc(A4InchWidth*Xres);
- end;
- //
- Ypos:=0;
- if ReadResult<>0 then
- begin
- repeat
- //
- if ((Trunc(A4InchHeight*Yres)+Ypos)<=h) then bh:=(Trunc(A4InchHeight*Yres)-1) else bh:=h-1-Ypos;
- //
- if (Trunc(A4InchWidth*Xres)<=w) then bw:=(Trunc(A4InchWidth*Xres)-1) else bw:=w-1;
- //
- if Ypos<>0 then
- b.Canvas.Rectangle(0,0,b.Width,b.Height);
- //
- if (FaxOrientation=0) or (FaxOrientation=2) then
- begin
- //
- for i:=0 to bh do
- begin
- p:=B.ScanLine[i];
- iw:=(i+Ypos)*w;
- for j:=0 to bw do
- p[j]:=Raster[iw+j];
- end;
- end;
- //
- if (FaxOrientation=1) or (FaxOrientation=3) then
- begin
- for i:=0 to bw do
- begin
- p:=B.ScanLine[i];
- for j:=0 to bh do
- p[j]:=Raster[(j+Ypos)*w+i];
- end;
- end;
- //
- inc(CurrentPageNumber);
- WritePageNumberOnBitmap(b,CurrentPageNumber,FaxOrientation);
- //assig low quality image to save memory usage
- if LowQualityPreview then
- begin
- TinyB:=TBitmap.Create;
- TinyB.Height:=Trunc((b.Height*50)/YRes);
- TinyB.Width:=Trunc((b.Width*50)/XRes);
- TinyRect.Left:=0;TinyRect.Top:=0;
- TinyRect.Right:=TinyB.Width;
- TinyRect.Bottom:=TinyB.Height;
- TinyB.Canvas.StretchDraw(TinyRect,b);
- frpic.Picture.Bitmap:=TinyB;
- TinyB.Free;
- end
- else
- begin
- frpic.Picture.Bitmap:=b;
- end;
- //
- frpic.Picture.Bitmap.Monochrome:=True;
- frpic.Picture.Bitmap.PixelFormat:=pf1bit;
- //
- Page.ShowBandByName('MasterData1');
- //
- Ypos:=Ypos+Trunc(A4InchHeight*Yres);
- //2 Дюйма отбрасываем
- until ((Ypos+Trunc(2*Yres))>h);
- end
- else
- begin
- b.Canvas.Rectangle(0,0,b.Width,b.Height);
- b.Canvas.Font.Size:=36;
- b.Canvas.Pen.Color:=clBlack;
- b.Canvas.TextOut(Trunc(2.5*Xres),Trunc(5*Yres),'Помилка вiдкриття сторiнки');
- //
- frpic.Picture.Bitmap:=b;
- Page.ShowBandByName('MasterData1');
- end;
- //
- SetLength(raster,0);
- b.Free;
- until (TiffReadDirectory(tif)=0);
- end;
- //сбрасываем ориентацию факса
- FaxOrientation:=0;
- //закрываем тифф
- if tif<>nil then
- TiffClose(tif);
- //удаляем
- DeleteFile(Filename);
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement