Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism iTextSharp - Fontwechsel innerhalb Zelle (https://www.delphipraxis.net/133725-itextsharp-fontwechsel-innerhalb-zelle.html)

stahli 7. Mai 2009 15:25


iTextSharp - Fontwechsel innerhalb Zelle
 
Hi,

ich erstelle eine PdfPTable:

Delphi-Quellcode:
...
TC := new Chunk(S1 + "." + S2, Font6);
...
cell := new PdfPCell(new Phrase(TC));
...
cell.BackgroundColor := new Color(230, 230, 220)
cell.VerticalAlignment := Element.ALIGN_BOTTOM;
cell.HorizontalAlignment := Element.ALIGN_CENTER;
...
PdfTable.addCell(cell);
...
Weiß jemand, wie ich INNERHALB der Zelle einen Fontwechsel veranlassen kann? Z.B:
"kleine Schrift" dann "groß+fett" dann "gelb hinterlegt" dann "grau hinterlegt"?

Danke
Stahli

stahli 8. Mai 2009 11:30

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Lösung gefunden :-)

Das funktioniert über Phrasen, denen mehrere Chunks zugewiesen werden...
Das Ergebnis seht Ihr in der Anlage.

iTextSharp ist etwas gewöhnungsbedürftig aber durchaus sehr leistungsfähig :-)
Eine deutsche Hilfe ist allerdigs kaum zu finden.

Falls es jemand mal braucht, anbei mein Quelltext dazu.


Stahli


Delphi-Quellcode:
method _Default.ButtonPdf_Click(sender: System.Object; e: System.EventArgs);
const
  Days: array [1..7] of String = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
var
  PdfDoc: Document;
  PdfDocFileName: String;
  PdfTable{, PdfTableNested}: PdfPTable;
  NumColumns, HeaderWidth: Integer;
  X, Y, WeekNo: Integer;
  Font3: Font;
  Font6: Font;
  Font7: Font;
  Font8: Font;
  Font9: Font;
  Font10: Font;
  TC, TC1: Chunk;
  TP: Phrase;
  FirstDate: DateTime;
  ArrayDays: array [1..7, 0..53] of DateTime;
  cell: PdfPCell;
  IsOddMonth: Boolean;

  procedure PaintTable(XO: Integer);
  var
    S1, S2: String;
    gf: Boolean;
  begin
     NumColumns := 28;      
     HeaderWidth := 4;
    PdfTable := new PdfPTable(NumColumns);
           
     PdfTable.WidthPercentage := 100; // percentage
           
     PdfTable.DefaultCell.HorizontalAlignment := Element.ALIGN_CENTER;

    gf := False;
    for Y := 0 to 7 do
    begin
      for X := 0 to 27 do
      begin
        if X = 0 then
        begin
          if Y = 0 then
                TC := new Chunk("Woche", Font7)
          else
                TC := new Chunk(Days[Y], Font9);
             cell := new PdfPCell(new Phrase(TC));
             cell.BackgroundColor := new Color(227, 227, 255);
          cell.VerticalAlignment := Element.ALIGN_MIDDLE;
               cell.HorizontalAlignment := Element.ALIGN_CENTER;
              PdfTable.addCell(cell);
        end
        else
        if Y = 0 then
        begin
          //Size := 8;
          if WeekNo = 0 then
                TC := new Chunk("<<<", Font8)
          else
          if WeekNo = 53 then
                TC := new Chunk(">>>", Font8)
          else
             TC := new Chunk(WeekNo.ToString + ".", Font8);
             cell := new PdfPCell(new Phrase(TC));
             cell.BackgroundColor := new Color(227, 227, 255);
          cell.VerticalAlignment := Element.ALIGN_BOTTOM;
               cell.HorizontalAlignment := Element.ALIGN_CENTER;
              PdfTable.addCell(cell);
          Inc(WeekNo);
        end
        else
        begin
          TP := new Phrase;
             cell := new PdfPCell(TP);
          S1 := ArrayDays[Y, XO + X - 1].Day.ToString;
          if Length(S1) = 1 then
            S1 := '0' + S1;
          S2 := ArrayDays[Y, XO + X - 1].Month.ToString;
          if Length(S2) = 1 then
            S2 := '0' + S2;
...
          begin
...
            begin      
                  TC := new Chunk("X", Font3);
              TP.Add(TC.NewLine);
              if ((S1 <> '10') or (S2 <> '02')) then
              begin
                TC := new Chunk("gr", Font10);
                TC.setBackground(new Color(160, 160, 160));
                TP.Add(TC);
              end;
...
                   begin
                    TC := new Chunk(" ", Font7);
                TP.Add(TC);
                TC := new Chunk("ge", Font10);
                TC.setBackground(new Color(255, 255, 0));
                TP.Add(TC);
              end;
                  TC := new Chunk("X", Font3);
              TP.Add(TC.NewLine);
              gf := not gf;
            end
            else
            begin
                  TC := new Chunk(" ", Font7);
              TP.Add(TC.NewLine);
              TC := new Chunk(" ", Font10);
              TP.Add(TC.NewLine);
            end;
               if not IsOddMonth then
              cell.BackgroundColor := new Color(230, 215, 215)
            else
              cell.BackgroundColor := new Color(255, 255, 255);
          end;
          cell.VerticalAlignment := Element.ALIGN_TOP;
               cell.HorizontalAlignment := Element.ALIGN_CENTER;
              PdfTable.addCell(cell);
        end;
      end;
    end;

     PdfDoc.Add(PdfTable);

  end;

begin
  PdfDocFileName := 'E:\PdfDoc.pdf';
  PdfDoc := new Document(PageSize.A4.Rotate);

   Font3 := FontFactory.getFont(FontFactory.HELVETICA, 3, Font.NORMAL);
   Font6 := FontFactory.getFont(FontFactory.HELVETICA, 6, Font.NORMAL);
   Font7 := FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL);
   Font8 := FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL);
   Font9 := FontFactory.getFont(FontFactory.HELVETICA, 9, Font.NORMAL);
   Font10 := FontFactory.getFont(FontFactory.HELVETICA, 10, Font.NORMAL);

...

  PdfWriter.getInstance(PdfDoc, new FileStream(PdfDocFileName, FileMode.Create));
  PdfDoc.Open;
  PdfDoc.Add(new Paragraph("Pdf:"));
  PdfDoc.Add(new Paragraph(" "));
 
  WeekNo := 0;
  PaintTable(0);

  PdfDoc.Add(new Paragraph(" "));

  PaintTable(27);

  PdfDoc.Close();
end;

stahli 19. Mai 2009 11:38

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
Das Projekt und die PDF-Erstellung funktioniert jetzt schon sehr gut. Allerdings gebe ich noch einen festen Ordner auf dem Server an:

Delphi-Quellcode:
PdfDocFileName := 'd:\web\ABC\XYZ.de\PDFs\PdfDoc.pdf'; // <-- Problem 1
PdfDoc := new Document(PageSize.A4.Rotate);
 
PdfWriter.getInstance(PdfDoc, new FileStream(PdfDocFileName, FileMode.Create));
PdfDoc.Open;

// PDF definieren
 
PdfDoc.Close();
 
Response.Redirect('http:\\www.XYZ.de/PDFs/PdfDoc.pdf', True); // <-- Problem 2
Problem 1:
Local kann ich so die PDF-Erstellung nicht testen, da es diesen Ordner bei mir nicht gibt - und schön ist so eine feste Ordnerbezeichnung ja auch nicht.
Kann ich irgendwie einen Unterordner meiner aspx-Datei angeben: "[Aspx-Ordner]\PDFs\PdfDoc.pdf"?

Problem 2:
Die Anzeige der PDF-Datei im Browser sollte möglichst
- in einem neuen Register (wenn der Browser das unterstützt)
und sonst
- in einem neuen Fernster (möglicht maximiert)
erfolgen.
Wie kann man das lösen?

Stahli

quendolineDD 19. Mai 2009 11:43

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
1.
Nutz dazu ExtractFilePath(ParamStr(0)) und dann deine weitere Unterordner-Struktur.
2.
Naja, wie die PDF angezeigt wird, ob im Browser oder erst geladen und dann lokal über Adope, obliegt den Benutzereinstellungen des Besuchers.

stahli 19. Mai 2009 13:04

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
1) Oups? Bei Asp.Net?

2) Dann beziehe ich mich auf meine Anfrage auf eine beliebige HTML-Seite (dass diese also in einem neuen Register oder Browser angezeigt wird).

Stahli

stahli 20. Mai 2009 10:50

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
Der lokae Dateizugriff geht so:
Delphi-Quellcode:
 
PdfDocFileName := Server.MapPath("PDFs\PdfDoc.pdf");
PdfDoc := new Document(PageSize.A4.Rotate);
...        
PdfDoc.Close();
Response.Redirect('PDFs/PdfDoc.pdf', True);
Die Datei kann somit auf dem lokalen Testserver und einem öffentlichen Server korrekt angesprochen werden.


Lediglich die Möglichkeit, eine Seite in einem neuen Register/Browner zu öffnen fehlt mir noch.

Stahli

stahli 24. Mai 2009 21:35

Re: iTextSharp - Fontwechsel innerhalb Zelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Falls es mal jemand brauchen kann, hier ein Beispiel für eine PDF-Erstellung auf einer Asp.Net-Website mit Delphi Prism und iTextSharp...

Dies soll kein Tutorial ersetzen, sondern lediglich einige Tips für mögliche Lösungswege geben.
Da im Internet meist nur C#- oder VB-Beispiele zu finden sind gestaltet sich die Suche (für Umsteiger) teilw. recht schwierig.

Im Beispiel wird eine PDF mit dynamischen Namen in einem Unterordner der Website erstellt und gleich direkt im Browser angezeigt.
Das funktioniert auf einem lokalen Webserver und einem öffentlichen Webserver gleichermaßen.

Wenn jemand noch eine Möglichkeit kennt, die PDF in einem neuen BrowserFenster oder -Register anzuzeigen, dann wäre eine Info hier noch nett...


Stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz