【问题标题】:Creating unit tests for generated PDFs using iText使用 iText 为生成的 PDF 创建单元测试
【发布时间】:2014-06-18 20:19:44
【问题描述】:

我们使用 iText 读取输入 PDF,然后添加消息并保存输出。

PdfReader reader = new PdfReader(inputFilepath);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFilename, true));
PdfContentByte over = stamper.getOverContent(1);
over.beginText();
over.showTextAligned(align, text, x, y, angle);
...
over.endText();
stamper.close();

有没有办法读取在单元测试中生成的 PDF,然后检查提供的文本是否存在于正确的 x、y 坐标处?

【问题讨论】:

  • 您可以使用任何允许您在单元测试中使用位置进行文本提取的 PDF 库。 iText 本身有一个文本提取框架,可以很容易地适应不仅返回文本而且返回它的位置。如果您不想使用与最初创建结果相同的库来测试结果,其他库也可以。
  • 谢谢 - 我愚蠢地搜索“使用 iText 进行单元测试”而不是“从 PDF 中提取文本”现在找到了很多答案。感谢您的帮助。

标签: java unit-testing pdf pdf-generation itext


【解决方案1】:

一般来说,don't test the platform(或者,在这种情况下,是您正在使用的第三方库。)相反,请测试您与它的交互是否正确。

在这种情况下,这意味着假设 showTextAligned() 会做正确的事情,前提是传入正确的坐标。然后我将专注于测试。

这可能意味着我需要将与 PDF 类的所有交互隐藏在接口后面,并且我会将该接口的模拟传递给计算代码,使用它来验证正确的值是为给定的样本输入传递。

【讨论】:

    【解决方案2】:

    作为一种快捷方式,您可以使用 PdfReader.getPageContent(int pageNumber) 测试特定页面中 PDF 中文本的顺序。

    这并不理想,但它可能是一个穷人的定位测试,假设您从左到右和从上到下打印文本。

    【讨论】:

    • 所有添加的文本都使用 X,Y 坐标,我不能保证它的打印顺序。我最终使用com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy 将所有添加的文本拉出,然后测试我添加的每个字符串是否存在。不理想,但至少测试所有消息都存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多