首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种有效的方法可以用Java将几个HTML字符串写入PDF文档?

有没有一种有效的方法可以用Java将几个HTML字符串写入PDF文档?
EN

Stack Overflow用户
提问于 2019-07-15 16:31:16
回答 1查看 93关注 0票数 0

我正在查询一个API页面,以创建该页面上的信息的PDF。API页面首先被解析为"TestCase“对象。TestCase对象中的许多字段值都是HTML。有没有一种高效的方法将这些HTML字符串写入新的PDF文档?

我目前正在使用iTextPDF及其XMLWorkerHelper来解析HTML并将它们写入PDF文档。我遇到的问题是,由于有太多的字段需要作为单个HTML字符串来编写,所以对每个PDF文档执行这个步骤大约需要5-6秒,但是程序的其余部分只需3或4个。更糟糕的是,当我将其maven项目导出为jar时,makePDF步骤对每个TestCase对象花费20秒时间。这个步骤比任何其他步骤都慢(包括从API中查询值并将值读取到TestCase对象中)。我尝试收集所有的HTML字符串,并将它们放在一个大字符串中读取,以防问题是我创建了几个XMLWorkerHelper实例来编写由HTML字符串生成的InputStream,但是这并没有加快这个步骤。

代码语言:javascript
复制
public void makePDF(TestCase tc) throws IOException, DocumentException {
        OutputStream file = new FileOutputStream(filename);
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, file);
        document.open();
        List<FieldValue> values = tc.getFieldValues();
        for (int i = 0; i < values.size(); ++i) {
            FieldValue fv = values.get(i);
            InputStream is = new ByteArrayInputStream(fv.getValue());
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
            document.add(new Paragraph("\n"));
        }
        document.close();
}

我仍然需要HTML字符串正确地打印到PDF文档,但我想让它花更少的时间,如果可能的话。在很多情况下,我会在这个函数中输入20或30个TestCase对象(在某些情况下,每次多达500个),因此使这个过程运行所需的时间更少是非常重要的,因为使用该工具的人不希望仅仅等待6或7分钟来创建几个PDF。如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-17 10:28:21

你在评论中说

另外,在使用一个没有设置任何字段的测试用例(大约有35个字段)运行它之后,我添加到文档中的惟一内容是字段名,它仍然需要20秒才能将所有字段写入文档。

为了测试这一点,我使用了以下代码(基本上是您的代码,您的字段值是及时生成的,字段计数是一个常量):

代码语言:javascript
复制
int fieldCount = 35;
long start = System.nanoTime();

OutputStream file = new FileOutputStream(filename);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, file);
document.open();
for (int i = 0; i < fieldCount; ++i) {
    InputStream is = new ByteArrayInputStream(("<p>" + "Value " + i + "</p>").getBytes());
    XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
    document.add(new Paragraph("\n"));
}
document.close();

long end = System.nanoTime();
System.out.printf("Created %s with %d fields in %f seconds.\n", filename.getName(), fieldCount, ((float)end - (float)start) / 1000000000f);

(https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/xmlworker/TimingXmlWorker.java#L44 test testMakePdfLikeEvanV__)

产出:

代码语言:javascript
复制
Created MakePdfLikeEvanV.pdf with 35 fields in 3.221226 seconds.

而且你说过

我尝试收集所有的HTML字符串,并将它们放在一个大字符串中读取,以防问题是我创建了几个XMLWorkerHelper实例来编写由HTML字符串生成的InputStream,但是这并没有加快这个步骤。

我对此进行了如下测试:

代码语言:javascript
复制
int fieldCount = 10000;
long start = System.nanoTime();

OutputStream file = new FileOutputStream(filename);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, file);
document.open();
StringBuilder xmlString = new StringBuilder();
for (int i = 0; i < fieldCount; ++i) {
    xmlString.append("<p>")
             .append(("Value " + i))
             .append("</p>");
}
InputStream is = new ByteArrayInputStream(xmlString.toString().getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
document.close();

long end = System.nanoTime();
System.out.printf("Created %s with %d fields in %f seconds.\n", filename.getName(), fieldCount, ((float)end - (float)start) / 1000000000f);

(https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/xmlworker/TimingXmlWorker.java#L85 test testMakePdfLikeEvanVSingleWorkerCall__)

产出:

代码语言:javascript
复制
Created MakePdfLikeEvanVSingleWorkerCall.pdf with 10000 fields in 1.610613 seconds.

因此,我不能重复这个问题。

如果您碰巧在一台慢计算机上运行代码,则可能可以解释第一种情况下的差异(每个字段分别使用不同的工作人员)。但在第二种情况下(所有字段的单一工作人员),您的“不加速”的观察完全偏离了我的观察,在这种情况下,我必须大幅增加“字段”的数量,才能使运行时间超过一秒钟。

因此,有一个你没有提到的因素,那就是休息。

  • 您是否可能存储在网络文件系统中,并且需要额外的时间来检查和传输权限?
  • 或者您通过tc.getFieldValues()检索到的web服务请求实际上是针对每个values.size()values.get(i)执行的。
  • 或者fv.getValue()正在执行这样的web服务请求?
  • 或者..。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57043863

复制
相关文章

相似问题

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