首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring batch itemWriter for pdf

spring batch itemWriter for pdf
EN

Stack Overflow用户
提问于 2018-04-02 17:14:35
回答 2查看 1.9K关注 0票数 0

有没有什么方法可以使用spring batch ItemWriter将数据写入PDF文件。我看过很多.txt,.xml等的例子,没有一个是给pdf writer的。使用spring boot和batch。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-04-04 02:24:58

没有用于生成PDF文档的开箱即用ItemWriter。但是,使用各种开源库实现自己的库应该很简单。

票数 2
EN

Stack Overflow用户

发布于 2018-07-24 01:34:22

你不需要一个ItemWriter来写数据到PDF。你能做的就是在写入器和读取器之间使用一个处理器。现有的API库可用于将DB、XML或JSON转换为PDF。下面是一个来自Tutorials Point的示例,我发现它在我的程序中成功地将XML读取到DB,同时创建了一个PDF文件。

代码语言:javascript
复制
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。作业配置如下:

代码语言:javascript
复制
    <!-- 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> 

你也可以定制你的阅读器和写入器来做其他类型的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49608459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档