안녕하세요
OS는 XP 델파이는 6버전을 사용하고 있습니다.
프린터는 Epson N2500 과 HP 컬러 레이저젯이고요.
jpg 화일로 되어있는 이미지를 인쇄하고 있는데요.
이미지가 인쇄가 안되는 경우가 발생하여 문의합니다.
- 인쇄대상
인쇄하려고 하는 대상은 B5용지에 이미지 두개 (각각 500KB정도)이고
결과에 따라 인쇄할 이미지가 각각 다르므로 파일은 대략 1000개에서 2개를 선택해야합니다.
그리고 한번 인쇄할때 인쇄하는 장수는 300장정도입니다.
- 사용한 방법
첫번째 사용한 방법은 퀵리포트를 사용하여
DetailBefore 이벤트에 출력하려고 할 이미지를 동적으로 QRImage1, QRImage2 에 넣고 출력하였습니다.
위경우 300장 출력시 10장정도가 이미지가 인쇄또는 부분인쇄(하나의 이미지만 출력됨)되는 현상이
발생합니다.
두번째 사용한 방법은 퀵리포트를 전혀 사용하지 않고 TPrinter만 이용하여
StretchDIBits 함수를 사용하여 출력하였습니다.
위경우는 어느정도(때에따라 다름) 좌우 이미지가 다 출력되다가 갑자기 인쇄속도가 빨라지면서
이미지가 하나만 출력되는 현상이 발생합니다.
첫번째 경우는 랜덤하게 인쇄가 안되거나 부분인쇄가 되는 반면
두번째 경우는 한번 이미지가 부분인쇄가 되면 그 뒤로는 계속 부분인쇄가 된다는 것입니다.
혹시 원인이나 해결책 아시는 분은 답변 부탁드립니다.
이미지 인쇄하는 부분의 소스는 다음과 같습니다.
procedure TfrmGAC74B_1.PrintBmp(ARect: TRect; ABitmap: TBitmap);
var
Info: PBitmapInfo;
InfoSize: DWORD;
Image: Pointer;
ImageSize: DWORD;
Bits: HBITMAP;
DIBWidth, DIBHeight: Longint;
begin
Canvas.Lock;
try
with Printer, Canvas do
begin
Bits := ABitmap.Handle;
GetDIBSizes( Bits, InfoSize, ImageSize );
Info := AllocMem( InfoSize );
try
Image := AllocMem( ImageSize );
try
GetDIB( Bits, ABitmap.Palette, Info^, Image^ );
with Info^.bmiHeader do
begin
DIBWidth := biWidth;
DIBHeight := biHeight;
end;
StretchDIBits( Printer.Canvas.Handle,
ARect.Left, ARect.Top, ARect.Right, ARect.Bottom,
0, 0, DIBWidth, DIBHeight,
Image, Info^, DIB_RGB_COLORS, SRCCOPY );
finally
FreeMem( Image, ImageSize );
end;
finally
FreeMem( Info, InfoSize );
end;
end;
finally
Canvas.Unlock;
end;
end;
procedure TfrmGAC74B_1.PrintP(AKind, AID : string);
var
APIC : TBITMAP;
MyBMP : TImage;
MyJPEG : TJPEGImage;
i : Integer;
sPath, sPath1, sPath2, sDir : String;
begin
//이미지 경로는 여기서 결정됩니다. (AKind와 AID를 이용하여)
sPath1 := sDir + MakeNumStrF( nSequence3 , 3)+ '.Jpg';
sPath2 := sDir + MakeNumStrF( nSequence4 , 3)+ '.Jpg';
//이미지 경로는 여기서 결정됩니다.
MyJPEG := TJPEGImage.Create;
MyBMP := TImage.Create(Self);
APIC := TBitmap.Create;
try
MyJPEG.LoadFromFile(sPath1);
MYBMP.Picture.Bitmap.Assign(MyJPEG);
APIC.Assign(MYBMP.Picture);
PrintBmp(Rect(350,3600,1550,900),APIC);
printer.Canvas.TextOut( 1000 + EXX , 2000 + EYY, sPath1);
MyJPEG.LoadFromFile(sPath2);
MYBMP.Picture.Bitmap.Assign(MyJPEG);
APIC.Assign(MYBMP.Picture);
PrintBmp(Rect(2200,3600,1550,900),APIC);
printer.Canvas.TextOut( 1000 + EXX , 2100 + EYY, sPath2);
finally
MyJPEG.Free;
MyBMP.Free;
APIC.Free;
end;
end;
날 더운데 여름 잘 보내세요
|