📄 pdfinsert.pas
字号:
CPos:=0;
lastwritten:=-1;
end;
end;
Percent:=Percent+p;
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
tag:='';
for j:=0 to CPos-lastwritten-2 do Buffer2[j]:=Buffer[j+lastwritten+1];
newData.Write(Buffer2,CPos-lastwritten-1);
newData.Write(Insert,8);
lastwritten:=CPos-1;
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);
CPos:=0;
lastwritten:=-1;
end;
end;
end;
for j:=lastwritten+1 to 1023 do Buffer2[j-lastwritten-1]:=Buffer[j];
newData.Write(Buffer2,1023-lastwritten);
if Data.Size>Data.Position then newData.CopyFrom(Data,Data.Size-Data.Position);
Data.Free;
Data:=newData;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
end
else Encode:=False;
end;
function TPDFInsert.Decode(ResultFile: TDataFile): Boolean;
var
S24: Array[0..2] of Byte;
Size: Integer;
outStrm: TMemoryStream;
DataBuffer: Array[0..1023] of Byte;
DataWritten: Integer;
CarrierBuffer: Array[0..1023] of Byte;
CarrierRead: Integer;
i,j: Integer;
d,c: Integer;
val: Integer;
inObject: Boolean;
tag: String;
Cancel: Boolean;
begin
// decode first 3 bits
Cancel:=False;
Data.Seek(0,soFromBeginning);
i:=0;
d:=0;
c:=0;
inObject:=False;
tag:='';
CarrierRead:=Data.Read(CarrierBuffer,1024);
Percent:=0;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
while i<3 do begin
val:=0;
while (CarrierBuffer[c]<>$d) or inObject do begin
if not(inObject) then begin
case Length(tag) of
0: if ((CarrierBuffer[c]=Ord('o')) or (CarrierBuffer[c]=Ord('O'))) then tag:='o';
1: if ((CarrierBuffer[c]=Ord('b')) or (CarrierBuffer[c]=Ord('B'))) then tag:=tag+'b'
else tag:='';
2: if ((CarrierBuffer[c]=Ord('j')) or (CarrierBuffer[c]=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 ((CarrierBuffer[c]=Ord('e')) or (CarrierBuffer[c]=Ord('E'))) then tag:='e';
1: if ((CarrierBuffer[c]=Ord('n')) or (CarrierBuffer[c]=Ord('N'))) then tag:=tag+'n'
else tag:='';
2: if ((CarrierBuffer[c]=Ord('d')) or (CarrierBuffer[c]=Ord('D'))) then tag:=tag+'d'
else tag:='';
3: if ((CarrierBuffer[c]=Ord('o')) or (CarrierBuffer[c]=Ord('O'))) then tag:=tag+'o'
else tag:='';
4: if ((CarrierBuffer[c]=Ord('b')) or (CarrierBuffer[c]=Ord('B'))) then tag:=tag+'b'
else tag:='';
5: if ((CarrierBuffer[c]=Ord('j')) or (CarrierBuffer[c]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='endobj' then begin
inObject:=False;
tag:='';
end;
end;
if ((c=CarrierRead) and (CarrierRead=1024)) then begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end
else Inc(c);
end;
for j:=7 downto 0 do begin
if CarrierBuffer[c-j-1]=$09 then val:=val+(1 shl j);
end;
if c<CarrierRead-1 then Inc(c)
else begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end;
S24[d]:=val;
Inc(DataWritten);
Inc(d);
Inc(i);
end;
// then decode other data
Size:=S24[0]+(S24[1] Shl 8)+(S24[2] Shl 16);
outStrm:=TMemoryStream.Create;
DataWritten:=0;
i:=0;
d:=0;
while (i<Size) and not(Cancel) do begin
if (d=1024) then begin
outStrm.Write(DataBuffer,1024);
DataWritten:=0;
d:=0;
end;
val:=0;
val:=0;
while ((CarrierBuffer[c]<>$d) or inObject) and not(Cancel) do begin
if not(inObject) then begin
case Length(tag) of
0: if ((CarrierBuffer[c]=Ord('o')) or (CarrierBuffer[c]=Ord('O'))) then tag:='o';
1: if ((CarrierBuffer[c]=Ord('b')) or (CarrierBuffer[c]=Ord('B'))) then tag:=tag+'b'
else tag:='';
2: if ((CarrierBuffer[c]=Ord('j')) or (CarrierBuffer[c]=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 ((CarrierBuffer[c]=Ord('e')) or (CarrierBuffer[c]=Ord('E'))) then tag:='e';
1: if ((CarrierBuffer[c]=Ord('n')) or (CarrierBuffer[c]=Ord('N'))) then tag:=tag+'n'
else tag:='';
2: if ((CarrierBuffer[c]=Ord('d')) or (CarrierBuffer[c]=Ord('D'))) then tag:=tag+'d'
else tag:='';
3: if ((CarrierBuffer[c]=Ord('o')) or (CarrierBuffer[c]=Ord('O'))) then tag:=tag+'o'
else tag:='';
4: if ((CarrierBuffer[c]=Ord('b')) or (CarrierBuffer[c]=Ord('B'))) then tag:=tag+'b'
else tag:='';
5: if ((CarrierBuffer[c]=Ord('j')) or (CarrierBuffer[c]=Ord('J'))) then tag:=tag+'j'
else tag:='';
end;
if tag='endobj' then begin
inObject:=False;
tag:='';
end;
end;
if ((c>CarrierRead-2) and (CarrierRead=1024)) then begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
if CarrierRead=0 then cancel:=True;
end
else Inc(c);
end;
for j:=7 downto 0 do begin
if CarrierBuffer[c-j-1]=$09 then val:=val+(1 shl j);
end;
if c<CarrierRead-1 then Inc(c)
else begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
if CarrierRead=0 then Cancel:=True;
end;
DataBuffer[d]:=val;
Inc(DataWritten);
Inc(d);
Inc(i);
Percent:=Trunc(i/Size);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
outStrm.Write(DataBuffer,DataWritten);
ResultFile.LoadFromStream(outStrm);
outStrm.Free;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Decode:=True;
end;
function TPDFInsert.isUsable: String;
var
id: Array[0..3] of Byte;
idStr: String;
i: Byte;
begin
Data.Seek(0,soFromBeginning);
Data.Read(id,4);
idStr:='';
for i:=0 to 3 do begin
idStr:=idStr+Chr(id[i]);
end;
if idStr='%PDF' then isUsable:='OK'
else isUsable:=ml.GetCodeString('PDFInsert',1);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -