Guest User

Untitled

a guest
Aug 4th, 2010
78
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Procedure ShowFax(MessageId:integer;var Page: TfrPage;var ShowFaxQuery:TSDQuery;LowQualityPreview:boolean);
  2. var F1:TFileStream;
  3. Var BlobStream:TStream;
  4. var Attr,Filename:Pchar;
  5. var i,j:longword;
  6. var p:PByteArray;
  7. var b,TinyB:TBitMap;
  8. var Tif:Pointer;
  9. var w,h,bw,bh,iw:longword;
  10. var raster:array of longword;
  11. var frpic:TfrPictureView;
  12. var XRes,Yres:single;
  13. var Ypos:longword;
  14. var ReadResult:integer;
  15. var CurrentPageNumber:integer;
  16. var TinyRect:TRect;
  17.  
  18.   procedure WritePageNumberOnBitmap(var SBitmap:TBitMap;SPageNumber,FaxOrientation:integer);
  19.   var PSize:TSize;
  20.   var TextPageNumber:string;
  21.   var LB:Tbitmap;
  22.   var Rect:TRect;
  23.   begin
  24.   if SystemVariables.PrintPositionPageNumber<>'0' then
  25.     begin
  26.     LB:=Tbitmap.Create;
  27.     //297 высота
  28.     //210 ширина
  29.     //20 отступ снизу
  30.     LB.Canvas.Font.Size:=16;
  31.     //
  32.     TextPageNumber:=IntToStr(SPageNumber);
  33.     PSize:=LB.Canvas.TextExtent(TextPageNumber);
  34.     //
  35.     LB.Height:=PSize.cy;
  36.     LB.Width:=PSize.cx;
  37.     LB.Canvas.TextOut(0,0,TextPageNumber);
  38.  
  39.     if (FaxOrientation=0) or (FaxOrientation=2) then
  40.       begin
  41.       //сверху страницы
  42.       if (SystemVariables.PrintPositionPageNumber='1') then
  43.         Rect.Top:=Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
  44.       //снизу страницы
  45.       if (SystemVariables.PrintPositionPageNumber='2') then
  46.         Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DYmm)/3){отступ текста});
  47.       //
  48.       Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DXmm)/3))) div 2;
  49.       Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DXmm)/3);
  50.       Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DYmm)/3);
  51.       end;
  52.     //
  53.     if (FaxOrientation=1) or (FaxOrientation=3) then
  54.       begin
  55.       //сверху страницы
  56.       if (SystemVariables.PrintPositionPageNumber='1') then
  57.         Rect.Top:=Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
  58.       //снизу страницы
  59.       if (SystemVariables.PrintPositionPageNumber='2') then
  60.         Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DXmm)/3){отступ текста});
  61.       //
  62.       Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DYmm)/3))) div 2;
  63.       Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DYmm)/3);
  64.       Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DXmm)/3);
  65.       end;
  66.     //
  67.     SBitmap.Canvas.StretchDraw(Rect,LB);
  68.     //
  69.     LB.Free;
  70.     end;
  71.   end;
  72.  
  73. begin
  74.   Application.ProcessMessages;
  75.   CurrentPageNumber:=0;
  76.  
  77.   ShowFaxQuery.Active:=False;
  78.   ShowFaxQuery.SQL.Clear;
  79.   ShowFaxQuery.SQL.Add('select fax from faxmessages where id=:id;');
  80.   ShowFaxQuery.ParamByName('id').AsInteger:=MessageId;
  81.   ShowFaxQuery.Active:=True;
  82.   if (ShowFaxQuery.RecordCount>0) then
  83.     begin
  84.     CheckTempDir;
  85.     Filename:=Pchar(ExtractFilePath(Application.EXEName)+'temp\'+'tmp#'+IntToStr(MessageId)+'#tif.tif');
  86.  
  87.     //загружаем в поток
  88.     BlobStream:=ShowFaxQuery.CreateBlobStream(ShowFaxQuery.FieldByName('fax'),bmRead);
  89.     F1:=TFileStream.Create(Filename,fmCreate);
  90.     F1.CopyFrom(BlobStream,0);
  91.     F1.Free;
  92.     BlobStream.Free;
  93.  
  94.     ShowFaxQuery.Active:=False;
  95.     ShowFaxQuery.SQL.Clear;
  96.  
  97.     //открываем в бмп
  98.     Attr:='rw';
  99.     tif:=TiffOpen(Filename,Attr);
  100.     //
  101.     frpic:=TfrPictureView(Page.FindObject('Picture1'));
  102.     frpic.FillColor:=clWhite;
  103.     frpic.IsPrinting:=False;
  104.     //
  105.     if tif<>nil then
  106.       begin
  107.       repeat
  108.         TiffGetField(tif,TIFFTAG_IMAGEWIDTH,Addr(w));
  109.         TiffGetField(tif,TIFFTAG_IMAGELENGTH,Addr(h));
  110.         TiffGetField(tif,TIFFTAG_XRESOLUTION,Addr(XRes));
  111.         TiffGetField(tif,TIFFTAG_YRESOLUTION,Addr(Yres));
  112.  
  113.         SetLength(raster,w*h+1);
  114.         case (FaxOrientation) of
  115.         0:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
  116.         1:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPRIGHT,0);
  117.         2:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTRIGHT,0);
  118.         3:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTLEFT,0)
  119.         else
  120.           ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
  121.         end;
  122.  
  123.         b:=TBitMap.Create;
  124.         b.pixelformat:=pf8bit;
  125.         b.Canvas.Pen.Color:=clWhite;
  126.         b.Canvas.Brush.Color:=clWhite;
  127.         b.Transparent:=false;
  128.         //
  129.         if (FaxOrientation=0) or (FaxOrientation=2) then
  130.           begin
  131.           b.width:=Trunc(A4InchWidth*Xres);
  132.           b.height:=Trunc(A4InchHeight*Yres);
  133.           end;
  134.         //
  135.         if (FaxOrientation=1) or (FaxOrientation=3) then
  136.           begin
  137.           b.width:=Trunc(A4InchHeight*Yres);
  138.           b.height:=Trunc(A4InchWidth*Xres);
  139.           end;
  140.         //
  141.         Ypos:=0;
  142.         if ReadResult<>0 then
  143.           begin
  144.           repeat
  145.             //
  146.             if ((Trunc(A4InchHeight*Yres)+Ypos)<=h) then bh:=(Trunc(A4InchHeight*Yres)-1) else bh:=h-1-Ypos;
  147.             //
  148.             if (Trunc(A4InchWidth*Xres)<=w) then bw:=(Trunc(A4InchWidth*Xres)-1) else bw:=w-1;
  149.             //
  150.             if Ypos<>0 then
  151.               b.Canvas.Rectangle(0,0,b.Width,b.Height);
  152.             //
  153.             if (FaxOrientation=0) or (FaxOrientation=2) then
  154.               begin
  155.               //
  156.               for i:=0 to bh do
  157.                 begin
  158.                 p:=B.ScanLine[i];
  159.                 iw:=(i+Ypos)*w;
  160.                 for j:=0 to bw do
  161.                   p[j]:=Raster[iw+j];
  162.                 end;
  163.               end;
  164.             //
  165.             if (FaxOrientation=1) or (FaxOrientation=3) then
  166.               begin
  167.               for i:=0 to bw do
  168.                 begin
  169.                 p:=B.ScanLine[i];
  170.  
  171.                 for j:=0 to bh do
  172.                 p[j]:=Raster[(j+Ypos)*w+i];
  173.                 end;
  174.               end;
  175.             //
  176.             inc(CurrentPageNumber);
  177.             WritePageNumberOnBitmap(b,CurrentPageNumber,FaxOrientation);
  178.             //assig low quality image to save memory usage
  179.             if LowQualityPreview then
  180.               begin
  181.               TinyB:=TBitmap.Create;
  182.               TinyB.Height:=Trunc((b.Height*50)/YRes);
  183.               TinyB.Width:=Trunc((b.Width*50)/XRes);
  184.               TinyRect.Left:=0;TinyRect.Top:=0;
  185.               TinyRect.Right:=TinyB.Width;
  186.               TinyRect.Bottom:=TinyB.Height;
  187.               TinyB.Canvas.StretchDraw(TinyRect,b);
  188.               frpic.Picture.Bitmap:=TinyB;
  189.               TinyB.Free;
  190.               end
  191.             else
  192.               begin
  193.               frpic.Picture.Bitmap:=b;
  194.               end;
  195.             //
  196.             frpic.Picture.Bitmap.Monochrome:=True;
  197.             frpic.Picture.Bitmap.PixelFormat:=pf1bit;
  198.             //
  199.             Page.ShowBandByName('MasterData1');
  200.             //
  201.             Ypos:=Ypos+Trunc(A4InchHeight*Yres);
  202.           //2 Дюйма отбрасываем
  203.           until ((Ypos+Trunc(2*Yres))>h);
  204.           end
  205.         else
  206.           begin
  207.           b.Canvas.Rectangle(0,0,b.Width,b.Height);
  208.           b.Canvas.Font.Size:=36;
  209.           b.Canvas.Pen.Color:=clBlack;
  210.           b.Canvas.TextOut(Trunc(2.5*Xres),Trunc(5*Yres),'Помилка вiдкриття сторiнки');
  211.           //
  212.           frpic.Picture.Bitmap:=b;
  213.           Page.ShowBandByName('MasterData1');
  214.           end;
  215.         //
  216.         SetLength(raster,0);
  217.         b.Free;
  218.       until (TiffReadDirectory(tif)=0);
  219.       end;
  220.     //сбрасываем ориентацию факса
  221.     FaxOrientation:=0;
  222.     //закрываем тифф
  223.     if tif<>nil then
  224.       TiffClose(tif);
  225.     //удаляем
  226.     DeleteFile(Filename);
  227.     end;
  228. end;
RAW Paste Data