82 votes

ITextSharp insérer du texte dans un pdf existant

Le titre résume tout.

Je veux ajouter un texte à un fichier PDF existant à l'aide de la fonction iTextSharp Mais je ne trouve pas comment le faire sur le web...

PS : Je ne peux pas utiliser les formulaires PDF.

0 votes

L'édition était significative mais supprimait la balise itextsharp, c'est pourquoi je l'ai rejetée. Mais maintenant, même si j'ajoute la balise, elle est supprimée automatiquement.

0 votes

Il a été fusionné avec itext. Regardez les synonymes

116voto

Tom S. Points 786

J'ai trouvé un moyen de le faire (je ne sais pas si c'est le meilleur mais ça marche).

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();

J'espère que cela peut être utile à quelqu'un =) (et postez ici toute erreur).

10 votes

Un peu de blablabla au hasard - une telle musique à mes oreilles !

3 votes

Mon oldfile.pdf contient 2 pages, mais newfile.pdf contient seulement la première page de oldfile.pdf. Alors où est la deuxième page ?

6 votes

@Nurlan Kenzhebekov, ajoutez le code suivant pour la deuxième page : document.NewPage() ; PdfImportedPage page2 = writer.GetImportedPage(reader, 2) ; cb.AddTemplate(page2, 0, 0) ; //et ainsi de suite pour les pages suivantes.

29voto

Chris Schiffhauer Points 3156

En plus des excellentes réponses ci-dessus, le texte suivant montre comment ajouter du texte à chaque page d'un document de plusieurs pages :

 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();
    }
 }

0 votes

La partie AddTemplate devrait s'occuper de la rotation, s'il y en a une dans le document source - cf. aquí

1 votes

Quel type de références faites-vous pour celles-ci ?

1 votes

Celui-ci gère en fait plusieurs pages

12voto

Zhivko Kabaivanov Points 355

Voici une méthode qui utilise le stamper et les coordonnées absolues affichées dans les différents clients PDF ( Adobe , FoxIt etc. )

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);
        }
    }

0 votes

Pouvez-vous nous dire comment utiliser le paramètre "point" dans votre méthode ?

11voto

jpsnow72 Points 401

Cela a fonctionné pour moi et inclut l'utilisation de 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();
        }
    }

1 votes

L'ancien fichier pdf contient 2 pages, mais le nouveau pdf généré ne contient que la première page de l'ancien fichier pdf. Alors, où se trouve la deuxième page ?

0 votes

La partie AddTemplate devrait s'occuper de la rotation, s'il y en a une dans le document source - cf. aquí

0 votes

Dans quelle bibliothèque se trouvent "Request" et "Response" ?

3voto

David Greenfeld Points 11

Voici une méthode pour imprimer sur des images : tiré de aquí . Utilisez un calque différent pour le texte que vous placez sur les images, et veillez également à utiliser la méthode GetOverContent().

            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();
                }
            }

0 votes

Bien que ce code puisse résoudre la question, y compris une explication En expliquant comment et pourquoi cela résout le problème, vous contribuerez vraiment à améliorer la qualité de votre article et obtiendrez probablement plus de votes positifs. N'oubliez pas que vous répondez à la question pour les lecteurs à venir, et pas seulement pour la personne qui pose la question maintenant. Veuillez consulter le site modifier votre réponse pour ajouter des explications et donner une indication des limites et des hypothèses applicables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X