我正在查询一个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,但是这并没有加快这个步骤。
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。如有任何建议,将不胜感激。
发布于 2019-07-17 10:28:21
你在评论中说
另外,在使用一个没有设置任何字段的测试用例(大约有35个字段)运行它之后,我添加到文档中的惟一内容是字段名,它仍然需要20秒才能将所有字段写入文档。
为了测试这一点,我使用了以下代码(基本上是您的代码,您的字段值是及时生成的,字段计数是一个常量):
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__)
产出:
Created MakePdfLikeEvanV.pdf with 35 fields in 3.221226 seconds.而且你说过
我尝试收集所有的HTML字符串,并将它们放在一个大字符串中读取,以防问题是我创建了几个XMLWorkerHelper实例来编写由HTML字符串生成的InputStream,但是这并没有加快这个步骤。
我对此进行了如下测试:
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__)
产出:
Created MakePdfLikeEvanVSingleWorkerCall.pdf with 10000 fields in 1.610613 seconds.因此,我不能重复这个问题。
如果您碰巧在一台慢计算机上运行代码,则可能可以解释第一种情况下的差异(每个字段分别使用不同的工作人员)。但在第二种情况下(所有字段的单一工作人员),您的“不加速”的观察完全偏离了我的观察,在这种情况下,我必须大幅增加“字段”的数量,才能使运行时间超过一秒钟。
因此,有一个你没有提到的因素,那就是休息。
tc.getFieldValues()检索到的web服务请求实际上是针对每个values.size()和values.get(i)执行的。fv.getValue()正在执行这样的web服务请求?https://stackoverflow.com/questions/57043863
复制相似问题