复制PDF页面会导致文件损坏

时间:2017-06-18 14:46:30

标签: c# pdf itext

我的程序支持在从Excel表中添加一些内容时获取单页分页PDF文档并复制页面。

一切都适用于编辑第一页,但除此之外,它会创建一个损坏的PDF文件。

我在if else循环中使用foreach语句,该循环通过excel表进行迭代(对于它创建新页面并添加它的每一行)。

它的作用是每页都有两个相同的内容副本。 if else语句只是在上半部分添加内容,在下半部分添加下一个内容,依此类推。

以下是代码:(忽略非英语评论)

  // 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

我通过添加每次循环创建的文件流和其他一些方法尝试了几种组合。到目前为止没有工作。有什么建议吗?

编辑:我删除了PDF压模并仅使用编写器添加内容。

我遇到的最后一个问题:document.Add(image)正在主图层下面添加图片。我可以用PDF选择那些图像,但它们不可见。我该如何解决这个问题?

上次编辑:我使用pdfContentByte.AddImage(barcode)代替document.Add(barcode)

解决了这个问题

感谢您的帮助!下次我肯定会先阅读文档。

0 个答案:

没有答案