iText AddImage () для конкретной страницы - PullRequest
2 голосов
/ 02 мая 2011

У меня возникла проблема при попытке найти 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 ]

4 голосов
/ 02 мая 2011

Так что добавьте его в свой цикл 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() хороши.Обязательно сохраните их.

0 голосов
/ 03 мая 2011

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

...