使用PDFBOX剪切图像

时间:2018-06-22 12:31:24

标签: pdfbox

在PDFBOX中,我需要使用背景图像渲染多边形或使用我的多边形裁剪图像,如屏幕截图示例所示。

我试图了解PDContentStream.clip()或PDContentStream.shadingfill()的工作原理,但这对我来说还不清楚。

示例:在JavaFX中用多边形裁剪的图像

exemple : image clipped with polygon in JavaFX

1 个答案:

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

其中包含我的示例图片的

Screen shot