⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdfinsert.pas

📁 wbs43open-src.zip 数字隐藏工具
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -