使用iTextSharp,如何在PDF的特定图层上获取图像的x,y坐标

时间:2015-03-20 18:08:38

标签: c# pdf itextsharp

我正在为不同的客户生成证书文件。我使用不同的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!
            }
        }

问题是不同的证书模板会使徽标的位置不同。

有没有办法可以在徽标图层上获取当前图像的绝对位置,并使用它来设置我添加的新图像的位置?

1 个答案:

答案 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);