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

时间:2017-03-21 11:58:01

标签: c# pdf itext

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();
            }
        }

1 个答案:

答案 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中的图像是直立呈现的,并且不涉及页面旋转。在计算ctmxCenter和文本轮换(此处始终为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();
    }
}