Duplicating PDF pages creates corrupted file

2019-08-29 10:17发布

问题:

My program is suppost to take a single paged PDF document and duplicating the page while adding some content from an Excel table.

Everything works for editing the first page, but beyond that it creates a corrupt PDF file.

I used an if else statement in the foreach loop that is iteraing trough the excel table(for every row it creates a new page and adds it).

What it does is that there are two same copies of content on every page. The if else statement simply add the content once on the upper and the next on the lowe half and so on.

Here is the code:(ignore the non-english comments)

  // open the reader
            PdfReader reader = new PdfReader(btn_izberiPole.Content.ToString());
            iTextSharp.text.Rectangle size = reader.GetPageSizeWithRotation(1);
            Document document = new Document(size);
            // open the writer

            FileStream fs = new FileStream(btn_izberiCiljnoMapo.Content.ToString(), FileMode.Create, FileAccess.Write);  //todo: preveri če je odprto
            PdfWriter writer = PdfWriter.GetInstance(document, fs);
            document.Open();

            int count = 1;      
            var stamper = new PdfStamper(reader, fs);

            foreach (string sifra in seznamSifer)           //iterates trough every number to be added
            {
                if (count % 2 != 0)  //za prvo polovico pol
                {

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

                    PdfImportedPage page = writer.GetImportedPage(reader, 1);   //add old page
                    cb.AddTemplate(page, 0, 0);
                    var pdfContentByte = stamper.GetOverContent(1);

                    //prvi je sivi
                    iTextSharp.text.Image barcode = iTextSharp.text.Image.GetInstance(izdelajCrtnoKodo(System.Drawing.Color.LightGray, sifra), System.Drawing.Imaging.ImageFormat.Jpeg);


                    //barcode.ScaleToFit(200f, 15f); //tole za velikost zgornjih črtnih kod
                    barcode.SetAbsolutePosition(80, 235.9f);
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(91, 9.4f));

                    pdfContentByte.AddImage(barcode);

                    //druga crtna koda

                    barcode = iTextSharp.text.Image.GetInstance(izdelajCrtnoKodo(System.Drawing.Color.White, sifra), System.Drawing.Imaging.ImageFormat.Jpeg);
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(91, 9.4f));
                    barcode.SetAbsolutePosition(367, 217.4f);
                    pdfContentByte.AddImage(barcode);

                    //tretja crtna koda
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(79.4f, 8.5f)); //tole za velikost spodnje črtne kode   //
                    barcode.SetAbsolutePosition(381.5f, 172.6f);
                    pdfContentByte.AddImage(barcode);

                }


                else                //za drugo polovico
                {


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

                    PdfImportedPage page = writer.GetImportedPage(reader, 1);   //add old page
                    cb.AddTemplate(page, 0, 0);
                  //  var stamper = new PdfStamper(reader, fs);
                    var pdfContentByte = stamper.GetOverContent(1);

                    //prvi je sivi
                    iTextSharp.text.Image barcode = iTextSharp.text.Image.GetInstance(izdelajCrtnoKodo(System.Drawing.Color.LightGray, sifra), System.Drawing.Imaging.ImageFormat.Jpeg);

                    barcode.SetAbsolutePosition(80, 35.9f);    //org 235.9f        
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(91, 9.4f));

                    pdfContentByte.AddImage(barcode);

                    //druga crtna koda

                    barcode = iTextSharp.text.Image.GetInstance(izdelajCrtnoKodo(System.Drawing.Color.White, sifra), System.Drawing.Imaging.ImageFormat.Jpeg);
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(91, 9.4f));
                    barcode.SetAbsolutePosition(367, 217.4f);
                    pdfContentByte.AddImage(barcode);

                    //tretja crtna koda
                    barcode.ScaleAbsolute(new iTextSharp.text.Rectangle(79.4f, 8.5f)); //tole za velikost spodnje črtne kode   //
                    barcode.SetAbsolutePosition(381.5f, 172.6f);
                    pdfContentByte.AddImage(barcode);
                    // stamper.Close(); //tale more bit namesto doc.close

                    document.NewPage();

                }

                count++;
               /* if (count == 5) */break;

            }

            stamper.Close(); //tale more bit namesto doc.close

I tried several combinations by adding the file stream to be created in loop each time and some other methods. None worked so far. Any suggestions?

EDIT: I removed PDF stamper and used only writer for adding content.

One last problem I am encountering: document.Add(image) is adding images below the main layer. I can select those images in PDF but they are not visible. How can I solve this?

LAST EDIT: I solved this by using pdfContentByte.AddImage(barcode) instead of document.Add(barcode)

Thank you for your help guys! Next time I will for sure read the documentation first.

标签: c# pdf itext