在pdf中的每个图像的正下方或上方添加文本

private static void InsertTextToPdf(string sourceFileName, string newFileName) { using (Stream pdfStream = new FileStream(sourceFileName, FileMode.Open)) using (Stream newpdfStream = new FileStream(newFileName, FileMode.Create, FileAccess.ReadWrite)) { PdfReader pdfReader = new PdfReader(pdfStream); PdfStamper pdfStamper = new PdfStamper(pdfReader, newpdfStream); PdfContentByte pdfContentByte = pdfStamper.GetOverContent(1); BaseFont baseFont = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.NOT_EMBEDDED); pdfContentByte.SetColorFill(BaseColor.BLUE); pdfContentByte.SetFontAndSize(baseFont, 8); pdfContentByte.BeginText(); pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Kevin Cheng - A Hong Kong actor", 400, 600, 0); pdfContentByte.EndText(); pdfStamper.Close(); } } 

此代码可以正常工作以在PDF中添加文本,但我想在PDF的每个图像的下方添加相同的文本。

我尝试将图像提取的代码与文本添加合并,但不能多次看到相同的文本,同时能够看到多个图像提取。 我在提取图像的同一循环中添加了文本。

 public static Dictionary ExtractImages(string filename, string sourceFileName, string newFileName) { var images = new Dictionary(); Stream newpdfStream = new FileStream(newFileName, FileMode.Create, FileAccess.ReadWrite); using (var reader = new PdfReader(filename)) { // PdfReader pdfReader = new PdfReader(reader); PdfStamper pdfStamper = new PdfStamper(pdfReader, newpdfStream); PdfContentByte pdfContentByte = pdfStamper.GetOverContent(1); var parser = new PdfReaderContentParser(reader); ImageRenderListener listener = null; for (var i = 1; i  0) { foreach (var pair in listener.Images) { images.Add(string.Format("{0}_Page_{1}_Image_{2}{3}", System.IO.Path.GetFileNameWithoutExtension(filename), i.ToString("D4"), index.ToString("D4"), pair.Value), pair.Key); index++; { BaseFont baseFont = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.NOT_EMBEDDED); pdfContentByte.SetColorFill(BaseColor.BLUE); pdfContentByte.SetFontAndSize(baseFont, 8); pdfContentByte.BeginText(); pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Kevin Cheng - A Hong Kong actor", 400 + index * 10, 600, 0); pdfContentByte.EndText(); } } } } pdfStamper.Close(); return images; } } 

您尝试使用的IRenderListener实现ImageRenderListener收集Dictionary的图像Dictionary将图像映射到与其原始类型匹配的文件扩展名。 特别是它完全忽略了图像坐标,因此不能用于在pdf中的每个图像的下方或上方添加文本

相反,你需要一个IRenderListener实现来计算图像顶部的位置坐标; 你实际上可以更进一步,甚至在该监听器中添加文本,例如这个实现:

 public class ImageEntitlingRenderListener : IRenderListener { BaseFont baseFont = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.NOT_EMBEDDED); PdfStamper pdfStamper = null; int page = 0; public ImageEntitlingRenderListener(PdfStamper pdfStamper, int page) { this.pdfStamper = pdfStamper; this.page = page; } public void RenderImage(ImageRenderInfo renderInfo) { Matrix ctm = renderInfo.GetImageCTM(); float xCenter = ctm[Matrix.I31] + 0.5F * ctm[Matrix.I11]; float yTop = ctm[Matrix.I32] + ctm[Matrix.I22]; PdfContentByte pdfContentByte = pdfStamper.GetOverContent(page); pdfContentByte.SetColorFill(BaseColor.BLUE); pdfContentByte.SetFontAndSize(baseFont, 8); pdfContentByte.BeginText(); pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "rahul", xCenter, yTop, 0); pdfContentByte.EndText(); } public void BeginTextBlock() { } public void EndTextBlock() { } public void RenderText(TextRenderInfo renderInfo) { } } 

此渲染侦听器在PDF中的每个位图图像上添加“rahul”。

注意:通过引入一些假设,我保持代码简单。 特别是我假设PDF中的图像是直立呈现的,并且不涉及页面旋转。 在计算xCenteryTop和文本旋转(此处始终为0 )时,通用解决方案必须考虑整个ctm和页面旋转。

您可以使用这样的渲染侦听器:

 private static void InsertTextToPdf(string sourceFileName, string newFileName) { using (Stream pdfStream = new FileStream(sourceFileName, FileMode.Open)) using (Stream newpdfStream = new FileStream(newFileName, FileMode.Create, FileAccess.ReadWrite)) { PdfReader pdfReader = new PdfReader(pdfStream); PdfStamper pdfStamper = new PdfStamper(pdfReader, newpdfStream); var parser = new PdfReaderContentParser(pdfReader); for (var i = 1; i <= pdfReader.NumberOfPages; i++) { parser.ProcessContent(i, (new ImageEntitlingRenderListener(pdfStamper, i))); } pdfStamper.Close(); pdfReader.Close(); } }