加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java将XML文档渲染为PDF

发布时间:2020-12-15 08:49:40 所属栏目:Java 来源:网络整理
导读:我有一个 XML文档,当前存储为内存中的字符串想要将其渲染为PDF.换句话说,PDF内容将是XML文档.该方法呈现的XML是通用的 – 可能会发送多种类型的XML文档. 我在使用各种基于Java的框架时如何完成使用时遇到了一些困难. Apache FOP 看起来这个框架似乎需要将文
我有一个 XML文档,当前存储为内存中的字符串&想要将其渲染为PDF.换句话说,PDF内容将是XML文档.该方法呈现的XML是通用的 – 可能会发送多种类型的XML文档.

我在使用各种基于Java的框架时如何完成使用时遇到了一些困难.

Apache FOP

看起来这个框架似乎需要将文档中的XML元素特定转换为FOP实体.由于问题中的方法必须接受通用XML,我认为这个框架不符合我的要求.

iText的

我尝试使用iText / Flying Saucer(org.xhtmlrenderer)的组合渲染文档,虽然它确实渲染PDF,但内容只包含空格分隔的数据值,没有xml元素或属性.使用代码&测试数据如下:

文件

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <elem1>value1</elem1>
  <elem2>value2</elem2>
</root>

File inputFile = new File(PdfGenerator.class.getResource("test.xml").getFile());
OutputStream os = new FileOutputStream("c:tempSample.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(inputFile);
renderer.layout();
renderer.createPDF(os);
os.close();

包含内容值value1 value2但没有标记的PDF中的结果.

我的问题是
有人可以提供一个代码片段,用于使用上述框架中的一个框架来重新发送包含XML内容的PDF,还是有另一个框架更适合我的需求?

编辑:
我意识到同样的问题被问到了here,但似乎所提出的解决方案需要对css文件中传入的XML文档的结构有深入的了解.

解决方法

这是使用itext的解决方案.您的html内容在请求中.并且itext不是免费的.查看它的许可要求,因为它近年来发生了变化,尽管它并不昂贵.

public class MyPDFGeneratorService {

    public byte[] generatePdf(final XhtmlPDFGenerationRequest request) {
        try {

            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(this.getDocument(request.getContent()),null);
            renderer.layout();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            renderer.createPDF(baos);
            return this.toByteArray(baos);

        }
        catch (Exception e) {
            throw new PDFGenerationException(
                    "Unable to generate  PDF.",e);
        }
    }

    private Document getDocument(final String content) {
        InputSource is = new InputSource(new BufferedReader(new StringReader(
                content)));
        return XMLResource.load(is).getDocument();
    }


    private byte[] toByteArray(final ByteArrayOutputStream baos)
        throws IOException {
    byte[] bytes = baos.toByteArray();
    baos.close();
    return bytes;

 }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读