pdf生成器Itext和JAX-RS

时间:2015-06-01 12:44:54

标签: itext jax-ws

我想知道如何创建使用Itext生成pdf的类,并使用JAX-RS@GET注释使用@Produces将其发送到网络浏览器

2 个答案:

答案 0 :(得分:0)

以下是我的解决方案,简化为适合此处。我在generate方法中使用JDK 8 lambdas,如果你不能,只需返回一个实现StreamOutput的匿名内部类。

@Path("pdf")
@Produces(ContractResource.APPLICATION_PDF)
public class PdfResource {

    public static final String APPLICATION_PDF = "application/pdf";

    @GET
    @Path("generate")
    public StreamingOutput generate() {
        return output -> {
            try {
                generate(output);
            } catch (DocumentException e) {
                throw new IOException("error generating PDF", e);
            }
        };
    }

    private void generate(OutputStream outputStream) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter.getInstance(document, outputStream);
        document.open();
        document.add(new Paragraph("Test"));
        document.close();
    }
}

答案 1 :(得分:0)

使用JAX-RS和IText 5 Legacy,无需在服务器端存储文件即可在浏览器上提供PDF文件的模拟解决方案。

@Path("download/pdf")
public class MockPdfService{

@GET
@Path("/mockFile")
public Response downloadMockFile() {
    try {
        // mock document creation
        com.itextpdf.text.Document document = new Document();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        com.itextpdf.text.pdf.PdfWriter.getInstance(document, byteArrayOutputStream);
        document.open();
        document.add(new Chunk("Sample text"));
        document.close();

        // mock response
        return Response.ok(byteArrayOutputStream.toByteArray(), MediaType.APPLICATION_OCTET_STREAM)
                .header("content-disposition", "attachment; filename = mockFile.pdf")
                .build();
    } catch (DocumentException ignored) {
        return Response.serverError().build();
    }
}

}