Bu HotPDF Bileşeni örneği, veritabanı kayıtlarını sayfalandırılmış bir PDF tablosuna dönüştürür. Kompakt bir rapor oluşturma modelidir: bir veri kümesindeki satırları okuyun, tablo başlığını çizin, her satırı bilinen bir dikey konumda yazdırın ve geçerli sayfa dolduğunda yeni bir sayfa ekleyin.
Örnek eski bir TTable veri kaynağı kullanıyor ancak PDF mantığı bu depolama katmanından bağımsız. Aynı işleme yaklaşımı FireDAC, ADO, bellek içi veri kümeleri, REST sonuçları veya satır satır numaralandırılabilen herhangi bir uygulama verisi için kullanılabilir.
Tasarımın temel noktası, satır oluşturmayı sayfa düzeninden ayırmaktır. PrintRow bir satır çizer, PrettyPage yinelenen üstbilgiyi ve sayfa meta verilerini oluşturur ve ana döngü sayfalandırmayı kontrol eder. Bu ayırma, örneğin daha geniş tablolara, toplamlara, gruplandırmaya veya markalı rapor başlıklarına uyarlanmasını kolaylaştırır.
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
program TableDemo; {$APPTYPE CONSOLE} { Reduce EXE size by disabling as much of RTTI as possible } {$IFDEF VER210} {$WEAKLINKRTTI ON} {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} {$ENDIF} uses {$IFDEF VER230}System.Classes, System.SysUtils, Vcl.Graphics, DB, DBTables, {$ELSE} Classes, SysUtils, Graphics, DB, DBTables, {$ENDIF} HPDFDoc; var HotPDF: THotPDF; PageNum, VertPos: Integer; CustomerTable: TTable; Back: boolean; procedure PrintRow(Position: Integer; No, Company, Addr, City: AnsiString; ShowBackground: boolean); begin if ShowBackground then begin HotPDF.CurrentPage.SetRGBColor($FFF3DD); HotPDF.CurrentPage.Rectangle(50, Position, 520, 20); HotPDF.CurrentPage.Fill; HotPDF.CurrentPage.SetRGBColor(clBlack); end; HotPDF.CurrentPage.TextOut(70, Position, 0, No); HotPDF.CurrentPage.TextOut(110, Position, 0, Company); HotPDF.CurrentPage.TextOut(300, Position, 0, Addr); HotPDF.CurrentPage.TextOut(480, Position, 0, City); end; procedure PreparePage; begin HotPDF.CurrentPage.SetFont('Arial', [fsItalic], 10); HotPDF.CurrentPage.TextOut(50, VertPos, 0, 'customer.db' + ' Page' + AnsiString(IntToStr(PageNum))); HotPDF.CurrentPage.TextOut(480, VertPos, 0, AnsiString(DateTimeToStr(Now))); HotPDF.CurrentPage.MoveTo(50, VertPos + 15); HotPDF.CurrentPage.LineTo(570, VertPos + 15); HotPDF.CurrentPage.MoveTo(50, VertPos + 45); HotPDF.CurrentPage.LineTo(570, VertPos + 45); HotPDF.CurrentPage.Stroke; HotPDF.CurrentPage.SetFont('Times New Roman', [fsItalic, fsBold], 12); HotPDF.CurrentPage.SetRGBFillColor(clNavy); PrintRow(VertPos + 25, 'No', 'Company', 'Addr', 'City', false); HotPDF.CurrentPage.SetRGBFillColor(clBlack); Inc(VertPos, 20); end; begin CustomerTable := TTable.Create(nil); try CustomerTable.DatabaseName := 'DBDEMOS'; CustomerTable.TableName := GetCurrentDir + '\customer.db'; CustomerTable.Active := true; CustomerTable.First; HotPDF := THotPDF.Create(nil); try HotPDF.AutoLaunch := true; HotPDF.FileName := 'TableDemo.pdf'; HotPDF.PageLayout := plOneColumn; HotPDF.BeginDoc; HotPDF.CurrentPage.SetFont('Arial', [fsBold], 24); HotPDF.CurrentPage.TextOut(200, 20, 0, 'Customer report'); // Print PDF header PageNum := 1; VertPos := 60; PreparePage; // Table header Back := true; while (not(CustomerTable.Eof)) do begin Back := not(Back); if (VertPos > 700) then // If end of page then begin HotPDF.AddPage; // Add page, draw and print Inc(PageNum); // table header and set VertPos := 60; // new print position PreparePage; end; PrintRow(VertPos + 25, // print row from the current position AnsiString(CustomerTable.FieldValues['CustNo']), AnsiString(CustomerTable.FieldValues['Company']), AnsiString(CustomerTable.FieldValues['Addr1']), AnsiString(CustomerTable.FieldValues['City']), Back); Inc(VertPos, 20); CustomerTable.Next; end; HotPDF.EndDoc; finally HotPDF.Free; end; finally CustomerTable.Free; end; end. |
Üretimde ne uyarlanmalı?
- Örnek DBDEMOS tablosunu uygulama veri kümesiyle veya sorgu sonucuyla değiştirin.
- Her x koordinatını sabit kodlamak yerine beklenen verilerden sütun genişliklerini ölçün.
- Satırı çizmeden önce alanları kaydırarak veya keserek uzun metni işleyin.
- Dışa aktarılan raporların okunabilir kalması için tablo başlıklarını her yeni sayfada tekrarlayın.
- Düzen değişikliklerini öngörülebilir hale getirmek için sayfa kenar boşluklarını ve satır yüksekliğini adlandırılmış sabitlerde tutun.
Doğrudan PDF tablo çizimi neden faydalıdır?
Doğrudan çizim, görsel rapor tasarımcısına bağlı kalmadan yazı tipleri, renkler, kenarlıklar, sayfa sonları ve özet satırları üzerinde tam kontrol sağlar. Çıkış formatının makineler arasında sabit kalmasının gerektiği sunucu tarafı veya toplu stil araçları için özellikle kullanışlıdır.
[Format Süresi: 0,0033 saniye]