gewusst wie: einfügen von Kopf-und Fußzeile, um vorhandene pdf-Dokumente mit itextsharp (ohne überschreiben der bestehenden Inhalte auf der Seite)

In meinem Projekt bin ich mit MVC4,C# und itextsharp zu erzeugen, pdf aus html. Ich muss einfügen, Kopfzeile mit logo und name der Vorlage, und die Fußzeile mit paging (Seitenzahl/Gesamtzahl der Seiten). Ich bin der footer, ich habe diesen code hinzufügen Fußzeile der pdf-Datei:

public static byte[] AddPageNumbers(byte[] pdf)
        {
            MemoryStream ms = new MemoryStream();
            ms.Write(pdf, 0, pdf.Length);
            //we create a reader for a certain document
            PdfReader reader = new PdfReader(pdf);
            //we retrieve the total number of pages
            int n = reader.NumberOfPages;
            //we retrieve the size of the first page
            Rectangle psize = reader.GetPageSize(1);

            //step 1: creation of a document-object
            Document document = new Document(psize, 50, 50, 50, 50);
            //step 2: we create a writer that listens to the document
            PdfWriter writer = PdfWriter.GetInstance(document, ms);
            //step 3: we open the document

            document.Open();
            //step 4: we add content
            PdfContentByte cb = writer.DirectContent;



            int p = 0;
            Console.WriteLine("There are " + n + " pages in the document.");
            for (int page = 1; page <= reader.NumberOfPages; page++)
            {
                document.NewPage();
                p++;
                PdfImportedPage importedPage = writer.GetImportedPage(reader, page);

                cb.AddTemplate(importedPage, 0, 0);

                BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
                cb.BeginText();
                cb.SetFontAndSize(bf, 10);
                cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, +p + "/" + n, 44, 7, 0);
                cb.EndText();


            }
            //step 5: we close the document

            document.Close();
            return ms.ToArray();
        }
    }

wenn Sie müssen eine Erklärung über diesen code lassen Sie es mich bitte wissen.

Habe ich versucht zu verwenden die gleiche Methode für header, aber mein logo ist das überschreiben der bestehenden Inhalte der pdf-Seite. Dann ich versuchte, verwenden Sie diesen code, aber kein Glück 🙁

       public _events(string TemplateName,string ImgUrl)
        {
            this.TempName = TemplateName;
            this.ImageUrl = ImgUrl;
        }
        private string TempName = string.Empty;
        private string ImageUrl = string.Empty;

        public override void OnEndPage(PdfWriter writer, Document doc)
        {


            //Paragraph footer = new Paragraph("THANK YOU ", FontFactory.GetFont(FontFactory.TIMES, 10, iTextSharp.text.Font.NORMAL));




            Paragraph header = new Paragraph("Template Name:" + TempName + "                             " +DateTime.UtcNow, FontFactory.GetFont(FontFactory.TIMES, 10, iTextSharp.text.Font.NORMAL));

            //adding image (logo)

            string imageURL = HttpContext.Current.Server.MapPath("~/Content/images.jpg");
            iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageURL);
            //Resize image depend upon your need
            jpg.ScaleToFit(140f, 120f);
            //Give space before image
            jpg.SpacingBefore = 10f;
            //Give some space after the image
            jpg.SpacingAfter = 1f;
            jpg.Alignment = Element.ALIGN_LEFT;


            header.Alignment = Element.ALIGN_TOP;

            PdfPTable headerTbl = new PdfPTable(1);

            headerTbl.TotalWidth = 400;

            headerTbl.HorizontalAlignment = Element.ALIGN_CENTER;

            PdfPCell cell11 = new PdfPCell(header);
            PdfPCell cell2 = new PdfPCell(jpg);
            cell2.Border = 0;
            cell11.Border = 0;

            cell11.PaddingLeft = 10;
            cell2.PaddingLeft = 10;
            headerTbl.AddCell(cell11);
            headerTbl.AddCell(cell2);

            headerTbl.WriteSelectedRows(0, -1, doc.LeftMargin, doc.PageSize.Height - 10, writer.DirectContent);

  }
    }

hier ist meine Action Methode, um die Rückgabe der pdf-Datei als Antwort. und ich habe diese Klasse in es. entschuldigt, vielleicht sollte ich nach diesem Anfang meiner Frage.

[HttpGet]
[HandleException]
public ActionResult GenerateLeadProposalPDF()
{
    TempData.Keep();
    long LeadId = Convert.ToInt64(TempData["Leadid"]);
    long EstimateId = Convert.ToInt64(TempData["Estimateid"]);
    long ProposalTemplateId = Convert.ToInt64(TempData["ProposalTemplateId"]);
    Guid SubscriberId = SessionManagement.LoggedInUser.SubscriberId;
    var data = this._LeadEstimateAPIController.GetLeadProposalDetails(LeadId, EstimateId, ProposalTemplateId, SubscriberId);
    System.Text.StringBuilder strBody = new System.Text.StringBuilder("");
    string SubscriberProjectBody = this.ControllerContext.RenderRazorViewToString(ViewData, TempData, "~/Areas/Subscriber/Views/Shared/_GenerateProposalTemplate.cshtml", data);
    string Header = this.ControllerContext.RenderRazorViewToString(ViewData, TempData, "~/Areas/Subscriber/Views/Shared/_HeaderGenerateProposals.cshtml", data);
    string styleCss = System.IO.File.ReadAllText(Server.MapPath("~/ProposalDoc_CSS.txt"));
    strBody.Append(@"<html><head><title></title>   </head>");
    strBody.Append(@"<body lang=EN-US style='tab-interval:.5in'>");
   //strBody.Append(Header);
    strBody.Append(SubscriberProjectBody);
    strBody.Append(@"</body></html>");
    String htmlText = strBody.ToString();
    Document document3 = new Document(PageSize.A4, 36, 36, 36, 36);
    _events e = new _events(data.objProposalLeadDetailsModel.ProposalFullName,"test");
    string filePath = HostingEnvironment.MapPath("~/");
    filePath = filePath + "pdf-.pdf";
    var stream=new FileStream(filePath, FileMode.Create);
  var objPdfWriter=  PdfWriter.GetInstance(document3, stream);
    document3.Open();
    objPdfWriter.PageEvent = e;
    iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document3);
    hw.Parse(new StringReader(htmlText));
    document3.Close();
    var result = System.IO.File.ReadAllBytes(filePath);
    var abd = new FileStream(filePath, FileMode.Open, FileAccess.Read);

    var streamArray = ReadFully(abd);

    var streamFile = AddPageNumbers(streamArray);




    //Response.End();
    string contentType = "application/pdf";
    return File(streamFile, contentType, "LeadProposal.pdf");
}

Ich suchte eine Menge über google, meine pdf sieht so aus gewusst wie: einfügen von Kopf-und Fußzeile, um vorhandene pdf-Dokumente mit itextsharp (ohne überschreiben der bestehenden Inhalte auf der Seite)

Jede Anregung oder Hilfe sind wir dankbar, Bitte helft mir, danke im Voraus 🙂

  • Für bereits bestehende PDFs, die Sie vielleicht lieber einen Prozess wie den in der TwoPasses.cs Beispiel.
  • es wird auch das überschreiben der bestehenden Inhalte @mkl
  • Verwenden GetUnderContent statt GetOverContent. Oder "Transparenz".
  • was ist, wenn ich hinzufügen müssen, um 100 oder mehr-Zeile in den Anfang (header) oder am Ende (Fußzeile) meine pdf-Datei. können wir Raum schaffen für diese zusätzlichen Inhalte? Ich brauche nicht meinen neuen Inhalt über oder unter auf vorhandene Inhalte, die ich brauche, um meine neuen Inhalte mit den alten Inhalt mit dem gleichen layout.
  • Ich muss hinzufügen, 100 oder mehr-Zeile in den Anfang (header) oder am Ende (Fußzeile) meine pdf-Datei - meinst du "über der aktuellen oberen Rand der Seite" / "unter dem aktuellen unteren Rand der Seite"? Sobald Sie wissen, wie viel Speicherplatz Sie benötigen, können Sie ganz einfach erweitern Sie die media box und andere Boxen, wenn vorhanden), um Platz für die zusätzlichen Inhalte. Oder meinst du so etwas wie "zwischen den aktuellen header und dem Inhalt" / "..."? Das könnte sich als schwierig erweisen.
InformationsquelleAutor R K Sharma | 2015-07-28
Schreibe einen Kommentar