GSON/iText:从PDF 1.7字节中提取文本[]



我正在使用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, ...]

当我解析数组时,我遇到了与这个问题相同的问题(除了我的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文档的示例。

任何正确方向的观点都将不胜感激!我花了三天时间试图找到解决方案。

对于那些寻找解决方案的人,我们最终走上了不同的道路。我们从未找到解决这一具体问题的办法。

最新更新