You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用iText 7实现带文本图片的向前透视倾斜效果

解决方案

AffineTransform本质是仿射变换,仅支持平移、缩放、旋转、剪切操作,无法实现完全真实的透视变形(真实透视属于投影变换,会破坏原有平行线的平行关系),但可以通过组合剪切参数实现你示例中近似的向前倾斜效果。如果需要更高还原度的透视效果,建议直接使用iText7内置的PerspectiveTransform类实现。

方案1:使用AffineTransform实现近似倾斜效果

你可以参考如下参数配置,数值可根据实际需要的倾斜幅度微调:

import com.itextpdf.kernel.geom.AffineTransform;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.canvas.PdfCanvas;
import java.io.FileNotFoundException;

public class Perspective {
    public static final String DEST = "./results/perspective.pdf";

    public static void main(String[] args) throws FileNotFoundException {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
        PdfPage page = pdfDoc.addNewPage();
        PdfCanvas canvas = new PdfCanvas(page);
        
        // 构造参数说明(按顺序):水平缩放比例、水平剪切系数、垂直剪切系数、垂直缩放比例、水平平移值、垂直平移值
        AffineTransform transformContent = new AffineTransform(
            1,      // 水平缩放保持原始比例
            0.18,   // 水平剪切系数,正数向右倾斜,数值越大倾斜幅度越高
            -0.18,  // 垂直剪切系数,配合水平剪切实现下宽上窄的梯形效果
            1,      // 垂直缩放保持原始比例
            40,     // 水平平移,避免变形后内容超出页面边界
            80      // 垂直平移,避免变形后内容超出页面边界
        );
        canvas.concatMatrix(transformContent);
        
        // 此处添加你绘制文本、图片的逻辑
        
        pdfDoc.close();
    }
}

方案2:使用PerspectiveTransform实现真实透视效果

如果需要和示例完全一致的透视倾斜,建议直接使用透视变换类,配置更直观:

import com.itextpdf.kernel.geom.PerspectiveTransform;
// 其余导入同上

public class Perspective {
    public static final String DEST = "./results/perspective.pdf";

    public static void main(String[] args) throws FileNotFoundException {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
        PdfPage page = pdfDoc.addNewPage();
        PdfCanvas canvas = new PdfCanvas(page);
        
        // 参数依次为:原始内容四个顶点坐标(左上、右上、右下、左下)、目标效果四个顶点坐标(左上、右上、右下、左下)
        PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral(
            0, 800, 
            600, 800,
            600, 200,
            0, 200,
            120, 760, // 变换后左上点
            480, 760, // 变换后右上点,保持和左上同高度实现上边水平
            600, 200, // 变换后右下点
            0, 200 // 变换后左下点
        );
        canvas.concatMatrix(transform.getTransformMatrix());
        
        // 此处添加你绘制文本、图片的逻辑
        
        pdfDoc.close();
    }
}

注意事项

  • 以上所有坐标、变换参数均为示例值,你可以根据自己的页面尺寸、倾斜幅度需求自行调整
  • 变换后需要适当调整平移参数,避免内容超出PDF页面可视区域

内容的提问来源于stack exchange,提问作者cixikoy607

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:24:03