iText AddImage()到特定页面

时间:2011-05-01 23:42:25

标签: itextsharp

我在尝试将PdfContentByte直接定位到特定页面时遇到问题。我的问题是:我需要为每个页面添加一个图像(可行),并且需要在右下角的每个页面添加一个QRCode,但这只适用于第一页,我不知道如何重复它在其他的。

这是我的代码:

        public string GeneratePDFDocument(Atomic.Development.Montenegro.Data.Entities.Document document, Stamp stamp)
        {
            string filename = @"C:\Users\Sheldon\Desktop\Pdf.Pdf";
            FileStream fs = new FileStream(filename, FileMode.Create);

            iTextSharp.text.Document pdfDocument = new iTextSharp.text.Document(PageSize.LETTER, PAGE_LEFT_MARGIN, PAGE_RIGHT_MARGIN, PAGE_TOP_MARGIN, PAGE_BOTTOM_MARGIN);
            iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDocument, fs);

            pdfDocument.Open();

            int count = document.Pages.Count;
            foreach (Page page in document.Pages)
            {
                Image img = Image.GetInstance(page.Image);
                img.ScaleToFit(PageSize.LETTER.Width-(PAGE_LEFT_MARGIN + PAGE_RIGHT_MARGIN), PageSize.LETTER.Height-(PAGE_TOP_MARGIN + PAGE_BOTTOM_MARGIN));
                pdfDocument.Add(img);

                PlaceCodeBar(writer);

            }

            pdfDocument.Close();
            writer.Close();
            fs.Close();

            return filename;
        }

        private static void PlaceCodeBar(iTextSharp.text.pdf.PdfWriter writer)
        {
            String codeText = "TEXT TO ENCODE";

            iTextSharp.text.pdf.BarcodePDF417 pdf417 = new iTextSharp.text.pdf.BarcodePDF417();
            pdf417.SetText(codeText);
            Image img = pdf417.GetImage();
            iTextSharp.text.pdf.BarcodeQRCode qrcode = new iTextSharp.text.pdf.BarcodeQRCode(codeText, 1, 1, null);
            img = qrcode.GetImage();


            iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
            cb.SaveState();
            cb.BeginText();

            img.SetAbsolutePosition(PageSize.LETTER.Width-PAGE_RIGHT_MARGIN-img.ScaledWidth, PAGE_BOTTOM_MARGIN);
            cb.AddImage(img);
            cb.EndText();
            cb.RestoreState();
        }

2 个答案:

答案 0 :(得分:4)

然后将其添加到foreach (Page...)循环中:

        foreach (Page page in document.Pages)
        {
            Image img = Image.GetInstance(page.Image);
            img.ScaleToFit(PageSize.LETTER.Width-(PAGE_LEFT_MARGIN + PAGE_RIGHT_MARGIN), PageSize.LETTER.Height-(PAGE_TOP_MARGIN + PAGE_BOTTOM_MARGIN));
            pdfDocument.Add(img);
            PlaceCodeBar(writer);
        }

如果这是对同一PDF的第二次传递(您已将其关闭然后再次打开),请使用PdfStamper而不是PdfWriter。然后,您可以获取每个页面的直接内容,而不是每个页面重复使用(和重置)的直接内容。

PS:放弃BeginText()EndText()来电。这些操作符只应在实际绘制文本/设置字体/等时使用。没有线条艺术。没有图像。 SaveState() / RestoreState()虽然很好。绝对保留那些。

答案 1 :(得分:0)

我只想弄清楚如何解决问题。只需删除cb.SaveState()和cb.RestoreState(),它就会使页面上的图像实际上处于活动状态。