Sonntag, Dezember 8, 2019

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

1 Kommentar

  1. 0

    nach einigen änderungen in der _events-Klasse, ich habe, was ich will, aber kann es nicht der richtige Weg, es zu tun, aber für jetzt seine Arbeit für mich 🙂

    public class _events : PdfPageEventHelper
    {
    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 PTempName = new Paragraph("Template Name:" + TempName, FontFactory.GetFont(FontFactory.TIMES, 10, iTextSharp.text.Font.NORMAL));
    Paragraph PDate = new Paragraph(DateTime.UtcNow.ToShortDateString(), FontFactory.GetFont(FontFactory.TIMES, 10, iTextSharp.text.Font.NORMAL));
    //adding image (logo)
    string imageURL = "http://108.168.203.227/PoologicApp/Content/Bootstrap/images/logo.png";//HttpContext.Current.Server.MapPath("~/Content/images.jpg");
    iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageURL);
    //Resize image depend upon your need
    jpg.ScaleToFit(70f, 120f);
    //Give space before image
    //jpg.SpacingBefore = 10f;
    //Give some space after the image
    jpg.SpacingAfter = 1f;
    jpg.Alignment = Element.ALIGN_TOP;
    PTempName.Alignment = Element.ALIGN_TOP;
    PDate.Alignment = Element.ALIGN_TOP;
    PdfPTable headerTbl = new PdfPTable(3);
    headerTbl.TotalWidth = 600;
    headerTbl.HorizontalAlignment = Element.ALIGN_TOP;
    PdfPCell cell11 = new PdfPCell(PTempName);
    PdfPCell cell3 = new PdfPCell(PDate);
    PdfPCell cell2 = new PdfPCell(jpg);
    cell2.Border = 0;
    cell11.Border = 0;
    cell3.Border = 0;
    cell11.PaddingLeft = 10;
    cell3.PaddingLeft = 10;
    cell2.PaddingLeft = 10;
    headerTbl.AddCell(cell11);
    headerTbl.AddCell(cell3);
    headerTbl.AddCell(cell2);
    headerTbl.WriteSelectedRows(0, -1, doc.LeftMargin, doc.PageSize.Height - 4, writer.DirectContent);
    }
    }

    nun 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)

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...