我正在为不同的客户生成证书文件。我使用不同的pdf文档作为模板,并填写客户端的相关信息。
我还添加了一个特定于客户端的徽标。我目前删除了一个仅包含模板pdf中的徽标的图层,并添加了新徽标。
//Apply Logos
if (_CertificateLogo != "" || _ExpiryDate.HasValue)
{
foreach (string key in layers.Keys.ToList())
{
if (key.ToLower().Equals("logo") && _CertificateLogo != "")
{
PdfLayer logoLayer = (PdfLayer)layers[key];
logoLayer.On = false;
logoLayer.OnPanel = false;
logoLayer.View = false;
}
else if (key.ToLower().Equals("expiry") && !(_ExpiryDate.HasValue))
{
PdfLayer expirylayer = (PdfLayer)layers[key];
expirylayer.On = false;
expirylayer.OnPanel = false;
expirylayer.View = false;
}
}
try
{
string certLogoPath = HttpContext.Current.Server.MapPath("\\Player\\" + _CertificateLogo);
Image imgCertLogo = Image.GetInstance(File.ReadAllBytes(certLogoPath));
Rectangle pageSize = reader.GetPageSizeWithRotation(1);
PdfSize = pageSize;
imgCertLogo.SetAbsolutePosition(
(imgCertLogo.ScaledWidth / 2) + 10,
pageSize.Height - 60 - imgCertLogo.ScaledHeight
);
pdfContentByte.AddImage(imgCertLogo, true);
}
catch
{
//No branded certificate for you!
}
}
问题是不同的证书模板会使徽标的位置不同。
有没有办法可以在徽标图层上获取当前图像的绝对位置,并使用它来设置我添加的新图像的位置?
答案 0 :(得分:0)
立即想到的唯一解决方案是你应该提取图像,检测哪一个是徽标(如果你是添加徽标的那个,你应该用ID标记它)并提取图像。
SpecialId示例说明了如何添加ID。
此处解释了提取图像:Extract Images from PDF coordinates using iText
特殊ID将出现在图像字典中,您可以这样:
PdfDictionary imageDictionary = image.getDictionary();
您可以像这样获取图像的位置和尺寸:
Matrix matrix = renderInfo.getImageCTM();
float x = matrix.get(Matrix.I31);
float y = matrix.get(Matrix.I32);
float w = matrix.get(Matrix.I11);
float h = matrix.get(Matrix.I22);