Python 2:
Interpreter: /usr/bin/python2 (ver 2.6.6)
Python 3:
Interpreter: /some/other/folder/python3 (ver 3.3.2)
Python (for build): /usr/bin/python2
此代码可以在PDF中添加文本,但我希望在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();
}
}
答案 0 :(得分:1)
您尝试使用的IRenderListener
实施ImageRenderListener
会将Dictionary<System.Drawing.Image, string>
映射图像中的图像收集到与其原始类型匹配的文件扩展名中。特别是它完全忽略了图像坐标,因此不能用于在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中的图像是直立呈现的,并且不涉及页面旋转。在计算ctm
,xCenter
和文本轮换(此处始终为yTop
)时,通用解决方案必须考虑整个0
和页面轮换。
您可以使用这样的渲染侦听器:
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();
}
}