【发布时间】:2020-09-24 14:30:32
【问题描述】:
我正在使用 Rest-Assured 和 GSON 自动化测试 - 并且需要验证在 POST 请求的响应中返回的 PDF 文件的内容。文件的内容各不相同,可以包含从文本到文本和表格,或文本和表格和图形的任何内容。就字形内容而言,每个页面都可以并且很可能会有所不同。我只关心 pdf 页面上的所有文本——无论是纯文本,还是表格内的文本,或者与图像相关联(或位于图像内部)的文本。由于请求返回的所有pdf都不同,我无法定义搜索区域(据我所知)。我只需要提取页面上的所有文本。
我将 pdf 数据提取到一个字节数组中,如下所示:
Gson pdfGson = new Gson();
byte[] pdfBytes =
pdfGson.fromJson(this.response.as(JsonObject.class)
.get("pdfData").getAsJsonObject().get("data").getAsJsonArray(), byte[].class);
(我尝试了其他字节[]的提取方法,但这是我发现返回有效数据的唯一方法。)这会返回一个非常大的字节[],如下所示:
[37, 91, 22, 45, 23, ...]
当我解析数组时,我遇到了与 This Question 相同的问题(除了我的 pdf 为 1.7),我尝试实现已接受的答案,并根据我的目的进行了调整,并在 iText 的文档中进行了解释:
byte[] decodedPdfBytes = PdfReader.decodeBytes(pdfBytes, new PdfDictionary(), FilterHandlers.getDefaultFilterHandlers());
IRandomAccessSource source = new RandomAccessSourceFactory().createSource(decodedPdfBytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ReaderProperties readerProperties = new ReaderProperties();
// Ineffective:
readerProperties.setPassword(user.password.getBytes());
PdfReader pdfReader = new PdfReader(source, readerProperties);
// Ineffective:
pdfReader.setUnethicalReading(true);
PdfDocument pdfDoc = new PdfDocument(pdfReader, new PdfWriter(baos));
for(int i = 1; i < pdfDoc.getNumberOfPages(); i++) {
String text = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i));
System.out.println(text);
}
这确实解码了 pdf 页面,并返回文本,但它只是标题文本。不返回其他文本。
对于它的价值,在前端,当用户单击按钮生成 pdf 时,它返回一个包含下载数据的 blob,所以我比较确定元数据是 GSA 编码的,但我不确定这是否重要。由于敏感材料,我无法分享 pdf 文档的示例。
我们将不胜感激任何正确方向的观点!我花了 3 天时间试图找到解决方案。
【问题讨论】:
-
“这确实解码了 pdf 页面,并返回文本,但它只是标题文本。没有其他文本返回。” - 因此,这显然不是关于如何检索文件的问题(因为它显然是一个有效的 PDF,否则你不会到目前为止);相反,它很可能是 PDF 本身的问题。要么仅将标题文本绘制为文本(其他所有内容,如果有,则绘制为位图或矢量图形,但不绘制为文本),或者使用不提供文本提取所需信息的字体绘制正文文本。如需更多信息,请分享相关 PDF。
-
感谢您的跟进@mkl - 我不知道如何处理这个问题,因为共享 pdf 实际上会违反保密协议并且可能违反一些隐私法......我可以发布一个所有内容都变黑的屏幕截图,但我不确定这会有多大帮助。
-
不幸的是,屏幕截图无法提供所需的信息。您是否碰巧与 iText Software 签订了支持合同?支持团队以最高机密性处理所有文档,它们会在问题关闭 30 天后自动删除,如果您愿意,您甚至可以与 iText Software 签订明确的保密协议,即使保密已经是其中的一部分标准支持条款。
-
感谢@AmedeeVanGasse 的建议!我得调查一下。我试图创建一个通用的 pdf 版本来分享,但不幸的是,编辑后什么都没有了。感谢您的帮助。
标签: java parsing pdf gson itext