使用 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 = 10000
和 y = 10000
不适合 595 x 842 的矩形。
请尝试:
img.SetAbsolutePosition(0,0);
当您使用这些坐标时,图像的左下角将与页面的左下角重合。
请查阅 iText 官方文档并搜索 coordinate system。例如参见:
- How should I interpret the coordinates of a rectangle in PDF?
- Where is the origin (x,y) of a PDF page?
- ...
这将帮助您了解如何为 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();
请查看完整示例以了解 cb
和 rect
的含义。
这是一个老问题,但万一有人经历过设置具有特定布局的图像的痛苦。
至少根据我的经验,使用表格设置位置是个好主意。
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 的末尾插入了签名和日期。
希望这对外面的人有用。
我使用 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 = 10000
和 y = 10000
不适合 595 x 842 的矩形。
请尝试:
img.SetAbsolutePosition(0,0);
当您使用这些坐标时,图像的左下角将与页面的左下角重合。
请查阅 iText 官方文档并搜索 coordinate system。例如参见:
- How should I interpret the coordinates of a rectangle in PDF?
- Where is the origin (x,y) of a PDF page?
- ...
这将帮助您了解如何为 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();
请查看完整示例以了解 cb
和 rect
的含义。
这是一个老问题,但万一有人经历过设置具有特定布局的图像的痛苦。 至少根据我的经验,使用表格设置位置是个好主意。
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 的末尾插入了签名和日期。
希望这对外面的人有用。