ITextSharp fügt Text in ein vorhandenes PDF ein

77

Der Titel fasst alles zusammen.

Ich möchte mit iTextSharp einen Text zu einer vorhandenen PDF-Datei hinzufügen , kann jedoch nirgendwo im Web feststellen, wie dies zu tun ist ...

PS: Ich kann keine PDF-Formulare verwenden.

Tony
quelle
Die Bearbeitung war sinnvoll, hat aber das itextsharp-Tag entfernt, weshalb ich es abgelehnt habe. Aber jetzt, selbst wenn ich das Tag hinzufüge, wird es automatisch entfernt.
Tony
Es wurde mit itext zusammengeführt. Schauen Sie sich die Synonyme an
Zoe

Antworten:

108

Ich habe einen Weg gefunden, es zu tun (weiß nicht, ob es das Beste ist, aber es funktioniert)

string oldFile = "oldFile.pdf";
string newFile = "newFile.pdf";

// open the reader
PdfReader reader = new PdfReader(oldFile);
Rectangle size = reader.GetPageSizeWithRotation(1);
Document document = new Document(size);

// open the writer
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();

// the pdf content
PdfContentByte cb = writer.DirectContent;

// select the font properties
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252,BaseFont.NOT_EMBEDDED);
cb.SetColorFill(BaseColor.DARK_GRAY);
cb.SetFontAndSize(bf, 8);

// write the text in the pdf content
cb.BeginText();
string text = "Some random blablablabla...";
// put the alignment and coordinates here
cb.ShowTextAligned(1, text, 520, 640, 0);
cb.EndText();
cb.BeginText();
text = "Other random blabla...";
// put the alignment and coordinates here
cb.ShowTextAligned(2, text, 100, 200, 0);
cb.EndText();

// create the new page and add it to the pdf
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);

// close the streams and voilá the file should be changed :)
document.Close();
fs.Close();
writer.Close();
reader.Close();

Ich hoffe das kann für jemanden nützlich sein =) (und hier alle Fehler posten)

Tony
quelle
7
Einige zufällige blablablabla - solche Musik in meinen Ohren!
Prise
2
Meine oldfile.pdf enthält 2 Seiten, aber die newfile.pdf enthält nur die erste Seite der oldfile.pdf. Wo ist die zweite Seite?
Nurlan
5
@Nurlan Kenzhebekov, fügen Sie folgenden Code für die zweite Seite hinzu: document.NewPage (); PdfImportedPage page2 = writer.GetImportedPage (reader, 2); cb.AddTemplate (Seite 2, 0, 0); // und so weiter für die nächsten Seiten.
Bronek
3
@ Tony S. Leider werden keine Bilder gedruckt. Haben Sie vielleicht eine Lösung dafür?
Maiken Roskilde
2
Es funktioniert, aber der Text, den ich hinzugefügt habe, wird unter den vorhandenen PDF-Bildern platziert. Wie kann ich das beheben?
Onder
26

Zusätzlich zu den hervorragenden Antworten oben wird im Folgenden gezeigt, wie Sie jeder Seite eines mehrseitigen Dokuments Text hinzufügen:

 using (var reader = new PdfReader(@"C:\Input.pdf"))
 {
    using (var fileStream = new FileStream(@"C:\Output.pdf", FileMode.Create, FileAccess.Write))
    {
       var document = new Document(reader.GetPageSizeWithRotation(1));
       var writer = PdfWriter.GetInstance(document, fileStream);

       document.Open();

       for (var i = 1; i <= reader.NumberOfPages; i++)
       {
          document.NewPage();

          var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
          var importedPage = writer.GetImportedPage(reader, i);

          var contentByte = writer.DirectContent;
          contentByte.BeginText();
          contentByte.SetFontAndSize(baseFont, 12);

          var multiLineString = "Hello,\r\nWorld!".Split('\n');

          foreach (var line in multiLineString)
          {
             contentByte.ShowTextAligned(PdfContentByte.ALIGN_LEFT, line, 200, 200, 0);
          }

          contentByte.EndText();
          contentByte.AddTemplate(importedPage, 0, 0);
       }

       document.Close();
       writer.Close();
    }
 }
Chris Schiffhauer
quelle
Der AddTemplate-Teil sollte sich um die Rotation kümmern, falls es eine im Quelldokument gibt - siehe hier
Matthieu
1
Welche Art von Referenzen machen Sie für diese?
Si8
1
Dieser behandelt tatsächlich mehrere Seiten
Matthew Lock
@ Chris Schiffhauer gibt es eine Möglichkeit, einer bestimmten Seite Text hinzuzufügen. Sagen Sie für z. Ich möchte nur Text zur vorletzten Seite meiner PDF-Datei hinzufügen. Irgendwelche Ideen?
Jestino Sam
11

Dies hat bei mir funktioniert und beinhaltet die Verwendung von OutputStream:

PdfReader reader = new PdfReader(new RandomAccessFileOrArray(Request.MapPath("Template.pdf")), null);
    Rectangle size = reader.GetPageSizeWithRotation(1);
    using (Stream outStream = Response.OutputStream)
    {
        Document document = new Document(size);
        PdfWriter writer = PdfWriter.GetInstance(document, outStream);

        document.Open();
        try
        {
            PdfContentByte cb = writer.DirectContent;

            cb.BeginText();
            try
            {
                cb.SetFontAndSize(BaseFont.CreateFont(), 12);
                cb.SetTextMatrix(110, 110);
                cb.ShowText("aaa");
            }
            finally
            {
                cb.EndText();
            }

                PdfImportedPage page = writer.GetImportedPage(reader, 1);
                cb.AddTemplate(page, 0, 0);

        }
        finally
        {
            document.Close();
            writer.Close();
            reader.Close();
        }
    }
jpsnow72
quelle
1
Die alte PDF-Datei enthält 2 Seiten, die neu generierte PDF-Datei enthält jedoch nur die erste Seite der alten PDF-Datei. Wo ist die zweite Seite?
Nurlan
Der AddTemplate-Teil sollte sich um die Rotation kümmern, falls es eine im Quelldokument gibt - siehe hier
Matthieu
In welcher Bibliothek befinden sich "Request" und "Response"?
mächtige
Die Antwort ist Teil von System.Web. Es ist in der Page-Klasse.
jpsnow72
11

Hier ist eine Methode, die Stempel und absolute Koordinaten verwendet, die in den verschiedenen PDF-Clients ( Adobe , FoxIt usw.) angezeigt werden .

public static void AddTextToPdf(string inputPdfPath, string outputPdfPath, string textToAdd, System.Drawing.Point point)
    {
        //variables
        string pathin = inputPdfPath;
        string pathout = outputPdfPath;

        //create PdfReader object to read from the existing document
        using (PdfReader reader = new PdfReader(pathin))
        //create PdfStamper object to write to get the pages from reader 
        using (PdfStamper stamper = new PdfStamper(reader, new FileStream(pathout, FileMode.Create)))
        {
            //select two pages from the original document
            reader.SelectPages("1-2");

            //gettins the page size in order to substract from the iTextSharp coordinates
            var pageSize = reader.GetPageSize(1);

            // PdfContentByte from stamper to add content to the pages over the original content
            PdfContentByte pbover = stamper.GetOverContent(1);

            //add content to the page using ColumnText
            Font font = new Font();
            font.Size = 45;

            //setting up the X and Y coordinates of the document
            int x = point.X;
            int y = point.Y;

            y = (int) (pageSize.Height - y);

            ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(textToAdd, font), x, y, 0);
        }
    }
Zhivko Kabaivanov
quelle
Können Sie uns sagen, wie Sie den Parameter "point" in Ihrer Methode verwenden sollen?
Sport
0

Hier ist eine Methode zum Drucken von Bildern: von hier aus aufgenommen . Verwenden Sie eine andere Ebene für Ihren Text, den Sie über die Bilder legen, und stellen Sie außerdem sicher, dass Sie die GetOverContent () -Methode verwenden.

            string oldFile = "FileWithImages.pdf";
            string watermarkedFile = "Layers.pdf";
            // Creating watermark on a separate layer
            // Creating iTextSharp.text.pdf.PdfReader object to read the Existing PDF Document
            PdfReader reader1 = new PdfReader(oldFile);
            using (FileStream fs = new FileStream(watermarkedFile, FileMode.Create, FileAccess.Write, FileShare.None))
            // Creating iTextSharp.text.pdf.PdfStamper object to write Data from iTextSharp.text.pdf.PdfReader object to FileStream object
            using (PdfStamper stamper = new PdfStamper(reader1, fs))
            {
                // Getting total number of pages of the Existing Document
                int pageCount = reader1.NumberOfPages;

                // Create New Layer for Watermark
                PdfLayer layer = new PdfLayer("Layer", stamper.Writer);
                // Loop through each Page
                for (int i = 1; i <= pageCount; i++)
                {
                    // Getting the Page Size
                    Rectangle rect = reader1.GetPageSize(i);

                    // Get the ContentByte object
                    PdfContentByte cb = stamper.GetOverContent(i);

                    // Tell the cb that the next commands should be "bound" to this new layer
                    cb.BeginLayer(layer);
                    
                    BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
                    cb.SetColorFill(BaseColor.RED);
                    cb.SetFontAndSize(bf, 100);

                    cb.BeginText();
                    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Some random blablablabla...", rect.Width / 2, rect.Height / 2, - 90);
                    cb.EndText();

                    // Close the layer
                    cb.EndLayer();
                }
            }
David Greenfeld
quelle
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
28огдан Опир