تبدیل word به pdf
      

 
Persian Forum Network - Try to be a Professional
صفحه نخست .:.  کاربران .:.   .:. تقویم  .:. کاربران آنلاین
خوش آمدید میهمان ( ورود | ثبت نام )
  /     /  



تبدیل word به pdf باز / بسته
نویسنده
پیغام
ارسال شده در تاریخ سه شنبه 11 اردیبهشت 1386 - 3:56 بعدازظهر


تازه اول راهه

تازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راههتازه اول راهه

گروه: کاربران
آخرین بازدید: یکشنبه 29 مهر 1386 - 2:47 بعدازظهر
پست ها: 11, بازدید ها: 11
سلام بر دوستان عزیز

من می خواهم برنامه ای بنویسم که فایل های word,html,bmp,... را به pdf تبدیل کند.

لطفا مرا راهنمایی بفرمایید    



یا علی
پست شماره 13731
تبلیغات
ارسال شده در تاریخ چهار شنبه 12 اردیبهشت 1386 - 5:57 بعدازظهر


کم کم داره مخ میخوره

کم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخوره

گروه: کاربران
آخرین بازدید: پنج شنبه 10 مرداد 1387 - 1:46 صبح
پست ها: 123, بازدید ها: 134


PFN Code



unit bmp2pdf;

interface
uses
    Windows,Classes, Graphics, SysUtils;

    procedure BMPtoPDF(BMP:TBitmap;SaveName:String);

implementation

type
pRGBArray = ^TRGBArray;
TRGBArray = array[0..32768-1] of TRGBTriple;

procedure Write_CrossReferenceTable(AStream: TStream;PosArray : array of Dword;Count:Integer);
Var
   i :Integer;
begin
  With TStringStream(AStream) do
  begin
    WriteString('xref'#10);
    WriteString(Format('0 %d'#10,[Count+1]));
    WriteString('0000000000 65535 f '#10);
    for i:= 0 to Count-1 do
    begin
     WriteString(Format('%0.10d',[PosArray])+' 00000 n '#10);
    end;
  end;
end;

procedure Write_ContentsObject(AStream: TStream;Index : Dword; Width,Height : Integer);
Var
   MemoryStream : TMemoryStream;
begin
  MemoryStream:=TMemoryStream.Create;
  Try
     // Stream
     With TStringStream(MemoryStream) do
     begin
       WriteString('q'#10);
         WriteString(Format('%d 0 0 %d 0 0 cm'#10,[Width,Height]));
         WriteString('/Im0 Do'#10);
       WriteString('Q'#10);
     end;

     MemoryStream.Position:=0;

     // Object
     With TStringStream(AStream) do
     begin
       WriteString(Format('%d 0 obj'#10,[Index]));
       WriteString(Format('<< /Length %d >>'#10,[MemoryStream.Size]));
       WriteString('stream'#10);
       AStream.CopyFrom(MemoryStream,MemoryStream.Size) ;
       WriteString('endstream'#10);
       WriteString('endobj'#10);
     end;
  finally
    MemoryStream.Free;
  end;
end;

procedure GetBitmapData(AStream :TStream;BMP:TBitmap);
var
tmp :TBitmap;
Buffer  : Pointer;
SrcRow,DestRow  : pRGBArray;
Row,Col,DestCnt : Integer;
begin

DestCnt:=0;

tmp := TBitmap.Create;
tmp.Assign(BMP);
tmp.PixelFormat:=pf24bit;

GetMem(Buffer,tmp.Width*tmp.height*3);
DestRow :=Buffer;

try  
   for Row:=0 to tmp.Height-1 do
   begin
     SrcRow :=tmp.ScanLine[Row];
     for Col:=0 to tmp.Width-1 do
     begin
       DestRow[DestCnt].rgbtBlue  := SrcRow[Col].rgbtRed;
       DestRow[DestCnt].rgbtGreen := SrcRow[Col].rgbtGreen;
       DestRow[DestCnt].rgbtRed   := SrcRow[Col].rgbtBlue;
       Inc(DestCnt);
     end;
   end;

   AStream.Write(DestRow^,tmp.Width*tmp.Height*3);

  finally
     tmp.Free;
     FreeMem(Buffer);
  end;
end;

procedure BMPtoPDF(BMP:TBitmap;SaveName:String);
Var
  AStream,BitsData  : TStream;
  ObjectIndex  : Integer;
  ObjectPosArray  : array [0..10] of Dword;
begin

  if BMP=nil then
   raise  Exception.Create('Bitmap is nil');

  if SaveName='' then
   raise  Exception.Create('SaveName is nil');

  ObjectIndex :=0;

  AStream  :=TFileStream.Create(SaveName,fmCreate)  ;
  BitsData :=TMemorySTream.Create;
  Try         
     GetBitmapData(BitsData,BMP);
     BitsData.Position:=0;

     // PDF version
     TStringStream(AStream).WriteString('%PDF-1.2'#10);

     // Catalog
     ObjectPosArray[ObjectIndex] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));
          WriteString('<<'#10);
          WriteString('/Type /Catalog'#10);
          WriteString('/Pages 2 0 R'#10);
          // View Option (100%)
          WriteString('/OpenAction [3 0 R /XYZ -32768 -32768 1 ]'#10);      
          WriteString('>>'#10);
          WriteString('endobj'#10);
     end;
     Inc(ObjectIndex);
  
     // Parent Pages
     ObjectPosArray[ObjectIndex] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));
          WriteString('<<'#10);
          WriteString('/Type /Pages'#10);
          WriteString('/Kids [ 3 0 R ]'#10);
          WriteString('/Count 1'#10);
          WriteString('>>'#10);        
          WriteString('endobj'#10);
     end;
     Inc(ObjectIndex);

     // Kids Page
     ObjectPosArray[ObjectIndex] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));
          WriteString('<<'#10);
          WriteString('/Type /Page'#10);
          WriteString('/Parent 2 0 R'#10);
          WriteString('/Resources'#10);
          WriteString('<<'#10);
          WriteString('/XObject << /Im0 4 0 R >>'#10);
          WriteString('/ProcSet [ /PDF /ImageC ]'#10);
          WriteString('>>'#10);
          WriteString(Format('/MediaBox [ 0 0 %d %d ]'#10, [BMP.Width,BMP.Height]));
          WriteString('/Contents 5 0 R'#10);
          WriteString('>>'#10);
          WriteString('endobj'#10);
     end;
     Inc(ObjectIndex);

     // XObject Resource
     ObjectPosArray[ObjectIndex] :=AStream.Position;  
     With TStringStream(AStream) do
     begin
          WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));
          WriteString('<<'#10);
          WriteString('/Type /XObject'#10);
          WriteString('/Subtype /Image'#10);
          WriteString('/Name /Im0'#10);
          WriteString(Format('/Width %d'#10,[BMP.Width]));
          WriteString(Format('/Height %d'#10,[BMP.Height]));
          WriteString('/BitsPerComponent 8'#10);
          WriteString('/Filter []'#10);
          WriteString('/ColorSpace /DeviceRGB'#10);
          WriteString(Format('/Length %d >>'#10,[BitsData.Size]));
          WriteString('stream'#10);
          AStream.CopyFrom(BitsData,BitsData.Size);
          WriteString('endstream'#10);
          WriteString('endobj'#10);
     end;
     Inc(ObjectIndex);

     // Contents Stream & Object
     ObjectPosArray[ObjectIndex] :=AStream.Position;
     With TStringStream(AStream) do
     begin
        Write_ContentsObject(AStream,ObjectIndex+1,BMP.Width,BMP.Height);
     end;
     Inc(ObjectIndex);

     // CrossReferenceTable
     ObjectPosArray[ObjectIndex] :=AStream.Position;
     Write_CrossReferenceTable(AStream,ObjectPosArray,ObjectIndex);

     // trailer
     With TStringStream(AStream) do
     begin
         WriteString('trailer'#10);
         WriteString('<<'#10);
         WriteString(Format('/Size %d'#10,[ObjectIndex+1]));
         WriteString('/Root 1 0 R'#10);
         WriteString('>>'#10);
         WriteString('startxref'#10);
         WriteString(Format('%d'#10,[ObjectPosArray[ObjectIndex]]));
         WriteString('%%EOF');
     end;

  finally
    AStream.Free;
    BitsData.Free;
  end;
end;

end.




fmh12007-05-02 16:51:45





پست شماره 93693
ارسال شده در تاریخ چهار شنبه 12 اردیبهشت 1386 - 6:20 بعدازظهر


کم کم داره مخ میخوره

کم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخورهکم کم داره مخ میخوره

گروه: کاربران
آخرین بازدید: پنج شنبه 10 مرداد 1387 - 1:46 صبح
پست ها: 123, بازدید ها: 134

PFN Code



unit txt2pdf;

interface
uses
    Windows,Classes, Graphics, SysUtils;

    procedure TXTtoPDF(OpenName,SaveName:String);

implementation

 const
  m_PageWidth      = 595; 
  m_PageHeight     = 842;

m_MarginX        = 30; 

  m_MarginY        = 30;

m_FontSize       = 12;

  m_FontName       = 'F0';

 m_FontEncoding   = '90ms-RKSJ-H';

 m_FontWidth      = '231 389 500 631 631 500';


  type
    pDword =^Dword;
  type
    pDwordArray = ^TDwordArray ;
    TDwordArray  = array[0..1234] of Dword;


  type
   TPDFObjMemManager = class(TPersistent)
   private
     Buffer : Pointer;
     FObjectCount : Dword;
     FReallocCount: Dword;
     function GetSize()word;
   public
     ObjectIndex    : Dword;
     ObjectPosArray : pDwordArray;
     constructor Create(ObjectCount,ReallocCount word);
     destructor Destroy;override;
     procedure MemoryCheck();
     property  MemorySize word read GetSize;
  end;


constructor TPDFObjMemManager.Create(ObjectCount,ReallocCount word);
begin
  inherited Create;

  if (ObjectCount=0) or (ReallocCount= 0) then
   raise  EInvalidOperation.Create('!');

  FObjectCount   :=ObjectCount;
  FReallocCount  :=ReallocCount;
  GetMem(buffer,FObjectCount*SizeOf(TDwordArray));

  ObjectPosArray :=buffer;
  if Buffer=nil then
     raise EOutOfMemory.Create('ƒپƒ‚ƒٹ‚ھ•s‘«‚µ‚ؤ‚¢‚ـ‚·پB');
end;

destructor TPDFObjMemManager.Destroy;
begin
   FreeMem(Buffer,FObjectCount*SizeOf(SizeOf(TDwordArray)));
   inherited Destroy;
end;

function TPDFObjMemManager.GetSize()word;
begin
  Result:=FObjectCount* SizeOf(TDwordArray);
end;

procedure TPDFObjMemManager.MemoryCheck();
begin
 
  if ObjectIndex >= FObjectCount then
  begin
     FObjectCount:=FObjectCount+FReallocCount;
     ReallocMem(Buffer,FObjectCount*SizeOf(TDwordArray));

     if Buffer=nil then
      raise EOutOfMemory.Create('!!');

  
     ObjectPosArray := buffer;
  end;
end;


procedure Write_CrossReferenceTable(AStream: TStream;ObjectPosArray : pDwordArray;Count:Integer);
Var
   i :Integer;
begin
  With TStringStream(AStream) do
  begin
    WriteString('xref'#10);
    WriteString(Format('0 %d'#10,[Count+1]));
    WriteString('0000000000 65535 f '#10);
    for i:= 0 to Count-1 do
    begin
     WriteString(Format('%0.10d',[ObjectPosArray])+' 00000 n '#10);
    end;
  end;
end;

procedure DrawText(AStream: TStream;x,y:Integer;Lines :TStringList);

    function AsciiHexEncoding(Buffer :PByteArray;Size: Dword):String;
    Var
     i   : integer;
    begin
       TStringStream(AStream).WriteString('<');
       for i:= 0 to size-1 do
          TStringStream(AStream).WriteString(IntToHex(Buffer,2));
       TStringStream(AStream).WriteString('>');
    end;
   
Var
  i : Dword;
  Matrix   : Single;
begin
     if Lines.Text='' then Exit;

     y  := m_PageHeight - y;
     Matrix :=y - m_FontSize*0.87;
     With TStringStream(AStream) do
     begin
       WriteString('BT'#10);
       WriteString(Format('/%s %d Tf'#10,[m_FontName,m_FontSize]));
       WriteString(Format('0 0 0 rg %d TL %d %f Td ',[m_FontSize,x,Matrix]));

       AsciiHexEncoding(PByteArray(Lines[0]),Length(Lines[0]));
       WriteString(' Tj'#10);

       if Lines.Count<> 1 then
       begin
          for i:= 1 to Lines.Count -1 do
          begin
              WriteString('T* ');
              AsciiHexEncoding(PByteArray(Lines),Length(Lines));
              WriteString(' Tj'#10);
          end;
       end;
       WriteString('ET'#10);
     end;
end;

procedure AutoLineFeed(var Lines : TStringList);

   function GetTextWidth(S:String):Integer;
   begin
      Result:=(Length(S)* (m_FontSize div 2));
   end;
  
var
P : Pchar;
S : String;
i,MaxWidth : integer;
StringList   : TStringList;
begin  
    MaxWidth:=m_PageWidth-m_MarginX*2;

    StringList :=TStringList.Create;
    try
        for i:= 0 to Lines.Count-1 do
        begin

             if GetTextWidth(Lines) > MaxWidth then
             begin
                S :='';
                P :=Pchar(Lines);
                While not (P^=#0) do
                begin

                   if Byte(P^) in [$81..$9F,$E0..$FC] then
                   begin
                      S :=S+P^; inc(P);
                      S :=S+P^;
                      if GetTextWidth(S) > MaxWidth-(m_FontSize) then
                      begin
                         StringList.Add(S);
                         S :='';
                      end;
                      if P^=#0 then break;
                   end

                   else
                   begin
                      S :=S+P^;
                      if GetTextWidth(S) > MaxWidth-(m_FontSize div 2) then
                      begin
                         StringList.Add(S);
                         S :='';
                      end;
                   end;
                   Inc(P);
                end;
                if S<>'' then
                  StringList.Add(S);
             end
             else
               StringList.Add(Lines);

        end;
        Lines.Text:= StringList.Text;
    finally
      StringList.free;
    end; 
end;                   

procedure Write_PageObject(AStream: TStream;ObjectMem :TPDFObjMemManager; Lines,PageList : TStringList);
Var
   PageText :TStringList;
   i,j,k,Pages,Streamsize,MaxHeight,PageRows : integer;
begin

  PageText := TStringList.Create;
  try

      AutoLineFeed(Lines);

      MaxHeight:=m_PageHeight-m_MarginY*2;
      PageRows:=Lines.count;
      for i:= 1 to Lines.count do
      begin
          if MaxHeight <= i * m_FontSize then
          begin
            PageRows:=i-1;
            break;
          end
      end;

      if Lines.Count<>0 then
      begin
        Pages := (Lines.Count div PageRows);
        if (Lines.Count-PageRows)<>0 then
         Inc(Pages);
      end
      else
        Pages:=1;
     
      k:=0;
      for i :=0 to Pages-1 do
      begin

          PageText.Text:='';
          for j:= 0 to PageRows-1 do
          begin
             if k >=Lines.Count then break;
             PageText.Add(Lines[k]);
             Inc(k);
          end;
          PageList.Add(Inttostr(ObjectMem.ObjectIndex+1));
          ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] :=AStream.Position;
          With TStringStream(AStream) do
          begin
               WriteString(Format('%d 0 obj'#10,[ObjectMem.ObjectIndex+1]));
               WriteString('<<'#10);
               WriteString('/Type /Page'#10);
               WriteString('/Parent 2 0 R'#10);
               WriteString('/Resources'#10);
               WriteString('<<'#10);
               WriteString(Format('/Font << /%s 3 0 R >>'#10,[m_FontName]));
               WriteString('/ProcSet [ /PDF /Text ]'#10);
               WriteString('>>'#10);
               WriteString(Format('/MediaBox [ 0 0 %d %d ]'#10, [m_PageWidth,m_PageHeight]));
               WriteString(Format('/Contents %d 0 R'#10,[ObjectMem.ObjectIndex+2]));
               WriteString('>>'#10);
               WriteString('endobj'#10);
          end;
          Inc(ObjectMem.ObjectIndex);
          ObjectMem.MemoryCheck;


          ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] :=AStream.Position;
          With TStringStream(AStream) do
          begin
               WriteString(Format('%d 0 obj'#10,[ObjectMem.ObjectIndex+1]));
               WriteString(Format('<< /Length %d 0 R >>'#10,[ObjectMem.ObjectIndex+2]));
               WriteString('stream'#10);


                 Streamsize := AStream.Position;
                 DrawText(AStream,m_MarginX,m_MarginY,PageText);
                 Streamsize := ASTream.Position-Streamsize;

               WriteString('endstream'#10);
               WriteString('endobj'#10);
          end;
          Inc(ObjectMem.ObjectIndex);
          ObjectMem.MemoryCheck;


          ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] :=AStream.Position;
          With TStringStream(AStream) do
          begin
               WriteString(Format('%d 0 obj'#10,[ObjectMem.ObjectIndex+1]));
               WriteString(Format('%d'#10,[Streamsize]));
               WriteString('endobj'#10);
          end;
          Inc(ObjectMem.ObjectIndex);
          ObjectMem.MemoryCheck;
       end;
      
   finally
     PageText.Free;
   end;
end;

procedure TXTtoPDF(OpenName,SaveName:String);
Var
  i :integer;
  AStream   : TStream;
  ObjectMem : TPDFObjMemManager;
  PageList,StringList  : TStringList;
begin

  if OpenName='' then
   raise  Exception.Create('OpenName is Empty');

  if SaveName='' then
  
raise  Exception.Create('SaveName is Empty');

  AStream    :=TFileStream.Create(SaveName,fmCreate)  ;
  PageList   :=TStringList.Create;
  StringList :=TStringList.Create;

ObjectMem  :=TPDFObjMemManager.Create(1000,1000);

  Try
      StringList.LoadFromFile(OpenName);

     ObjectMem.ObjectIndex:=ObjectMem.ObjectIndex+2;       

     TStringStream(AStream).WriteString('%PDF-1.2'#10);

     ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString(Format('%d 0 obj'#10,[ObjectMem.ObjectIndex+1]));
          WriteString('<<'#10);
          WriteString('/Type /Font'#10);
          WriteString(Format('/Name /%s'#10,[m_FontName]));
          WriteString(Format('/BaseFont /HeiseiKakuGo-W5-%s'#10,[m_FontEncoding]));
          WriteString('/Subtype /Type0'#10);
          WriteString(Format('/Encoding /%s'#10,[m_FontEncoding]));
          WriteString('/DescendantFonts [ << /Type /Font /Subtype /CIDFontType0 /BaseFont /HeiseiKakuGo-W5'#10);
          WriteString('/FontDescriptor << /Type /FontDescriptor /FontName /HeiseiKakuGo-W5 /ItalicAngle 0');
          WriteString('/FontBBox [ -92 -250 1010 922 ]'#10);
          WriteString('/Style << /Panose <');
          WriteString('0801020B0600000000000000');
          WriteString('>>> /Ascent 752 /CapHeight 737 /Descent -221'#10);
          WriteString('/Flags 4 /StemV 114 /XHeight 553 >>'#10);
          WriteString('/CIDSystemInfo << /Registry (Adobe)/Ordering (Japan1)/Supplement 2 >>'#10);
          WriteString(Format('/DW 1000 /W [ %s ] >>'#10,[m_FontWidth]));
          WriteString(']'#10);
          WriteString('>>'#10);
          WriteString('endobj'#10);
     end;
     Inc(ObjectMem.ObjectIndex);
     ObjectMem.MemoryCheck;

    
     Write_PageObject(AStream,ObjectMem,StringList,PageList);

 
     ObjectMem.ObjectPosArray[0] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString('1 0 obj'#10);
          WriteString('<<'#10);
          WriteString('/Type /Catalog'#10);
          WriteString('/Pages 2 0 R'#10);
          WriteString('>>'#10);
          WriteString('endobj'#10);
     end;

   
     ObjectMem.ObjectPosArray[1] :=AStream.Position;
     With TStringStream(AStream) do
     begin
          WriteString('2 0 obj'#10);
          WriteString('<<'#10);
          WriteString('/Type /Pages'#10);
    
          WriteString('/Kids [');
          for i:= 0 to PageList.Count-1 do
          begin
            WriteString(Format(' %s 0 R',[PageList]));
          end;
          WriteString(' ]'#10);
          WriteString(Format('/Count %d'#10,[PageList.Count]));
          WriteString('>>'#10);
          WriteString('endobj'#10);
     end;        
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] :=AStream.Position;
     Write_CrossReferenceTable(AStream,ObjectMem.ObjectPosArray,ObjectMem.ObjectIndex);

    
     With TStringStream(AStream) do
     begin
         WriteString('trailer'#10);
         WriteString('<<'#10);
         WriteString(Format('/Size %d'#10,[ObjectMem.ObjectIndex+1]));
         WriteString('/Root 1 0 R'#10);
         WriteString('>>'#10);
         WriteString('startxref'#10);
         WriteString(Format('%d'#10,[ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex]]));
         WriteString('%%EOF');
     end;

  finally
    AStream.Free;
    PageList.free;
    StringList.free;
    ObjectMem.free;
  end;
end;

end.





fmh12007-05-02 17:00:10





پست شماره 93694
ارسال شده در تاریخ چهار شنبه 12 اردیبهشت 1386 - 8:35 بعدازظهر


Most Valuable Professional

Most Valuable Professional

گروه: مدیر انجمن (ویژه 2)
آخرین بازدید: دیروز 11:51:15
پست ها: 1,518, بازدید ها: 2,467
سلام
sorrowdancer دوست عزیز

لطفا کد ها رو داخل تگ کد قرار دهید نه تگ نقل قول






   
پست شماره 93695