|
|
|
تازه اول راهه
        
گروه: کاربران
آخرین بازدید: یکشنبه 29 مهر 1386 - 2:47 بعدازظهر
پست ها: 11,
بازدید ها: 11
|
|
|
سلام بر دوستان عزیز
من می خواهم برنامه ای بنویسم که فایل های word,html,bmp,... را به pdf تبدیل کند.
لطفا مرا راهنمایی بفرمایید
یا علی
|
|
|
|
|
کم کم داره مخ میخوره
        
گروه: کاربران
آخرین بازدید: پنج شنبه 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

|
|
|
|
|
کم کم داره مخ میخوره
        
گروه: کاربران
آخرین بازدید: پنج شنبه 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

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

|
|
| |