BSOne.SFC/eCrmHE/DLL_eCrmHeHelper/PrintWatermark/ProcessWM_SOLMIX.pas

204 lines
6.8 KiB
Plaintext

{*******************************************************}
{ }
{ ProcessWatermark }
{ }
{ Copyright (C) 2025 kku }
{ }
{*******************************************************}
unit ProcessWM_SOLMIX;
interface
uses
Winapi.Windows, System.Classes, Vcl.Graphics;
function ProcessWartermark_SOLMIX(DC: HDC; bStartPage: Boolean = true): Boolean;
implementation
uses
AppCtrlDefine, ApiHookPrint, BS1Hook, Tocsg.Safe, System.SysUtils, Condition,
Tocsg.Graphic, Winapi.GDIPAPI, Tocsg.Convert;
function ProcessWartermark_SOLMIX(DC: HDC; bStartPage: Boolean = true): Boolean;
var
nW, nH, i, nX, nY,
nGapW, nGapH, nDefDivFont: Integer;
sText: String;
MemCanvas: TCanvas;
hbmp, hOldBmp: HBITMAP;
pen: HPEN;
CtrlOpt: TAppCtrlOpt;
oldColor: TColor;
r: TRect;
begin
Result := true;
if _PrtDC <> DC then
exit;
// exit;
SaveDC(DC);
gAppHook.Helper.bIsWaterMaking_ := true;
try
try
if gAppHook.Helper.IsExcel then
begin
// 클리핑 제거 25_0605 14:51:11 kku
SelectClipRgn(DC, 0);
// 엑셀은 출력시트 설정에 따라 전체 영역으로 잡히는 않는 현상이 있다.. 24_0805 13:46:31 kku
nW := GetDeviceCaps(DC, HORZRES); // 세로모드 : 4961, 가로모드 : 7016, 크로미움 프린트 인쇄시 4760
nH := GetDeviceCaps(DC, VERTRES); // 세로모드 : 7016, 가로모드 : 4961, 크로미움 프린트 인쇄시 6814
// LogToReg('Step-1-excel', Format('W = %d, H = %d,', [nW, nH]));
end else
begin
// if bStartPage then // 이럴리 없겠지만 안전장치
// exit;
ZeroMemory(@r, SizeOf(r));
GetClipBox(DC, r);
nW := r.Width;
nH := r.Height;
// LogToReg('Step-1', Format('W = %d, H = %d,', [nW, nH]));
// LogToReg('Step-2', Format('W = %d, H = %d,', [GetDeviceCaps(DC, HORZRES), GetDeviceCaps(DC, VERTRES)]));
if nW = 0 then
nW := GetDeviceCaps(DC, HORZRES); // 세로모드 : 4961, 가로모드 : 7016, 크로미움 프린트 인쇄시 4760
if nH = 0 then
nH := GetDeviceCaps(DC, VERTRES); // 세로모드 : 7016, 가로모드 : 4961, 크로미움 프린트 인쇄시 6814
end;
Guard(MemCanvas, TCanvas.Create);
MemCanvas.Handle := DC; //CreateCompatibleDC(DC);
hbmp := CreateCompatibleBitmap(MemCanvas.Handle, nW, nH);
hOldBmp := SelectObject(MemCanvas.Handle, hbmp);
nGapW := 0;
nGapH := 0;
// SetBkMode(MemCanvas.Handle, TRANSPARENT);
// MemCanvas.Font.Orientation := 250;
MemCanvas.Font.Name := 'Tahoma';
if gAppHook.Helper.bSmallFont_ then
begin
if Pos('PDF', UpperCase(_sPrtName)) = 0 then
begin
// 일반 프린터에서만 밀리는 현상이 있어서 갭을 준다.. 24_0627 10:52:33 kku
nGapW := 19;
nGapH := 17;
end;
nDefDivFont := 180;
end else
begin
if gAppHook.Helper.bEndDocProc_ then
begin
if CompareText(gAppHook.ModuleName, 'winword.exe') = 0 then
nGapH := 70;
end;
nDefDivFont := 190;
end;
// 기본 폰트 조절
if nW > nH then
MemCanvas.Font.Size := nW div 160
else
MemCanvas.Font.Size := nH div 160;
oldColor := GetTextColor(DC);
// 폰트색 지정... 프로그램에 따라 지정되는 설정이 다르다
MemCanvas.Font.Color := clGray; // 메모장등
MemCanvas.Font.Name := 'Segoe UI';//'Tahoma';
SetTextColor(DC, clGray); // 엑셀등
try
sText := gAppHook.Helper.sPrintWaterTxt + gAppHook.Helper.sCurDocName_;
SetBkMode(MemCanvas.Handle, TRANSPARENT);
MemCanvas.TextOut(nGapW, nGapH, sText);
sText := gAppHook.Helper.sPrintWaterTxt + '이 문서는 솔믹스 보안 문서로서 무단 복사 및 외부 유출을 금합니다.';
MemCanvas.TextOut(nGapW, nH - MemCanvas.TextHeight(sText) + nGapH, sText);
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if nW < nH then
MemCanvas.Font.Size := nW div Round(nDefDivFont / 4.5) // 가운데 폰트 크기 키우려면 숫자를 키우면 됨
else
MemCanvas.Font.Size := nH div Round(nDefDivFont / 4.5);
// MemCanvas.Font.Style := MemCanvas.Font.Style + [fsBold];
if _bmpWater = nil then
begin
sText := gAppHook.Helper.CtrlOpt.sEmpNo;
_bmpWater := TBitmap.Create;
_bmpWater.SetSize(MemCanvas.TextWidth(sText), MemCanvas.TextHeight(sText));
_bmpWater.Canvas.Font.Assign(MemCanvas.Font);
_bmpWater.Canvas.Font.Color := clGray;
_bmpWater.Canvas.TextOut(0, 0, sText);
_bmpWater.TransparentColor := clWhite;
_bmpWater.Transparent := true;
RotateBitmap_PlgBlt(_bmpWater, -0.8, true, clWhite);
end;
if _bmpWater <> nil then
begin
var cTrMatrix: TColorMatrix;
ZeroMemory(@cTrMatrix, SizeOf(cTrMatrix));
// 위 처럼하면 컬러랑 흑백이 섞인 출력의 경우 흑백에 로고가 안찍히는 문제 확인됨 24_0805 16:02:28 kku
cTrMatrix[0][0] := 1;
cTrMatrix[1][1] := 1;
cTrMatrix[2][2] := 1;
cTrMatrix[3][3] := BooleanToFloat(gAppHook.Helper.CtrlOpt.fWmTran <> 0.0, gAppHook.Helper.CtrlOpt.fWmTran, 0.22); // 투명도 1.0 ~ 0.22
// cTrMatrix[3][3] := 0.05; // 투명도 1.0 ~ 0.22
cTrMatrix[4][4] := 1;
Dec(nW, nGapW);
Dec(nH, nGapH);
nX := (nW div 4) - (_bmpWater.Width div 2);
nY := (nH div 4) - (_bmpWater.Height div 2);
if not gAppHook.Helper.IsExcel or
( gAppHook.Helper.IsExcel and bStartPage and not _bDoStartProc) or
( gAppHook.Helper.IsExcel and not bStartPage ) then
begin
DrawBitmapWaterEx(MemCanvas.Handle, nX, nY, _bmpWater, @cTrMatrix);
end;
end;
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// if bStartPage then
// BitBlt(DC, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, SRCCOPY);
SelectObject(MemCanvas.Handle, hOldBmp);
// DeleteObject(pen);
DeleteObject(hbmp);
// if bStartPage then
// DeleteDC(MemCanvas.Handle);
MemCanvas.Handle := 0;
finally
SetTextColor(DC, oldColor);
end;
// gAppHook.Log(Format('ProcessWartermark() - Completed, LastError=%d', [GetLastError]));
except
// 실패하면 출력 안되게 해준다 22_0907 14:28:52 kku
Result := false;
DeleteDC(DC);
end;
finally
gAppHook.Helper.bIsWaterMaking_ := false;
RestoreDC(DC, -1);
end;
end;
end.