使用 itextsharp(C#/asp.net) 在 pdf 中设置文本或图像的位置

Set the position of a text or an image in a pdf using itextsharp(C#/asp.net)

我使用 iTextSharp 在 pdf 中添加了图像和一些文本。但是,我想将我的图像和文本定位在 pdf 中的特定位置。我该怎么做?

到目前为止我试过了,

img.SetAbsolutePosition(10000f,10000f);

但它不起作用。 这是我生成 pdf 的完整代码,

 private void generatepdf(byte[] byteImage)
  {


    //byte[] imageBytes = Convert.FromBase64String(base64);

    string text1= "Some Text";
    iTextSharp.text.Image image =   iTextSharp.text.Image.GetInstance(byteImage);
    image.ScalePercent(0.3f * 100);
    string logopath = Server.MapPath("~/images/img1.png");
    iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(logopath);
    img.SetAbsolutePosition(1000f,1000f);
    img.ScaleAbsolute(1500f, 0f);
    img.ScalePercent(0.5f*100);
    Paragraph ShopName = new Paragraph(text1);
    Paragraph id = "Some Text";

    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
    {
        Document document = new Document(PageSize.A4, 188f, 88f, 5f, 10f);
        PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
        document.Open();
        document.Add(img);
        document.Add(ShopName);
        document.Add(image);
        document.Add(id);
        document.Close();
        byte[] bytes = memoryStream.ToArray();
        memoryStream.Close();

        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment; filename=QRCode.pdf");
        Response.ContentType = "application/pdf";
        Response.Buffer = true;
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.BinaryWrite(bytes);
        Response.End();
    }

 }

如果您尝试过 img.SetAbsolutePosition(10000f,10000f);,那么您的图片超出了 PDF 的可见区域。您正在这样创建 Document

Document document = new Document(PageSize.A4, 188f, 88f, 5f, 10f);

这意味着页面大小为 595 x 842 用户单位。使用 x = 10000y = 10000 不适合 595 x 842 的矩形。

请尝试:

img.SetAbsolutePosition(0,0);

当您使用这些坐标时,图像的左下角将与页面的左下角重合。

请查阅 iText 官方文档并搜索 coordinate system。例如参见:

这将帮助您了解如何为 SetAbsolutePosition() 方法定义坐标。

更新:

您还询问有关在绝对位置添加文本的问题。在这里,我们必须区分单行文本和文本块。另请参阅官方网站上的 Absolute positioning of text 部分。

一行文字:

例如参见 [​​=27=],您会找到 showTextAligned() 方法:

ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
    new Phrase("Some text"), 100, 100, 0);

请务必阅读其他示例,以便了解 canvas 对象的含义。

一段文字:

看看How to add text inside a rectangle?

ColumnText ct = new ColumnText(cb);
ct.SetSimpleColumn(rect);
ct.AddElement(new Paragraph("This is the text added in the rectangle"));
ct.Go();

请查看完整示例以了解 cbrect 的含义。

这是一个老问题,但万一有人经历过设置具有特定布局的图像的痛苦。 至少根据我的经验,使用表格设置位置是个好主意。

 PdfPTable tableSignature = new PdfPTable(4);
        tableSignature.DefaultCell.Border = 0;
        tableSignature.DefaultCell.BorderColor = Color.WHITE;
        tableSignature.WidthPercentage = 90;

        var encodedImage = signatureString.Split(',')[1];

        var bytesSignature = Convert.FromBase64String(encodedImage);
        iTextSharp.text.Image imageSignature = iTextSharp.text.Image.GetInstance(bytesSignature);
        imageSignature.BorderColor = iTextSharp.text.Color.BLACK;
        // this size seems right but, we need to check in more samples.
        imageSignature.ScaleToFit(120, 60);

        imageSignature.Alignment = iTextSharp.text.Image.ALIGN_BOTTOM;

        PdfPCell cellSignature = new PdfPCell(imageSignature);
        cellSignature.HorizontalAlignment = PdfPCell.ALIGN_TOP;
        cellSignature.BorderColor = iTextSharp.text.Color.WHITE;
        tableSignature.AddCell(cellSignature);
        tableSignature.AddCell("       ");
        tableSignature.AddCell("       ");

        PdfPCell cellDateSignatureText = new PdfPCell(new Phrase(dateFilledInDocument));

        ((Chunk)(cellDateSignatureText.Phrase[0])).Font = new iTextSharp.text.Font(((Chunk)(cellDateSignatureText.Phrase[0])).Font.Family, 12f);
        cellDateSignatureText.BorderColor = iTextSharp.text.Color.WHITE;
        cellDateSignatureText.HorizontalAlignment = PdfPCell.ALIGN_BOTTOM;
        cellDateSignatureText.VerticalAlignment = PdfCell.ALIGN_BOTTOM;
        cellDateSignatureText.BorderWidthBottom = 1;
        cellDateSignatureText.BorderColorBottom = Color.BLACK;
        tableSignature.AddCell(cellDateSignatureText);

        PdfPCell signatureCellText = new PdfPCell(new Phrase("Signature"));

        ((Chunk)(signatureCellText .Phrase[0])).Font = new iTextSharp.text.Font(((Chunk)(signatureCellText .Phrase[0])).Font.Family, 12f);
        signatureCellText .BorderColor = iTextSharp.text.Color.WHITE;
        signatureCellText .HorizontalAlignment = PdfPCell.ALIGN_BOTTOM;

        tableSignature.AddCell(signatureCellText);
        tableSignature.AddCell("       ");
        tableSignature.AddCell("       ");

        tableSignature.AddCell("Date");

        document.Add(tableSignature);

例如,在上面的代码中,我们在 pdf 的末尾插入了签名和日期。

希望这对外面的人有用。