質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3594閲覧

pdfminerのdumppdf.pyによるPDFの目次抽出

revoiot

総合スコア188

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/16 00:24

編集2020/06/16 03:37

pdfminerというツールをインストールし使用して、pdfの中の目次(アウトライン)を抽出しようとしているのですが、下記のようなエラーが発生してしまっている状況です。
このエラーは、dumppdf.pyというファイルを書き換える必要があるというエラーでしょうか?
もしそうであれば、どのように書き換える必要があるのか、ご教授いただけると幸いです。

ShimpeinoMacBook-Pro:samples shimpei$ dumppdf.py -T JJJ.pdf <outlines> Traceback (most recent call last): File "/usr/local/bin/dumppdf.py", line 272, in <module> if __name__ == '__main__': sys.exit(main(sys.argv)) File "/usr/local/bin/dumppdf.py", line 269, in main dumpall=dumpall, mode=mode, extractdir=extractdir) File "/usr/local/bin/dumppdf.py", line 151, in dumpoutline outfp.write('<outline level="%r" title="%s">\n' % (level, q(s))) NameError: name 's' is not defined

画像①

画像②

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Warning: As of 2020, PDFMiner is not actively maintained. The code still works, but this project is largely dormant. For the active project, check out its fork pdfminer.six.

メンテナンスされてないようなので、pdfminer.six で引き継がれているようです。

該当箇所の修正のみで良いなら pdfminer.six の tools/dumppdf.py#L164 より

python

1s = e(title).encode('utf-8', 'xmlcharrefreplace') 2outfp.write('<outline level="{!r}" title="{}">\n'.format(level, s))

追記: XMLのパースについて、<outline>title 要素のリストアップは
以下のように変換できます。出力結果を sample.xml として、

import sys import ast import xml.etree.ElementTree as ET # title が "b'....'" の様に多重にクォートされているのを解消する。 FIX_3K_BYTES = True def main(filepath="sample.xml"): fix = ast.literal_eval if FIX_3K_BYTES else (lambda _:_) doc = ET.parse(filepath).getroot() for outline in doc.findall(r"outline"): title = fix(outline.attrib["title"]).decode("utf-8") print(title) if __name__ == '__main__': main(*sys.argv[1:])

投稿2020/06/16 01:09

編集2020/06/17 15:15
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

revoiot

2020/06/16 03:43

大変丁寧な回答をいただきありがとうございます。 pdfminer.sixで実行し直した結果、特にエラーが発生することなく、処理が進むようになりました。 しかし、画像①にもある通り、私のイメージしていた目次の出力結果と異なりました。 画像②にあるような目次をテキストベースで一気に出力結果として得たいのですが、 この方法では、難しそうでしょうか。 引き続きご教授いただけると幸いです。
teamikl

2020/06/16 05:14

1) 正規表現やXMLでパースして title を抽出すれば良いはず…ですが、課題が一点 b'....' という2重にエスケープされた?文字列になっているので、 適切にデコードする必要があります。"b'....'" とバイト型のリテラル表記が文字列内に入ってしまってます。 出力形式や文字コード関連のオプションがないか調べてみたほうが良いかも知れません。 他の方法: 2) pdf2xt を使う。同梱の別スクリプトです https://pdfminersix.readthedocs.io/en/latest/reference/commandline.html#api-pdf2txt 3) dumppdf.py の dumpoutline関数を参考に自分で実装する。(30行程度)
teamikl

2020/06/16 13:21

pdfminer.sixのサイトには、3.4以降と書かれてたのですが。 > "b'....'" とバイト型のリテラル表記が文字列内に この問題に対しては、Python2.7 で実行するもしくは 3.x 対応版が別にあるみたいです。 https://pypi.org/project/pdfminer3k/
revoiot

2020/06/17 12:37

大変親切な回答をいただきありがとうございます!!!! 現在上記を実践しているところですが、またわからないところがでてきましたら、質問させていただくかもしれません。 大変親切に回答しただき、本当に助かります。 よろしくお願いします。
revoiot

2020/06/17 14:42 編集

pdfminer3kで試そうと思ったのですが、 ファイル内にdumppdf.pyがありませんでした。。。 >"b'....'" とバイト型のリテラル表記が文字列内に >この問題に対しては、Python2.7 で実行するもしくは 3.x 対応版が別にあるみたいです。 >https://pypi.org/project/pdfminer3k/ おそらく。pdfminer3kを使用する事によって、 "b'....'" とバイト型のリテラル表記が文字列内に入ってしまう問題が解決できるという記事を teamiklさん自身がどこかで見かけられたと思うのですが、もし良ければその記事を教えていただく事は可能でしょうか?
teamikl

2020/06/17 15:12

pypi で直接検索してました。 https://github.com/gwk/pdfminer3/ なのかな。ただし、更新日時が2年前で 日付は3kの方が新しいと思ったら、こちらは最近作られたばかりのレポジトリでした。
revoiot

2020/06/19 00:49

追記にて大変親切丁寧にコード部分も教えてくださり誠にありがとうございます。 大変感謝しております。 おそらく、そのコード部分は、pdfminer.sixの中のdumppdf.pyのファイルの中身に書き換え、または追記をする必要があると思います。 現在それを実践していますが、もし上手くいかなかった場合、大変恐縮ですが、再度質問させていただけると幸いです。
teamikl

2020/06/19 02:02

説明不足でした。回答のコードは "b'....'" となってしまったXMLを対象にしたものなので、 質問に貼られた画像のような出力に対応してます。<outline title="b'...'"> 他の項目でも同様の表記になるかも知れないので、根本的な解決ではありませんが。 >"b'....'" とバイト型のリテラル表記が文字列内に入ってしまう問題が解決できるという記事 (返信で、意図を読み違えてました) これは、記事というか Python 2.x -> 3.x でのよくある問題でした。 文字列 (str) の型が 2.x では現在の bytes 相当だったのが 3.x で unicode文字となった為、 古いライブラリ、3.x未対応なものだと同様の症状になります。 > pdfminer.sixの中のdumppdf.pyのファイルの中身に書き換え、または追記をする必要があると思います。 インストール済のものを書き換えるのは、極力避けたいですね。 代わりに、問題のある関数のみ、実行時に差し替えて実行という方法もあります。 - sys.pathでライブラリのパスを通す (site-packages ではなく別の場所にインストールされている為) - dumppdf.py を直接 import - dumppdf.e 関数の上書き https://github.com/pdfminer/pdfminer.six/blob/09c989f301d9cf0dca2846933113a26d07435dc8/tools/dumppdf.py#L25 恐らく原因はここなので、ここでbytes オブジェクトを返さない等にデバッグします。 # ---- 以下は、概要のみですが、このような感じのパッチを当てた起動スクリプトを作る import sys sys.path.append("PATH TO dumppdf.py DIRECTORY") import dumppdf dumppdf.e = FIXED_E_FUNC dumppdf.main()
revoiot

2020/06/19 13:46 編集

私自身プログラミング初心者であり、回答していただいた意図を勘違いしておりました。 大変申し訳ございません、 それについて、大変親切丁寧な説明をしてくださり、誠にありがとうございます。 これから、上記のヒントを題材にして、再度チャレンジしてみようと思います。 何度もご教授くださり誠にありがとうございます。 よろしくお願いいたします。
revoiot

2020/07/01 00:37

上記を解決できるようにするために、私自身がしっかりとpythonの基礎文法を学ぶ必要があり、 もう少し時間がかかりそうです。 また質問が出てきた際は、大変恐れいりますが、別スレッドで投稿させていただこうと考えております。 よろしくお願いします。
guest

0

NameError: name 's' is not defined
とあるので、変数sを定義せずに使っていることによるエラーです。
outfp.write('<outline level="%r" title="%s">\n' % (level, q(s)))←ここの最後でしょうかね。

投稿2020/06/16 00:48

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

revoiot

2020/06/16 01:05

ご回答いただきありがとうございます。 インストールしたdumppdf.pyの中身を書き換える必要がありそうでしょうか?
jeanbiego

2020/06/16 01:17

それはdumppdfの中身を見てみないと…と思いましたが、teamiklさんが詳しく回答されてるようですね。
revoiot

2020/06/16 03:45 編集

ご回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問