在PDFBOX中,我需要使用背景图像渲染多边形或使用我的多边形裁剪图像,如屏幕截图示例所示。
我试图了解PDContentStream.clip()或PDContentStream.shadingfill()的工作原理,但这对我来说还不清楚。
示例:在JavaFX中用多边形裁剪的图像
答案 0 :(得分:1)
此任务不需要PDContentStream.shadingfill()
。
您需要做的只是
只有一个复杂之处:PDFBox PDContentStream.clip()
方法的实现者显然考虑了剪切和描边(或填充)路径的选项,并且在剪切后立即删除了路径定义:
public void clip() throws IOException
{
if (inTextMode)
{
throw new IllegalStateException("Error: clip is not allowed within a text block.");
}
writeOperator("W");
// end path without filling or stroking
writeOperator("n");
}
因此,如果您确实想使用相同的路径定义进行剪切和笔划,则需要绕过PDFBox clip
方法。
所以,您可以像这样
PDDocument doc = new PDDocument();
PDImageXObject pdImage = ...;
int w = pdImage.getWidth();
int h = pdImage.getHeight();
PDPage page = new PDPage();
doc.addPage(page);
PDRectangle cropBox = page.getCropBox();
PDPageContentStream contentStream = new PDPageContentStream(doc, page);
contentStream.setStrokingColor(25, 200, 25);
contentStream.setLineWidth(4);
contentStream.moveTo(cropBox.getLowerLeftX(), cropBox.getLowerLeftY() + h/2);
contentStream.lineTo(cropBox.getLowerLeftX() + w/3, cropBox.getLowerLeftY() + 2*h/3);
contentStream.lineTo(cropBox.getLowerLeftX() + w, cropBox.getLowerLeftY() + h/2);
contentStream.lineTo(cropBox.getLowerLeftX() + w/3, cropBox.getLowerLeftY() + h/3);
contentStream.closePath();
//contentStream.clip();
contentStream.appendRawCommands("W ");
contentStream.stroke();
contentStream.drawImage(pdImage, cropBox.getLowerLeftX(), cropBox.getLowerLeftY(), w, h);
contentStream.close();
doc.save(new File(RESULT_FOLDER, "image-clipped.pdf"));
doc.close();
(AddImage测试testImageAddClipped
)
其中包含我的示例图片的