首页 文章

用于pdf的spring batch itemWriter

提问于
浏览
0

是否有任何方法使用spring批处理ItemWriter将数据写入PDF文件 . 我看到了很多关于.txt,.xml等的例子 . 对于pdf writer我没有 . 使用批量 spring 启动 . 提前致谢 .

2 回答

  • 1

    生成PDF文档没有开箱即用的 ItemWriter . 但是,实现自己的应该可以直接使用各种开源库 .

  • 0

    您不需要ItemWriter将数据写入PDF . 你可以做的是在作者和读者之间使用处理器 . 现有的API库可以将DB,XML或JSON转换为PDF . 这是Tutorials Point的一个例子,我在程序中成功地读取了XML到DB,同时创建了一个PDF文件 .

    import java.io.File;
    import java.io.IOException;
    
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.PDPage;
    import org.apache.pdfbox.pdmodel.PDPageContentStream;
    import org.apache.pdfbox.pdmodel.font.PDType1Font;
    import org.springframework.batch.item.ItemProcessor;
    
    public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {
    
    public static void drawTable(PDPage page, PDPageContentStream contentStream, float y, float margin,
            String[][] content) throws IOException {
        final int rows = content.length;
        final int cols = content[0].length;
        final float rowHeight = 50;
        final float tableWidth = page.getMediaBox().getWidth() - (2 * margin);
        final float tableHeight = rowHeight * rows;
        final float colWidth = tableWidth / (float) cols;
        final float cellMargin = 5f;
    
        // draw the rows
        float nexty = y;
        for (int i = 0; i <= rows; i++) {
            contentStream.drawLine(margin, nexty, margin + tableWidth, nexty);
            nexty -= rowHeight;
        }
    
        // draw the columns
        float nextx = margin;
        for (int i = 0; i <= cols; i++) {
            contentStream.drawLine(nextx, y, nextx, y - tableHeight);
            nextx += colWidth;
        }
    
        // now add the text
        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
    
        float textx = margin + cellMargin;
        float texty = y - 15;
        for (int i = 0; i < content.length; i++) {
            for (int j = 0; j < content[i].length; j++) {
                String text = content[i][j];
                contentStream.beginText();
                contentStream.moveTextPositionByAmount(textx, texty);
                contentStream.drawString(text);
                contentStream.endText();
                textx += colWidth;
            }
    
            texty -= rowHeight;
            textx = margin + cellMargin;
        }
    }
    
    @Override
    public Tutorial process(Tutorial item) throws Exception {
        System.out.println("Processing..." + item);
    
        // Creating PDF document object
        File f = new File("/Users/zhenxu/Desktop/test.pdf");
        PDDocument doc = PDDocument.load(f);
    
        // Creating a blank page
        PDPage page = new PDPage();
        doc.addPage(page);
        PDPageContentStream contentStream = new PDPageContentStream(doc, page);
    
        String[][] content = { { "Id", "" + item.getTutorial_id() }, { "Title", item.getTutorial_title() },
                { "Authour", item.getTutorial_author() }, { "Submission Date", item.getSubmission_date() } };
        drawTable(page, contentStream, 700, 100, content);
    
        contentStream.close();
        doc.save("/Users/zhenxu/Desktop/test.pdf");
        System.out.println("Hello");
        return item;
    }
    

    这里输入 item 是输入XML . 作业配置如下:

    <!-- Defining a job--> 
    <batch:job id = "helloWorldJob">  
        <!-- Defining a Step --> 
        <batch:step id = "step1"> 
            <batch:tasklet>
                <!-- try use PDF converter -->
                <batch:chunk reader="xmlItemReader" writer="mySqlItemWriter" processor="itemProcessor" commit-interval="10"></batch:chunk>                
            </batch:tasklet>    
        </batch:step>  
    </batch:job>
    

    您可以自定义您的读者和作者以及其他类型的工作 .

相关问题