13 Stimmen

Seite X von Y Ausgabe

Ich habe 3 verschiedene Möglichkeiten ausprobiert, um die Seitenzahlen anzuzeigen, der Inhalt von OnCloseDocument wird auf der Seite nicht angezeigt, keine davon hat funktioniert.

Meine Absicht ist es, Seitenzahlen wie folgt anzuzeigen:

1 von 10
2 von 10
..............
............
10 von 10 auf jeder Seite

Ich weiß, wie man das anzeigt:

1
2
3
4
....
10

aber ich weiß nicht, wie man die Gesamtanzahl der Seiten anzeigt

Ich verwende OnCloseDocument, um die Anzahl der Seiten anzuzeigen, aber der Inhalt wird nicht angezeigt.

public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper
{
    protected PdfTemplate total;
    protected BaseFont helv;
    private bool settingFont = false;

    public override void OnOpenDocument(PdfWriter writer, Document document)
    {
        template= writer.DirectContent.CreateTemplate(100, 100);       

        bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
    }
    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
    //siehe unten
    }

1. WEG:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        //Ich erstelle eine Tabelle mit einer Spalte wie unten.
        PdfPTable pageNumber2 = new PdfPTable(1);
        pageNumber2.TotalWidth = 50;
        pageNumber2.HorizontalAlignment = Element.ALIGN_RIGHT;

        pageNumber2.AddCell(BuildTable2RightCells("Seite " + writer.PageNumber));
        pageNumber.AddCell(BuildTable2LeftCells(writer.PageCount));
        pageNumber2.WriteSelectedRows(0, -1, 500, 
        (document.PageSize.GetBottom(140)), cb);
    }    

2. WEG:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        ColumnText.ShowTextAligned(template,Element.ALIGN_CENTER,new
        Phrase(writer.PageNumber.ToString()), 500, 140, 0);
    }

3. WEG:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        template.BeginText();
        template.SetFontAndSize(bf, 8);
        template.SetTextMatrix(500, 140);
        template.ShowText(Convert.ToString((writer.PageNumber - 1)));
        template.EndText();
    }

Mache ich etwas falsch?

17voto

Chris Haas Punkte 50077

Ihre zweite Möglichkeit ist wahrscheinlich die einfachste Möglichkeit. Unten ist eine sehr, sehr reduzierte, aber funktionierende Version:

public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper {
    public override void OnEndPage(PdfWriter writer, Document document) {
        ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, new Phrase(writer.PageNumber.ToString()), 500, 140, 0);
    }
}

Und um es zu verwenden:

//Eine Datei auf unserem Desktop erstellen
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "OnCloseTest.pdf");
//Standard PDF-Erstellung, bei Bedarf anpassen
using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (Document doc = new Document(PageSize.LETTER)) {
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {

            //Unseren benutzerdefinierten Ereignishandler finden
            writer.PageEvent = new MyPdfPageEventHelpPageNo();

            doc.Open();

            //Text zur ersten Seite hinzufügen
            doc.Add(new Paragraph("Test"));

            //Eine neue Seite mit mehr Text hinzufügen
            doc.NewPage();
            doc.Add(new Paragraph("Another Test"));

            doc.Close();
        }
    }
}

BEARBEITEN

Entschuldigung, ich dachte, Sie hätten Probleme mit dem grundlegenden Setup von Ereignissen, mein Fehler.

Ich habe nur zwei Möglichkeiten gesehen, das zu tun, was Sie versuchen, entweder zwei Durchläufe machen oder die PdfTemplate-Syntax verwenden, die meines Wissens nach ein Bild rendert.

Ich würde empfehlen, einfach zwei Durchläufe zu machen, den ersten nur um Ihr PDF zu erstellen und den zweiten um Ihre Seitenzahlen hinzuzufügen. Sie können Ihren ersten Durchlauf an einen MemoryStream senden, damit Sie die Festplatte nicht zweimal belasten müssen, falls Sie das möchten.

PdfReader reader = new PdfReader(outputFile);
using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (PdfStamper stamper = new PdfStamper(reader, fs)) {
        int PageCount = reader.NumberOfPages;
        for (int i = 1; i <= PageCount; i++) {
            ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0} of {1}", i, PageCount)), 500, 140, 0);
        }
    }
}

0 Stimmen

Schöne Lösung, obwohl ich wünschte, ich könnte herausfinden, warum die Vorlagenmethode nicht funktioniert, da ich sehe, dass sie mächtiger sein könnte.

0 Stimmen

Warum die secondFile und wie erstellen Sie sie?

0 Stimmen

Das funktioniert gut. Mein einziges Problem ist, dass ich einige Seiten in meinem Dokument habe, die im Hochformat und einige im Querformat sind. Gibt es einen einfachen Weg, wie ich erkennen kann, welche Seite wie ist und entsprechend die x-Koordinate für die 'Seite x von y' anpassen kann?

3voto

robert jebakumar2 Punkte 116

Hier ist Beispielcode für die "Chris Haas" Erklärung ( die Zwei-Schritt-Methode ohne Schreiben der Datei auf die Festplatte)

Der "kopieren und einfügen-Code" verwendet MemoryStream für die Ausgabe Seite x von y

geschützt void Button2_Click(object sender, EventArgs e)
{
    byte[] b = CreatePDF2();        
    string ss = HttpContext.Current.Request.PhysicalApplicationPath;
    string filenamefirst = ss + DateTime.Now.ToString("ddMMyyHHmmss");
    string filenamefirstpdf = filenamefirst + ".pdf";

    unter Verwendung von (PdfReader reader = new PdfReader(b))
    {
        unter Verwendung von (FileStream fs = neue FileStream(filenamefirstpdf, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            unter Verwendung von (PdfStamper stamper = neue PdfStamper(reader, fs))
            {
                int PageCount = reader.NumberOfPages;
                BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

                für (int i = 1; i <= PageCount; i++)
                {
                   string sss = String.Format("Seite {0} von {1}", i, PageCount);
                   PdfContentByte über =  stamper.GetOverContent(i);
                   über.BeginText();                        
                   über.SetTextMatrix(500, 750);
                   über.SetFontAndSize(bf, 8);                                              
                   über.ShowText(sss);
                   über.EndText();
                }
            }
        }
    }
}

private byte[] CreatePDF2()
{
    Document doc = new Document(PageSize.LETTER, 50, 50, 50, 50);

    unter Verwendung von (MemoryStream output = neue MemoryStream())
    {
        PdfWriter wri = PdfWriter.GetInstance(doc, output);
        doc.Open();

        Absatz header = neue Absatz("Mein Dokument") { Ausrichtung = Element.ALIGN_CENTER };
        Absatz absatz = neue Absatz("Testen des iText pdf.");
        Phrase phrase = neue Phrase("Dies ist eine Phrase, aber auch Testen von einigen Formatierungen. \nNeue Zeile hier.");
        Chunk chunk = new Chunk("Dies ist ein Brocken.");

        PdfPTable tab = neue PdfPTable(3);
        PdfPCell zelle = neue PdfPCell(neue Phrase("Header", neue Font(Font.FontFamily.HELVETICA, 24F)));
        zelle.Colspan = 3;
        zelle.HorizontalAlignment = 1; //0=Links, 1=Mitte, 2=Rechts   //Stil
        zelle.BorderColor = new BaseColor(System.Drawing.Color.Red);
        zelle.Border = Rectangle.BOTTOM_BORDER; // | Rectangle.TOP_BORDER;
        zelle.BorderWidthBottom = 3f;
        tab.AddCell(zelle);
        //Reihe 1

        für (int i = 1; i < 120; i++)
        {
            //Reihe 1
            tab.AddCell("R1C1");
            tab.AddCell("R1C2");
            tab.AddCell("R1C3");
            //Reihe 2
            tab.AddCell("R2C1");
            tab.AddCell("R2C2");
            tab.AddCell("R2C3");
        }

        doc.Add(header);
        doc.Add(absatz);
        doc.Add(phrase);
        doc.Add(chunk);
        doc.Add(tab);
        doc.Close();
        return output.ToArray();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X