iTextSharp - Text overlapping image

前端 未结 2 956
故里飘歌
故里飘歌 2021-01-20 07:29

I\'m using iTextSharpText to build a PDF.

I was asked to add some dynamic text over an image. I\'ve already tried some examples that I found on this forum and other

2条回答
  •  佛祖请我去吃肉
    2021-01-20 08:13

    It looks like you want to add a background image to a PdfPCell. The recommended approach is to implement the IPdfPCellEvent interface. As documented, you only need to write one method, CellLayout, when you write the custom class that implements IPdfPCellEvent. From your code it looks like you're in a web environment, so this simple example HTTP handler (.ashx) should be easy to follow:

    <%@ WebHandler Language="C#" Class="cellEvent" %>
    using System;
    using System.Web;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    
    public class cellEvent : IHttpHandler {
      public void ProcessRequest (HttpContext context) {
        HttpServerUtility Server = context.Server;
        HttpResponse Response = context.Response;
        Response.ContentType = "application/pdf";
        // replace with your image
        string imagePath = Server.MapPath("./Image1.png");
        Image image = Image.GetInstance(imagePath);
        using (Document document = new Document()) {
          PdfWriter.GetInstance(document, Response.OutputStream);      
          document.Open();
          PdfPTable table = new PdfPTable(2);
          for (int i = 1; i < 10; ++i) {
            PdfPCell cell = new PdfPCell(new PdfPCell());
            // add the text
            cell.Phrase = new Phrase(string.Format("CELL 1, ROW {0}", i));
            // your class that adds the background image
            cell.CellEvent = new TestCellEvent() { 
              CellImage = image
            };
            table.AddCell(cell);
            // add __new__ cell; CellEvent no longer applies;
            // (no background image)
            table.AddCell(new PdfPCell(new Phrase(
              string.Format("CELL 2, ROW {0}", i
            ))));
          }
          document.Add(table);
        }
      }
      public bool IsReusable { get { return false; } }
    
    // custom class to implement a cell background image
      class TestCellEvent : IPdfPCellEvent {
        public Image CellImage;
        public void CellLayout(
          PdfPCell cell, Rectangle position, PdfContentByte[] canvases
        ) 
        {
          PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
          // scale image to the cell's __full__ height
          CellImage.ScaleAbsoluteHeight(cell.Height);
          // scale image to the cell's __full__ width
          CellImage.ScaleAbsoluteWidth(cell.Width);
          // you must also explcitly set the image position!
          CellImage.SetAbsolutePosition(position.Left, position.Bottom);
          // add the image to the cell
          cb.AddImage(CellImage);
        }
      }
    }
    

    Hopefully the inline comments make sense. Notice that the Image object was instantiated once. If you're reusing the same image doing it this way greatly reduces the file size, versus repeatedly instantiating the Image for each cell, since the image data is only added once to the PDF.

    Good luck.

提交回复
热议问题