Добавление iText() к определенной странице

#itextsharp

#itext

Вопрос:

У меня возникла проблема при попытке найти PdfContentByte непосредственно на определенной странице. Моя проблема в том, что мне нужно добавить изображение для каждой страницы (которое работает) и нужно добавить QR-код к каждой из страниц в правом нижнем углу, но это работает только для первой страницы, и я не знаю, как повторить это на других.

Это мой код:

         public string GeneratePDFDocument(Atomic.Development.Montenegro.Data.Entities.Document document, Stamp stamp)
        {
            string filename = @"C:UsersSheldonDesktopPdf.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();
        }
  

Ответ №1:

Итак, добавьте это в свой 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. Спасибо, Марк, но на самом деле я забыл добавить это в код, но я делал это, и он печатает код только на первой странице. Я полагаю, возможно, это связано с img. Установите абсолютное положение (..) панели размещения

Ответ №2:

Я просто выясняю, как решить проблему. Просто удалите cb.SaveState() и cb.restoreState(), и это приведет к тому, что изображение на странице действительно будет активным.

Комментарии:

1. Это не должно помочь. То, что это действительно беспокоило меня. Происходит что-то еще.