Itextsharp 7-缩放并居中的图像作为水印

Itextsharp 7-缩放并居中的图像作为水印,itext,watermark,itext7,Itext,Watermark,Itext7,几天前我开始使用itextsharp 7,我曾经使用itextsharp 5多年 我无法使用itext7在页面中心添加缩放图像作为水印 我的iText5代码: using (PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream)) { for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) {

几天前我开始使用itextsharp 7,我曾经使用itextsharp 5多年

我无法使用itext7在页面中心添加缩放图像作为水印

我的iText5代码:

using (PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream))
{
    for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
    {
        pdfStamper.FormFlattening = false;

        iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
        PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);

        PdfGState graphicsState = new PdfGState();
        graphicsState.FillOpacity = 0.4F;
        pdfData.SetGState(graphicsState);

        pdfData.BeginText();

        Image imageWM = Image.GetInstance(image_WM_Path);
        float width = pageRectangle.Width;
        float height = pageRectangle.Height;
        //scale image
        imageWM.ScaleToFit(width / 3, height / 3);
        //center image
        imageWM.SetAbsolutePosition(width / 2 - imageWM.ScaledWidth / 2, height / 2 - imageWM.ScaledHeight / 2);

        pdfData.AddImage(imageWM);
        pdfData.EndText();                       
    }
    pdfStamper.Close();
    return memoryStream.ToArray();
}
使用(PdfStamper PdfStamper=新的PdfStamper(pdfReader,memoryStream))
{

对于(int pageIndex=1;pageIndex,我已经将您的示例改编为Java,但这并不重要,因为数学很重要:

public static final String SRC = "src/main/resources/pdfs/hello.pdf";
public static final String DEST = "results/text/watermark.pdf";
public static final String IMG = "src/main/resources/img/mascot.png";

public static void main(String[] args) throws IOException {
    File file = new File(DEST);
    file.getParentFile().mkdirs();
    new Watermark().createPdf(SRC, DEST);
}
public void createPdf(String src, String dest) throws IOException {
    PdfDocument pdfDoc = new PdfDocument(
            new PdfReader(src), new PdfWriter(dest));
    Document document = new Document(pdfDoc);
    PdfCanvas over;
    PdfExtGState gs1 = new PdfExtGState();
    gs1.setFillOpacity(0.5f);
    int n = pdfDoc.getNumberOfPages();
    Rectangle pagesize;
    ImageData img = ImageDataFactory.create(IMG);
    float iW = img.getWidth();
    float iH = img.getHeight();
    float pW, pH, sW, sH, f, x, y;

    for (int i = 1; i <= n; i++)
    {
        PdfPage pdfPage = pdfDoc.getPage(i);
        pagesize = pdfPage.getPageSize();

        pW = pagesize.getWidth();
        pH = pagesize.getHeight();
        f = (pW / iW) * 0.5f;
        sW = iW * f;
        sH = iH * f;
        x = pagesize.getLeft() + (pW / 2) - (sW / 2);
        y = pagesize.getBottom() + (pH / 2) - (sH / 2);

        over = new PdfCanvas(pdfDoc.getPage(i));
        over.saveState();
        over.setExtGState(gs1);
        over.addImage(img, sW, 0, 0, sH, x, y);
        over.restoreState();
    }
    document.close();
    pdfDoc.close();
}
公共静态最终字符串SRC=“SRC/main/resources/pdfs/hello.pdf”; 公共静态最终字符串DEST=“results/text/watermark.pdf”; 公共静态最终字符串IMG=“src/main/resources/IMG/mascot.png”; 公共静态void main(字符串[]args)引发IOException{ 文件文件=新文件(DEST); 文件.getParentFile().mkdirs(); 新建水印().createPdf(SRC,DEST); } public void createPdf(String src,String dest)引发IOException{ PdfDocument pdfDoc=新PdfDocument( 新PdfReader(src)、新PdfWriter(dest)); 文件=新文件(pdfDoc); PdfCanvas结束; PdfExtGState gs1=新的PdfExtGState(); gs1.不透明度(0.5f); int n=pdfDoc.getNumberOfPages(); 矩形页面大小; ImageData img=ImageDataFactory.create(img); float iW=img.getWidth(); float iH=img.getHeight(); 浮子pW、pH、sW、sH、f、x、y;
对于(inti=1;我没有对此进行测试,但是如果将
float w=img.GetWidth();float h=img.GetHeight();
更改为
float w=img.GetWidth()*f;float h=img.GetHeight()*f;
其中
f
是缩放因子?例如,如果要缩放到50%,请使
f
等于
0.5f
。嘿,谢谢你的回复。是的,这可以用于缩放,但图像不再居中。此外,我想实现的是根据文档宽度缩放图像。我的图像是770宽度和582高度。我得到了2000+宽度的文档,其中图像非常小,而其他文档的宽度为500+宽度,其中图像非常大。图像未居中:这是一个简单的数学问题。根据文档宽度进行缩放:这是一个简单的数学问题。是的。但我不知道如何使用itexts7 AddImage()方法。请您详细说明此方法的参数。这是我首先应该问的问题。
a
b
c
d
e
f
0
0
1
是3 x 3转换矩阵中的9个元素。因为我们是在二维中工作的,所以只考虑其中的6个,剩下的3个是
0
0
1
。如果我们不需要旋转,那么
b
c
0
。在这种情况下,
a
x
方向的比例因子,
d
y
方向的比例因子,而
e
是在
x
方向上的翻译,
f
是在
y
方向上的翻译。我记得我16岁时在学校学的(那是32年前).谢谢。我会尽快试一试。再次请原谅,如果我问的问题不好,我今天才能试一试。根据你的解释和提示,它非常有效。非常感谢!
public static final String SRC = "src/main/resources/pdfs/hello.pdf";
public static final String DEST = "results/text/watermark.pdf";
public static final String IMG = "src/main/resources/img/mascot.png";

public static void main(String[] args) throws IOException {
    File file = new File(DEST);
    file.getParentFile().mkdirs();
    new Watermark().createPdf(SRC, DEST);
}
public void createPdf(String src, String dest) throws IOException {
    PdfDocument pdfDoc = new PdfDocument(
            new PdfReader(src), new PdfWriter(dest));
    Document document = new Document(pdfDoc);
    PdfCanvas over;
    PdfExtGState gs1 = new PdfExtGState();
    gs1.setFillOpacity(0.5f);
    int n = pdfDoc.getNumberOfPages();
    Rectangle pagesize;
    ImageData img = ImageDataFactory.create(IMG);
    float iW = img.getWidth();
    float iH = img.getHeight();
    float pW, pH, sW, sH, f, x, y;

    for (int i = 1; i <= n; i++)
    {
        PdfPage pdfPage = pdfDoc.getPage(i);
        pagesize = pdfPage.getPageSize();

        pW = pagesize.getWidth();
        pH = pagesize.getHeight();
        f = (pW / iW) * 0.5f;
        sW = iW * f;
        sH = iH * f;
        x = pagesize.getLeft() + (pW / 2) - (sW / 2);
        y = pagesize.getBottom() + (pH / 2) - (sH / 2);

        over = new PdfCanvas(pdfDoc.getPage(i));
        over.saveState();
        over.setExtGState(gs1);
        over.addImage(img, sW, 0, 0, sH, x, y);
        over.restoreState();
    }
    document.close();
    pdfDoc.close();
}