如何使用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
相关产品推荐
相关产品推荐

