ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
DHConvalidatorにおける'ref'に関する不具合への対応

DHConvalidatorにおける'ref'に関する不具合への対応

本記事は、一部AIが執筆しました。 概要 DHConvalidatorは、デジタル人文学(DH)会議の抄録を一貫したTEI(Text Encoding Initiative)テキストベースに変換するためのツールです。 https://github.com/ADHO/dhconvalidator このツールの利用において、Microsoft Word形式(DOCX)からTEI XML形式への変換処理中に以下のようなエラーが発生するケースがありました: ERROR: nu.xom.ParsingException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'ref' この原因と対処方法について共有します。 原因の特定 調査の結果、問題の原因はWord文書内に埋め込まれた INCLUDEPICTUREフィールドコード であることが判明しました。 具体的には、Googleドキュメントから画像をコピー&ペーストした際に、以下のようなフィールドコードが文書内に残存していました: INCLUDEPICTURE "https://lh7-rt.googleusercontent.com/docsz/..." \* MERGEFORMATINET これらの外部画像参照リンクがTEI変換プロセスで適切に処理されず、XML検証エラーを引き起こしていました。 解決方法 この問題を解決するため、DOCXファイル内の問題のあるフィールドコードを自動的に除去するPythonスクリプトを開発しました。 スクリプトの特徴 安全な処理 : 画像コンテンツ自体は保持し、フィールドコード部分のみを削除 ZIP形式対応 : DOCXファイルの内部構造(ZIP + XML)を適切に処理 名前空間対応 : Word文書のXML名前空間を考慮した正確な要素検索 主要な処理ロジック DOCXファイルを一時ディレクトリに展開 word/document.xml内のフィールドコード構造を解析 INCLUDEPICTUREを含むフィールドを特定 フィールド制御要素(begin/separate/end)のみを削除し、画像要素は保持 修正されたXMLで新しいDOCXファイルを生成 実装のポイント フィールドコード判定 def is_includepicture_field(field_runs, ns): for run in field_runs: instr_text = run.find('.//w:instrText', ns) if instr_text is not None and instr_text.text: if 'INCLUDEPICTURE' in instr_text.text: return True return False 削除対象の選別 def should_remove_run(run, ns): # フィールド制御要素を持つか確認 has_field_control = (run.find('.//w:fldChar', ns) is not None or run.find('.//w:instrText', ns) is not None) # 実際の画像コンテンツを持つか確認 has_image_content = (run.find('.//w:drawing', ns) is not None or run.find('.//w:pict', ns) is not None) # フィールド制御要素があり、画像コンテンツがない要素を削除 return has_field_control and not has_image_content 結果 このスクリプトにより、問題のあるフィールドコードが除去され、TEI変換プロセスが正常に完了するようになりました。画像は適切に文書内に埋め込まれた状態で保持されます。 ...

WordファイルをTEI XMLに変換する方法:TEIgarage APIの活用ガイ

WordファイルをTEI XMLに変換する方法:TEIgarage APIの活用ガイ

この記事は、AIが作成し、一部を人が修正したものです。 はじめに デジタル人文学の世界では、文書をTEI(Text Encoding Initiative)形式で保存することが一般的になっています。TEIは学術的なテキストを構造化するための標準規格です。今回は、Microsoft Wordで作成した文書をTEI XML形式に変換する方法を、Pythonを使って解説します。 TEIgarageとは? TEIgarageは、さまざまな形式の文書をTEI XMLに変換するためのオンラインサービスです。このサービスはAPIを提供しており、プログラムから直接利用することができます。今回はこのAPIをPythonから呼び出して、Wordファイルを変換してみましょう。 必要なもの Python 3.6以上 requestsライブラリ(APIリクエスト用) インターネット接続 変換したいWordファイル(.docx形式) 手順 1. 必要なライブラリをインストールする まず、必要なライブラリをインストールしましょう。コマンドプロンプトやターミナルで以下のコマンドを実行します。 pip install requests 2. Pythonスクリプトを作成する 次に、以下のPythonコードをword_to_tei.pyなどの名前で保存します。 import requests import os import zipfile from io import BytesIO def convert_docx_to_tei_xml(file_path, output_path): # OxGarageのエンドポイント input_document_type = "docx%3Aapplication%3Avnd.openxmlformats-officedocument.wordprocessingml.document" output_document_type = "TEI%3Atext%3Axml" TEIGARAGE_URL = f"https://teigarage.tei-c.org/ege-webservice/Conversions/{input_document_type}/{output_document_type}/" # .docx ファイルを開いてAPIに送信 with open(file_path, "rb") as file: files = {"file": file} response = requests.post(TEIGARAGE_URL, files=files) # 変換結果をファイルとして保存せずに展開 if response.status_code == 200: # zipファイルをメモリ上で展開 with zipfile.ZipFile(BytesIO(response.content)) as zip_ref: # tei.xmlファイルを保存 for member in zip_ref.namelist(): if member.endswith("tei.xml"): zip_ref.extract(member, os.path.dirname(output_path)) tei_xml_path = os.path.join(os.path.dirname(output_path), member) os.rename(tei_xml_path, output_path) print("TEI/XML 変換成功!tei.xml に保存されました。") break else: print("エラー: tei.xml ファイルが見つかりません。") else: print("エラー:", response.status_code, response.text) # メイン処理 if __name__ == "__main__": # 変換したいWordファイルのパスを指定 word_file = "documents/sample.docx" # ここを実際のファイルパスに変更してください # 出力ファイルのパスを指定 output_file = "output/sample_tei.xml" # 出力先を指定 try: # Wordファイルを変換 convert_docx_to_tei_xml(word_file, output_file) except Exception as e: print(f"エラーが発生しました: {e}") 3. スクリプトを実行する スクリプト内のword_file変数を、変換したいWordファイルの実際のパスに変更します。同様に、output_file変数も希望の出力先に変更してください。 ...

WordをTEI/XMLに変換する

WordをTEI/XMLに変換する

概要 WordをTEI/XMLファイルに変換する機会がありました。調べてみたところ、TEIGarage ConversionなどのTEI公式のツールに加えて、以下のTEI Publisherでの変換例が見つかりました。 https://teipublisher.com/exist/apps/tei-publisher/test/test.docx.xml 上記の例では、Wordのスタイル情報を中心に、TEIのタグに変換しているようだったので、この方法を試してみました。なお今回は、TEI Publisherとは独立して使用することを目的として、python-docxライブラリを使用しました。 Wordファイル 以下のようなWordファイルを試作しました。いずれも仮ですが、「tei:persName」や「tei:warichu」といったスタイルを作成し、色などのスタイルを変更しました。スタイルを当てていくことで、簡易な構造化を行う仕組みです。 TEI/XMLへの変換 上記のようなWordファイルを入力として、スタイル情報を中心に、TEI/XMLに変換するスクリプトを作成しました。いずれpipなどを使って共有したいと考えています。 変換したTEI/XMLの例は以下です。まだまだ改善が必要ですが、validなTEI/XMLファイルに変換することができました。 <lb/> <seg> ワードの入力サンプル </seg> <lb/> <lb/> <seg type="dateline"> 日付の行にスタイル「dateLine」を使用してください。先頭に2文字の空白が入ります。 </seg> <lb/> <seg type="personline"> 名前の行にスタイル「personLine」を使用してください。末尾に2文字の空白が入ります。 </seg> <lb/> <seg> <ruby> <rb> 中村 </rb> <rt> なかむら </rt> <rt place="left"> さとる </rt> </ruby> の形で両側ルビを記述します。緑色が左ルビです。 </seg> <lb/> <lb/> <seg> <seg type="red"> 朱書 </seg> はスタイル「 <seg type="red"> red </seg> 」を使用してください。 </seg> <lb/> <lb/> <seg> 文字のサイズについては検討中です。 </seg> <lb/> <lb/> <seg> <persName> 中村覚 </persName> のような人名には、スタイル「 <persName> persName </persName> 」を使用してください。 </seg> <lb/> <lb/> <seg> 割注は <note type="割書"> あああああ <milestone unit="wbr"/> いいい </note> のように入力してください。正しく改行されるまで、全角スペースを入力してください。 <note type="割書"> こんな <milestone unit="wbr"/> スタイル </note> もあります。「こんな」の後に全角スペースを入れています。 </seg> <lb/> <lb/> <seg type="dateline"> 二〇二三年一月十七日 </seg> <lb/> <seg type="personline"> 作成:中村覚 </seg> <lb/> 別途開発中のTEI/XMLビューアで表示した例が以下です。<rt place="left">や朱書などのスタイルがまだ適用できていませんが、人名や割書などは再現することができました。 ...

python-docxを用いた両側ルビ

python-docxを用いた両側ルビ

python-docxを用いて、Wordで両側ルビを実現する方法の備忘録です。 以下のノートブックからお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/python_docxを用いた両側ルビ.ipynb 出力例は以下です。 入力例は以下です。 <body> <p> 私は <ruby> <rb> <ruby> <rb>打</rb> <rt place="right">ダ</rt> </ruby> <ruby> <rb>球</rb> <rt place="right">キウ</rt> </ruby> 場 </rb> <rt place="left">ビリヤード</rt> </ruby> に行きました。 </p> <p> <ruby> <rb>入学試験</rb> <rt place="above">にゅうがくしけん</rt> </ruby> があります。 </p> </body> まだ不完全はプログラムではありますが、参考になりましたら幸いです。

TEI/XMLファイルを縦書きPDFに変換する方法の1例

TEI/XMLファイルを縦書きPDFに変換する方法の1例

概要 TEI/XMLファイルを縦書きPDFに変換する方法について、その1例を備忘録として残します。 以下のノートブックで、「校異源氏物語」を対象としたプログラムをお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/TEI_XMLファイルを縦書きPDFに変換する.ipynb 変換の流れ 今回は、Quartoを使用しています。 https://quarto.org/ インストールの方法は以下を参考にしてください。 https://quarto.org/docs/get-started/ TEI/XML -> qmd まずTEI/XMLファイルの内容をqmdファイルに変換します。以下は、変換スクリプトのサンプルです。 from bs4 import BeautifulSoup soup = BeautifulSoup(open(file,'r'), "xml") elements = soup.findChildren(text=True, recursive=True) import os id = os.path.splitext(os.path.basename(file))[0] title = soup.find("title").text author = soup.find("author").text elements = soup.find("body").find("p").findChildren() text = "" for e in elements: if e.name == "pb": text += "\n" if e.name == "seg": text += e.text + " \n" opath = f"data/{id}.qmd" os.makedirs(os.path.dirname(opath), exist_ok=True) text = f"""--- title: "{title}" author: "{author}" format: docx: reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx --- {text.strip()} """ with open(opath, "w") as f: f.write(text) 以下がqmdファイルの例です。 --- title: "校異源氏物語・きりつぼ" author: "池田亀鑑" format: docx: reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx --- いつれの御時にか女御更衣あまたさふらひ給けるなかにいとやむことなきゝは にはあらぬかすくれて時めき給ありけりはしめより我はと思あかり給へる御方 〱めさましきものにおとしめそねみ給おなしほとそれより下らうの更衣たち はましてやすからすあさゆふの宮つかへにつけても人の心をのみうこかしうら みをおふつもりにやありけむいとあつしくなりゆきもの心ほそけにさとかちな るをいよ〱あかすあはれなる物におもほして人のそしりをもえはゝからせ給 はす世のためしにもなりぬへき御もてなし也かんたちめうへ人なともあいなく めをそはめつゝいとまはゆき人の御おほえなりもろこしにもかゝることのおこ りにこそ世もみたれあしかりけれとやう〱あめのしたにもあちきなう人のも てなやみくさになりて楊貴妃のためしもひきいてつへくなりゆくにいとはした なきことおほかれとかたしけなき御心はへのたくひなきをたのみにてましらひ 給ちゝの大納言はなくなりてはゝ北の方なんいにしへの人のよしあるにておや うちくしさしあたりて世のおほえはなやかなる御方〱にもいたうおとらすな にことのきしきをももてなしたまひけれととりたてゝはか〱しきうしろみし なけれは事ある時はなをより所なく心ほそけ也さきの世にも御ちきりやふかか qmd -> Word(docx) 次に、qmdファイルをwordファイルに変換します。この時、事前に用意した縦書きのwordテンプレートを参照することで、マークダウン形式のテキストを縦書きのwordファイルに変換します。 ...

python-docxを用いたMicrosoft Wordファイルの作成:テンプレート、int2kanjiの利用など

python-docxを用いたMicrosoft Wordファイルの作成:テンプレート、int2kanjiの利用など

概要 以下のように表形式で管理している情報を、Microsoft Wordの縦書きフォーマットに変換する機会がありましたので、その備忘録です。 変換前 研究課題名 課題番号 直接経費 持続性と利活用性を考慮したデジタルアーカイブシステム構築手法の開発 21K18014 2600000 変換後 指定されたテンプレートの利用や、「数字 <-> 漢数字 の相互変換ライブラリ 「Kanjize」」を利用しています。 python-docxを用いたMicrosoft Wordファイルの作成 まず、以下のようなMicrosoft Wordのテンプレートファイルを作成します。指定されたレイアウトを使用しつつ、値を変更したい部分に{<変数名>}を指定します。 そして、上記のテンプレートで使用した変数名に対応したjsonファイルなどを作成します。 { "direct_cost": "二百六十万", "indirect_cost": "七十八万", "period_end": "二〇二三", "period_start": "二〇二一", "principal_investigator": "中村 覚", "project_number": "二一K一八〇一四", "research_category": "若手研究", "research_title": "持続性と利活用性を考慮したデジタルアーカイブシステム構築手法の開発" } そして、以下のようなpythonスクリプトを実行することにより、指定されたフォーマットに基づくMicrosoft Wordファイルを作成することができます。 import docx import json item = { "direct_cost": "二百六十万", "indirect_cost": "七十八万", "period_end": "二〇二三", "period_start": "二〇二一", "principal_investigator": "中村 覚", "project_number": "二一K一八〇一四", "research_category": "若手研究", "research_title": "持続性と利活用性を考慮したデジタルアーカイブシステム構築手法の開発" } doc = docx.Document("template.docx") for para in doc.paragraphs: text = para.text for key in item: target = "{"+key+"}" if target in text: text = text.replace(target, item[key]) para.text = text opath = "output.docx" doc.save(opath) 数字 <-> 漢数字 の相互変換 上記の入力用のjsonファイルを作成するにあたり、数字を漢数字に変換する必要がありました。 例:2600000 -> 二百六十万 ...