当前位置: 首页 > 知识库问答 >
问题:

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

白烨煜
2023-03-14

我正在使用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);

(我已经尝试了 byte[] 的其他提取方法,但这是我发现返回有效数据的唯一方法。这将返回一个非常大的字节[],如下所示:

[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文档的示例。

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

共有1个答案

楚知
2023-03-14

对于那些寻求解决方案的人 - 最终我们最终选择了一条不同的路线。我们从未找到解决此特定问题的方法。

 类似资料:
  • 问题内容: 我需要使用iText从pdf文件中提取文本。 问题是:一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中的列作为结果合并(即同一行中两列的文本) 这是代码: 你能帮我完成这个任务吗? 问题答案: 我是iText文本提取子系统的作者。您需要做的是开发自己的文本提取策略(如果您看一下如何实现的话,就会发现您可以提供可插拔的策略)。 您将如何确定列的开始和停止位置完全取决于您-

  • 问题内容: 我有一个网页,可以用来上传文件。 现在,我需要检查文件类型是否正确(zip,jpg,pdf,…)。 我可以使用请求随附的mimeType,但我不信任用户,并且说我想确保没有人能够上传在.jpg中重命名的.gif文件。 我认为在这种情况下,我应该检查魔术号码。我发现 这是一个Java库,似乎可以实现“从魔术数字中提取模仿类型”的功能。 这是正确的解决方案还是您建议什么? 更新: 我已经找

  • 问题内容: 在Linux桌面(RHEL4)上,我想从大文件(> 1 Gig)中提取一定范围的字节(通常小于1000)。我知道文件的偏移量和块的大小。 我可以编写代码来执行此操作,但是有命令行解决方案吗? 理想情况是: 问题答案: 尝试:

  • 我使用的是iText 5.5.8 for Java。遵循默认的、简单的文本提取过程,即。 我很惊讶地在输出中发现了几个错误,特别是所有字母ds都变成了OS。 PDF示例可在http://www.fpozzi.com/stampastopper/download/文件名为0116_lr.PDF.抱歉,无法共享直接链接。这是一些文本提取的基本代码 在@Blagae和@MKL回答后编辑 在开始摆弄iTe

  • 问题内容: 我有以下字节片,我需要从中提取位并将它们放置在[] int中,因为我打算稍后再获取各个位值。我很难弄清楚该怎么做。 下面是我的代码 我需要的是一点点-> 我试过了 我尝试使用BigEndian将字节片转换为Uint16,然后尝试使用,但由于错误而失败 看到了很多示例,这些示例使用函数来简单地输出数字的位表示形式,但这对我没有用,因为我需要一个int切片来进一步访问位值。 我需要在这里使

  • 问题内容: 我在数据库中有字节数组。 如何从Java中的字节数组中提取文件扩展名(MIME /类型)? 问题答案: 如果这是为了存储上载的文件: 为文件扩展名创建一列 为浏览器发送的mime类型创建一列 如果您没有原始文件,而只有字节,那么您有两种不错的解决方案。 如果能够使用库,请查看使用mime-util检查字节: http://technopaper.blogspot.com/2009/03