如何解决iText AddImage到特定页面
| 我在尝试将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,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 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()
不错。绝对要保留那些。
,我只是想出如何解决问题。只需删除cb.SaveState()和cb.RestoreState(),它将图像放在页面上实际上是活动的。