如何使用iText将图形绘制为PDF?

jim*_*ang 4 java pdf-generation spring-mvc itext graphics2d

我试图完成一个绘制图形并将其写入PDF的示例,但我不断收到PDF没有页面的错误.如果我在打开后用document.add()添加一些简单的东西就可以正常工作,我只是看不到图形.这是我的代码:

Document document = new Document();
PdfWriter writer = new PdfWriter();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
    " attachment; filename=\"Design.pdf\"");

writer = PdfWriter.getInstance(document, response.getOutputStream());

document.open();    
PdfContentByte cb = writer.getDirectContent();
Graphics2D graphics2D = cb.createGraphics(36, 54);
graphics2D.drawString("Hello World", 36, 54);
graphics2D.dispose();   
document.close();
Run Code Online (Sandbox Code Playgroud)

我是否必须执行其他操作才能将图形添加到文档中,或者我的语法不正确?

Ral*_*lph 6

我不是IText的专家,但上周我试图用它绘制一些圆圈.所以这是我在测试中注意到的:

如果你绘制图形,你必须(或者说我必须在尝试它时)将图形命令"包装"在一个开始saveState()和结束的部分restoreState(),以及我需要调用的部分fillStroke()- 如果我不调用fillStroke()则没有什么是画.

private void circle(float x, float y, PdfWriter writer) {
    PdfContentByte canvas = writer.getDirectContent();

    canvas.saveState();
    canvas.setColorStroke(GrayColor.BLACK);
    canvas.setColorFill(GrayColor.BLACK);
    canvas.circle(x, y, 2);
    canvas.fillStroke();

    canvas.restoreState();
}

@Test
public void testPossition() throws DocumentException, IOException {
    OutputStream outputStream = FileUtil.openOutputStream("testPosition.pdf");
    //this is my personal file util, but it does not anything more
    //then creating a file and opening the file stream.

    Document document = new Document(PageSize.A4, 50, 50, 50, 50);
    PdfWriter writer = PdfWriter.getInstance(document, outputStream);
    document.open();

    markPosition(100, 100, writer);
    document.add(new Paragraph("Total: 595 x 842 -- 72pt (1 inch)"));

    document.close();
    outputStream.flush();
    outputStream.close();
}

private void markPosition(float x, float y, PdfWriter writer)
        throws DocumentException, IOException {
    placeChunck("x: " + x + " y: " + y, x, y, writer);
    circle(x, y, writer);
}

 private void placeChunck(String text, float x, float y, PdfWriter writer)
       throws DocumentException, IOException {
    PdfContentByte canvas = writer.getDirectContent();
    BaseFont font = BaseFont.createFont(BaseFont.HELVETICA,
                  BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    canvas.saveState();
    canvas.beginText();
    canvas.moveText(x, y);
    canvas.setFontAndSize(font, 9);
    canvas.showText(text);
    canvas.endText();
    canvas.restoreState();
}
Run Code Online (Sandbox Code Playgroud)

但是PdfContentByte(画布)有更多的功能,例如rectangle.