PDFエンコーディングについてはよくわかりませんが、を変更することで特定の問題を解決できると思いますpdf.py
。このPageObject.extractText
方法では、何が起こっているかがわかります。
def extractText(self):
[...]
for operands,operator in content.operations:
if operator == "Tj":
_text = operands[0]
if isinstance(_text, TextStringObject):
text += _text
elif operator == "T*":
text += "\n"
elif operator == "'":
text += "\n"
_text = operands[0]
if isinstance(_text, TextStringObject):
text += operands[0]
elif operator == '"':
_text = operands[2]
if isinstance(_text, TextStringObject):
text += "\n"
text += _text
elif operator == "TJ":
for i in operands[0]:
if isinstance(i, TextStringObject):
text += i
演算子がTj
or TJ
(PDFの例ではTj)の場合、テキストは単に追加され、改行は追加されません。これで、少なくともPDF参照を正しく読んでいる場合は、必ずしも改行を追加する必要はありません。これは、Tj/TJ
単一および複数のshow-string演算子であり、何らかのセパレーターの存在は必須ではありません。
とにかく、このコードを次のように変更すると
def extractText(self, Tj_sep="", TJ_sep=""):
[...]
if operator == "Tj":
_text = operands[0]
if isinstance(_text, TextStringObject):
text += Tj_sep
text += _text
[...]
elif operator == "TJ":
for i in operands[0]:
if isinstance(i, TextStringObject):
text += TJ_sep
text += i
その場合、デフォルトの動作は同じである必要があります。
In [1]: pdf.getPage(1).extractText()[1120:1250]
Out[1]: u'ing an individual which, because of name, identifyingnumber, mark or description can be readily associated with a particular indiv'
ただし、次の場合に変更できます。
In [2]: pdf.getPage(1).extractText(Tj_sep=" ")[1120:1250]
Out[2]: u'ta" means any information concerning an individual which, because of name, identifying number, mark or description can be readily '
また
In [3]: pdf.getPage(1).extractText(Tj_sep="\n")[1120:1250]
Out[3]: u'ta" means any information concerning an individual which, because of name, identifying\nnumber, mark or description can be readily '
あるいは、オペランド自体をインプレースで変更することでセパレーターを自分で追加することもできますが、それは他の何かを壊す可能性があります(get_original_bytes
私を緊張させるような方法)。
最後に、必要がなければ自分自身を編集するpdf.py
必要はありません。このメソッドを関数に引き出すだけです。