#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. Это не должно помочь. То, что это действительно беспокоило меня. Происходит что-то еще.