【问题标题】:pdf reading via pdfbox in java在java中通过pdfbox读取pdf
【发布时间】:2023-03-04 09:13:01
【问题描述】:

我在使用 pdfbox 阅读 pdf 时遇到问题。我的实际 pdf 部分不可读,因此当我将不可读的部分复制并粘贴到编辑器中时,它会显示小框符号,但是当我尝试通过 pdfbox 读取同一个文件时,不会读取这些字符(而且我不希望它们待读)。我期望的是我至少得到一些符号或一些随机字符而不是实际字符。有没有办法做到这一点。该行已被选中,因此它不是图像。有没有人找到任何解决方法?

有一个 pdfbox 示例,我们在 pdfTextStripper 类下重写 writeString 方法以获取一些额外的字体属性。我正在使用该方法来获取我的文本和一些字体属性。 所以我的问题是为什么 pdfbox 不能读取每个字符(它可能会打印乱码)。但就我而言,我数了数。该方法被调用的次数(每个方法调用对应于每个字符)并看到没有。 of 方法调用确实与输出文本中的字符数匹配,但与总数不匹配。 pdf中的字符数。这是一个示例 pdf,“Profit”这个词是不可读的,pdf 甚至不会显示这个词的乱码,它只是完全跳过它。 这是链接。 https://drive.google.com/file/d/0B_Ke2amBgdpedUNwVTR3RVlRTFE/view?usp=sharing

【问题讨论】:

  • A 分享关键代码(或者如果您使用的是 PDFBox 示例,请为其命名),B 将示例 PDF 分享到允许重现问题。
  • 有一个 pdfbox 示例,我们重写 writestring 方法以获取一些额外的字体属性。
  • @ANKIT 你好.. 你能分享一下你是怎么解决这个问题的吗??我在使用类似的 PDF 时遇到了类似的问题。我在 PDF 阅读部分苦苦挣扎了好几个星期,但无法准确阅读 pdf。我将非常感谢您在这件事上提供的任何帮助。请让我知道您的解决方案或发现。 . 如果您有可以帮助解决此问题的材料,请发送电子邮件至 viru.nalawade@gmail.com ..

标签: java pdf pdfbox


【解决方案1】:

第一个文件“PnL_500010_0314.pdf”

实际上,整行“截至 2014 年 3 月 31 日止年度的损益表”以及更多内容无法提取;检查内容,原因很明显:此文本是使用复合字体编写的,该字体既没有 Encoding 也没有 ToUnicode 条目以允许识别有问题的字符。

在调用processTextPositionPDFTextStripper 实现并从中检索其文本信息)之前不久,org.apache.pdfbox.text.PDFTextStreamEngine(从中派生出PDFTextStripper)方法showGlyph 包含以下代码:

// use our additional glyph list for Unicode mapping
unicode = font.toUnicode(code, glyphList);

// when there is no Unicode mapping available, Acrobat simply coerces the character code
// into Unicode, so we do the same. Subclasses of PDFStreamEngine don't necessarily want
// this, which is why we leave it until this point in PDFTextStreamEngine.
if (unicode == null)
{
    if (font instanceof PDSimpleFont)
    {
        char c = (char) code;
        unicode = new String(new char[] { c });
    }
    else
    {
        // Acrobat doesn't seem to coerce composite font's character codes, instead it
        // skips them. See the "allah2.pdf" TestTextStripper file.
        return;
    }
}

有问题的字体没有为文本提取提供任何线索。因此,unicode 这里是null

此外,字体是复合的,而不是简单的。因此,else 子句被执行,processTextPosition 甚至没有被调用。

因此,PDFTextStripper 根本不知道“截至 2014 年 3 月 31 日止年度的损益表”这一行甚至存在!

如果你替换它

    else
    {
        // Acrobat doesn't seem to coerce composite font's character codes, instead it
        // skips them. See the "allah2.pdf" TestTextStripper file.
        return;
    }

PDFTextStreamEngine.showGlyph 中通过一些代码设置unicode,例如使用 Unicode 替换字符

    else
    {
        // Use the Unicode replacement character to indicate an unknown character
        unicode = "\uFFFD";
    }

你会得到

57
THIRTY SEVENTH ANNUAL REPORT 2013-14
STANDALONE FINANCIAL STATEMENTS
�������������������������������������������������������������
As per our report attached. Directors
For Deloitte Haskins & Sells LLP Deepak S. Parekh Nasser Munjee R. S. Tarneja
Chartered Accountants �������� B. S. Mehta J. J. Irani
D. N. Ghosh Bimal Jalan
Keki M. Mistry S. A. Dave D. M. Sukthankar
Sanjiv V. Pilgaonkar ���������������
Partner �����������������������
Renu Sud Karnad V. Srinivasa Rangan Girish V. Koliyote
������, May 6, 2014 Managing Director ������������������ �����������������
Notes Previous Year
� in Crore � in Crore
INCOME
����������������������� 23  23,894.03  20,796.95 
���������������������������� 24  248.98  315.55 
������������ 25  54.66  35.12 
Total Revenue  24,197.67  21,147.62 
EXPENSES
Finance Cost 26  16,029.37  13,890.89 
�������������� 27  279.18  246.19 
���������������������� 28  86.98  75.68 
�������������� 29  230.03  193.43 
������������������������������ 11 & 12  31.87  23.59 
Provision for Contingencies  100.00  145.00 
Total Expenses  16,757.43  14,574.78 

PROFIT BEFORE TAX  7,440.24  6,572.84 
�����������
�������������  1,973.00  1,727.68 
�������������� 14  27.00  (3.18)
PROFIT FOR THE YEAR 3  5,440.24  4,848.34 
EARNINGS PER SHARE��������������� 2) 31
- Basic 34.89 31.84
- Diluted 34.62 31.45
�������������������������������������������������������������

不幸的是,PDFTextStreamEngine.showGlyph 方法使用了一些私有类成员。因此,不能简单地在自己的PDFTextStripper 类中使用带有上述更改的原始方法代码覆盖它。要么必须在自己的类中复制 PDFTextStreamEngine 的几乎所有功能,要么必须求助于 Java 反射,或者必须自己修补 PDFBox 类。

这种架构并不完美。

第二个文件“Bal_532935_0314.pdf”

第二个文件的情况是由上面引用的同一段 PDFBox 代码引起的。不过这一次,字体很简单,执行的是另一个代码块:

    if (font instanceof PDSimpleFont)
    {
        char c = (char) code;
        unicode = new String(new char[] { c });
    }

这里发生的事情纯属猜测:如果没有将字形代码映射到 Unicode 的信息,我们假设映射是 Latin-1,它可以简单地嵌入到 char 中。正如在 OP 的第二个文件中可见的那样,这个假设并不总是成立。

如果您不希望 PDFBox 在此处做出此类假设,请将上面的 if 块替换为

    if (font instanceof PDSimpleFont)
    {
        // Use the Unicode replacement character to indicate an unknown character
        unicode = "\uFFFD";
    }

这会导致

Aries Agro Care Private Limited
1118th Annual Report 2013-14
Balance Sheet as at 31st March, 2014
Particulars Note
No.
 As at 
31 March, 2014
Rupees
 As at
31 March, 2013
Rupees
I. EQUITY AND LIABILITIES
(1) Shareholder's Funds
(a) ������������� 3  100,000  100,000
(b) Reserves and Surplus 4  (2,673,971) ������������
 (2,573,971) ������������
(2) Current Liabilities
(a) Short Term Borrowings 5  5,805,535 �����������
(b) Trade Payables 6  159,400 ���������
(c) ������������������������� 7  2,500  22,743 
 5,967,435  5,934,756 
TOTAL  3,393,464 �����������
II. ASSETS
(1) Non-Current Assets
(a) �������������������� �  - -
 - -
(2) Current Assets
(a) ����������������������� 9  39,605 �������
(b) ����������������������������� 10  3,353,859 ����������
 3,393,464 ����������
TOTAL  3,393,464 ����������
��������������������������������
The Notes to Accounts 1 to 23 form part of these Financial Statements
As per our report of even date For and on behalf of the Board
For Kirti D. Shah & Associates 
��������������������� 
�����������������������������
Dr. Jimmy Mirchandani
Director
Kirti D. Shah 
Proprietor 
Membership No 32371
Dr. Rahul Mirchandani 
Director
Place : Mumbai. 
Date :- 26th May, 2014.

【讨论】:

  • 谢谢 mkl。这是我一直在寻找的答案。我想我可能不得不复制粘贴整个 pdfstreamengine 类,因为我需要知道 pdf 中是否存在数据。你是怎么得到不可读的部分的?您是否复制了整个类(因为方法是私有的)。
  • 有些 pdf 中的数据仍然不可读,但 pdfbox 会读取它并给出乱码。有什么方法可以知道我们什么时候得到乱码。例如:-股本单词不可读,我在它们的位置得到了一些随机字母。那么有什么方法可以知道这些只是随机字母吗?(不使用字典,因为有不需要的空格不允许这种方法)这是指向 Pdf 的链接:-drive.google.com/file/d/0B_Ke2amBgdpebm96U05FcWFsSXM/…
  • 你是怎么得到不可读的部分的?你复制了整个类吗(因为方法是私有的) - 我测试了 PDFBox 代码的副本,所以我只是编辑了它。
  • 我该怎么做,我尝试在eclipse中加载src文件夹但没有成功。
  • 如果我的回答基本上帮助您走上正轨,请接受(点击左上角的勾号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
相关资源
最近更新 更多