📄 pdfinsert.pas
字号:
unit PDFInsert;
interface
uses CarrierFile, DataFile, Classes, MultiLang
{$IFDEF CLX}
,QForms
{$ELSE}
,Forms
{$ENDIF}
;
type
TPDFInsert = class(TCarrierFile)
public
constructor Create; override;
destructor Destroy; override;
function GetAvailSize: Longint; virtual;
function CreateFromCarrierFile(cf: TCarrierFile): Boolean; virtual;
function ExportToCarrierFile(cf: TCarrierFile): Boolean; virtual;
function EnoughSpaceToHide(n: Longint): Boolean; virtual;
function Encode(ToHide: TDataFile): Boolean; virtual;
function Decode(ResultFile: TDataFile): Boolean; virtual;
function isUsable: String; virtual;
end;
implementation
constructor TPDFInsert.Create;
begin
inherited Create;
end;
destructor TPDFInsert.Destroy;
begin
inherited Create;
end;
function TPDFInsert.GetAvailSize: Longint;
var
Buffer: Array[0..1023] of Byte;
BytesRead: Integer;
LineFeeds: Integer;
i: Integer;
inObject: Boolean;
tag: String;
p: Integer;
Cancel: Boolean;
begin
inherited GetAvailSize;
Cancel:=False;
LineFeeds:=0;
inObject:=False;
tag:='';
BytesRead:=1024;
Data.Seek(0,soFromBeginning);
Percent:=0;
p:=Trunc(Data.Size/1024);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
while (BytesRead=1024) and not(Cancel) do begin
BytesRead:=Data.Read(Buffer,1024);
for i:=0 to BytesRead-1 do begin
if not(inObject) then begin
if (Buffer[i]=$0d) then begin
Inc(LineFeeds);
tag:='';
end
else begin
case Length(tag) of
0: if ((Buffer[i]=Ord('o')) or (Buffer[i]=Ord('O'))) then tag:='o';
1: if ((Buffer[i]=Ord('b')) or (Buffer[i]=Ord('B'))) then tag:=tag+'b'
else tag:='';
2: if ((Buffer[i]=Ord('j')) or (Buffer[i]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='obj' then begin
inObject:=True;
tag:='';
end;
end;
end
else begin
case Length(tag) of
0: if ((Buffer[i]=Ord('e')) or (Buffer[i]=Ord('E'))) then tag:='e';
1: if ((Buffer[i]=Ord('n')) or (Buffer[i]=Ord('N'))) then tag:=tag+'n'
else tag:='';
2: if ((Buffer[i]=Ord('d')) or (Buffer[i]=Ord('D'))) then tag:=tag+'d'
else tag:='';
3: if ((Buffer[i]=Ord('o')) or (Buffer[i]=Ord('O'))) then tag:=tag+'o'
else tag:='';
4: if ((Buffer[i]=Ord('b')) or (Buffer[i]=Ord('B'))) then tag:=tag+'b'
else tag:='';
5: if ((Buffer[i]=Ord('j')) or (Buffer[i]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='endobj' then begin
inObject:=False;
tag:='';
end;
end;
end;
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
GetAvailSize:=LineFeeds;
end;
function TPDFInsert.CreateFromCarrierFile(cf: TCarrierFile): Boolean;
begin
if cf.GetFileType='PDF' then begin
Data.Clear;
cf.SaveToStream(Data);
SetFileType(cf.GetFileType,cf.GetColorDepth);
Percent:=cf.Percent;
CreateFromCarrierFile:=True;
end
else CreateFromCarrierFile:=False;
end;
function TPDFInsert.ExportToCarrierFile(cf: TCarrierFile): Boolean;
begin
cf.LoadFromStream(Data);
cf.SetFileType('PDF',0);
ExportToCarrierFile:=True;
end;
function TPDFInsert.EnoughSpaceToHide(n: Longint): Boolean;
begin
if n>GetAvailSize then EnoughSpaceToHide:=False else EnoughSpaceToHide:=True;
end;
function TPDFInsert.Encode(ToHide: TDataFile): Boolean;
var
newData: TMemoryStream;
Buffer: Array[0..1023] of Byte;
BytesRead: Integer;
HideStream: TMemoryStream;
HideBuffer: Array[0..1023] of Byte;
Insert: Array[0..7] of Byte;
HideRead: Integer;
CPos: Integer;
i,j: Integer;
val: Byte;
lastwritten: Integer;
Buffer2: Array[0..1023] of Byte;
inObject: Boolean;
tag: String;
p: Integer;
Cancel: Boolean;
begin
inherited Encode(ToHide);
Cancel:=False;
if EnoughSpaceToHide(ToHide.GetSize) then begin
HideStream:=TMemoryStream.Create;
ToHide.SaveToStream(HideStream);
newData:=TMemoryStream.Create;
Data.Seek(0,soFromBeginning);
BytesRead:=Data.Read(Buffer,1024);
CPos:=0;
lastwritten:=-1;
inObject:=False;
tag:='';
HideRead:=1024;
HideStream.Seek(0,soFromBeginning);
Percent:=0;
p:=Trunc(HideStream.Size/1024);
while (HideRead=1024) and not(Cancel) do begin
HideRead:=HideStream.Read(HideBuffer,1024);
for i:=0 to HideRead-1 do begin
for j:=7 downto 0 do begin
if (HideBuffer[i] and (1 shl j))<>0 then Insert[7-j]:=$09 else Insert[7-j]:=$20;
end;
while ((Buffer[CPos]<>$0d) or inObject) do begin
if not(inObject) then begin
case Length(tag) of
0: if ((Buffer[CPos]=Ord('o')) or (Buffer[CPos]=Ord('O'))) then tag:='o';
1: if ((Buffer[CPos]=Ord('b')) or (Buffer[CPos]=Ord('B'))) then tag:=tag+'b'
else tag:='';
2: if ((Buffer[CPos]=Ord('j')) or (Buffer[CPos]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='obj' then begin
inObject:=True;
tag:='';
end;
end
else begin
case Length(tag) of
0: if ((Buffer[CPos]=Ord('e')) or (Buffer[CPos]=Ord('E'))) then tag:='e';
1: if ((Buffer[CPos]=Ord('n')) or (Buffer[CPos]=Ord('N'))) then tag:=tag+'n'
else tag:='';
2: if ((Buffer[CPos]=Ord('d')) or (Buffer[CPos]=Ord('D'))) then tag:=tag+'d'
else tag:='';
3: if ((Buffer[CPos]=Ord('o')) or (Buffer[CPos]=Ord('O'))) then tag:=tag+'o'
else tag:='';
4: if ((Buffer[CPos]=Ord('b')) or (Buffer[CPos]=Ord('B'))) then tag:=tag+'b'
else tag:='';
5: if ((Buffer[CPos]=Ord('j')) or (Buffer[CPos]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='endobj' then begin
inObject:=False;
tag:='';
end;
end;
if CPos<BytesRead-1 then Inc(CPos)
else begin
for j:=0 to CPos-lastwritten-1 do Buffer2[j]:=Buffer[j+lastwritten+1];
newData.Write(Buffer2,CPos-lastwritten);
BytesRead:=Data.Read(Buffer,1024);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -