Googleドキュメントで作成したrtfファイルをHTMLに変換し、任意のクラスを付与する方法を紹介します。
詳細は下記内容をご確認ください。
目次
要約
googleドキュメントで作成されたrtfファイルをHTMLに変換し、任意のクラスを付与する
※実装すべての記述はしません
経緯
文量が多いブログ記事のようなページのため、見出しや本文などのクラスを振り分けて一括でHTMLに変換したい業務があったため個人用にツールを作成しました。
欲しかった機能
- 原稿からざっくり見出し2, 3, 本文をそのままコピペできる形に変換する
- 見出し2, 3に章ごとの連番でid出力
- 見出し2直下に画像用のコードを出力
- 太字/アンダーラインなどを固有のクラスをつけたspanで囲む
実装について
Googleドキュメントからダウンロードする際、HTML形式を選ぶとminifyされた状態でファイルが保存されるため、一旦rtfファイルでダウンロードしHTML形式へ変換する工程を挟んでいます。
当初、MacOS標準のtextutilでrtfファイルからhtmlへの変換を行っていましたが、ツール内での操作で完結させたかったため、npmパッケージのrtf.js( https://www.npmjs.com/package/rtf.js )を使用しています。
変換後の処理はPHPで行っています。
HTMLを配列に格納
rtfから変換されたHTMLの改行ごとにフォントサイズや太字箇所を判定し、配列へ格納します。
その際に不要なスタイルを削除し、また続いている文章が細切れになっている場合があるので結合します。
//フォントサイズを確認
preg_match('/font-size\:\s([\d]*)/', $value, $matches);
if(empty($matches)){
$this_fontsize = '';
}else{
$this_fontsize = $matches[1];
//初出のフォントサイズの場合数値を追加
if(!in_array($this_fontsize, $arr_fontsize, true)){
$arr_fontsize[] = $matches[1];
}
}太字箇所がfont-weight:bold;として出力されているため、一旦b要素で囲みます。
これは後に固有のクラスがついたspan要素に変換されます。
if(strpos($value, 'font-weight: bold;')){
$htmlTag_pattern = '[0-9a-zA-Z\s\'\"\=\-\:\;\(\)\,\.]*';
$bold_pattern = "<span${htmlTag_pattern}font-weight\: bold;${htmlTag_pattern}>";
$value = preg_replace("/${bold_pattern}(.*?)<\/span>/", '<b>$1</b>', $value);
//細切れになっている<b>を結合
$value = str_replace('</b><b>','', $value);
$value = strip_tags($value, '<b>');
}bタグ以外のHTMLを削除し、フォントサイズとともに本文を配列へ格納します。
//太字以外のspanを削除
$value = strip_tags($value, '<b>');
//出力配列に追加
$arr_text_formated[] = [
'font-size' => $this_fontsize,
'text' => $value
];$arr_text_formatedに記事の全体が格納されるため、各要素を見出しや本文などに判定して固有のクラスをつけます。
また見出し2・3には連番でidを振り、アンカーリンクで移動できるようにします。
//例:見出し2の場合
if($this_fontsize == $arr_fontsize[0]){
// 固有のクラスを設定
// 太字設定はは見出し用のクラスで設定されるためbタグは削除する
$this_text = strip_tags($this_text);
$text_formated = '<h2 '.$arr_web_class['h2'].' id="article'. $h2_num.'_0">'. $this_text . '</h2>';
// id用の連番を更新
$h2_num ++;
$h3_num = 1;
$result .= $text_formated;
continue;
}任意のHTMLタグ・クラスを設定した見出し・本文は$resultに結合し、file_put_contentsとreadfileでHTMLファイルで出力します。
躓いたところ
前述の通りGoogleドキュメントからダウンロードする際HTML形式を選択すると、すべてminifyされた状態でファイルが作成され、html_entity_decodeしない限り日本語が読めない状態でファイルが保存されるため内容の確認がしづらくなってしまいました。
そのため、rtf形式でダウンロードするのですが、その場合はrtfファイルからHTMLへの変換が必要になります。MacOSの使用者は標準で搭載されているtextutilを使用すればよいのですが、Windowsを使用している人が変換できないためパッケージやライブラリを使いツール内でファイル形式の変換から対応できるようにしました。
終わりに
Webページを作成する際、文量が多いほど抜け漏れや重複などのミスが起こり、また確認の時間も増えるため、一括で指定した形式に変換するツールによって時短を図りました。
一行一行確認しながらコピーペーストを行っていた場合と比べ、作業時間は約1/3になったため時短としては成功したと思います。
しかし個人で機能を増やしたり精査したりしているうちに、主な使用先であるオウンドメディアの運用がHTMLベタ打ちからCMSへ移行したため大体2週間でお役御免となりました。そういうこともあります。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(606)
-
イベント(242)
-
カルチャー(61)
-
デザイン(77)
TAG
- 5G
- Active Directory
- AI
- AI TALK
- AI 機械学習強化学習
- AI/機械学習
- AIエージェント
- AIコーディング
- AIセキュリティ
- AI人財
- AI教育
- AI研究
- AI駆動
- Behind the Scenes
- BIT VALLEY
- blockchain
- ChatGPT
- ChatGPT Team
- Claude Code
- Claude Team
- cloudflare
- cloudnative
- CNDO
- CNDT
- CODE BLUE
- ConoHa
- ConoHa VPS
- ConoHa VPS MCP
- CSS
- CTF
- DEF CON
- DEF CON 34
- Designship
- developer
- DevRel
- DevSecOpsThon
- Docker
- DTF
- EDR
- Engineering Journey
- expert
- EXPERT CROSS
- GMO AI&ロボティクス商事
- GMO AIR
- GMO DESIGN AWARD
- GMO Developers Day
- GMO Developers Night
- GMO Flatt Security
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOインターネット
- GMOインターネットグループ
- GMOインターネットグループ陸上部
- GMOグローバルサイン
- GMOコネクト
- GMOサイバーセキュリティ byイエラエ
- GMOサイバーセキュリティbyイエラエ
- GMOデジキッズ
- GMOヒューマノイド・ラボ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOメイクショップ
- GMOメディア
- GMOロボッツ
- GMO大会議
- GMO天秤AI
- Go
- GPUクラウド
- GTB
- Hack-1グランプリ
- IETF
- iOS
- IoT
- ISUCON
- Japan Drone
- JapanDrone
- Java
- JJUG
- JSAI2026
- K8s
- Kaigi on Rails
- Kerberos
- Kids VALLEY
- LLM
- MCP
- MetaMask
- MySQL
- NFT
- OpenStack
- OSS
- Perl
- PHP
- PHPcon
- PHPerKaigi
- Python
- QUIC
- RFC
- RPA
- Ruby
- SECCON
- Selenium
- Spectrum Tokyo Meetup
- splunk
- SRE
- Takumi byGMO
- Terraform
- TypeScript
- UI/UX
- vibe
- VLA
- VPN
- VPS
- VS Code
- WebRTC
- XR
- XSS
- Yoitoi Summit
- ZTNA
- アウトプット
- アドベントカレンダー
- イベントレポート
- インターンシップ
- インハウス
- インフラ
- エキスパート制度
- エンジニア採用
- エンジニア文化
- お名前.com
- クラウド
- クリエイターインタビュー
- クリエイティブ
- コンテナ
- コンピュータビジョン
- サイバーセキュリティ
- サマーインターン
- スクラム
- スパム対策
- スペシャリスト
- セキュリティ
- セキュリティカンファレンス
- セキュリティ人材
- センシング
- ソフトウェアサプライチェーン
- ソフトウェア開発
- チームビルディング
- データサイエンティスト
- デザイン
- ネットのセキュリティもGMO
- ハーネスエンジニアリング
- バイブコーディング
- バックエンド
- ヒューマノイド
- ヒューマノイドロボット
- フィジカルAI
- プログラミング教育
- ブロックチェーン
- フロントエンド
- プロンプトインジェクション
- ペアリング暗号
- ペネトレーションテスト
- ホワイトハッカー
- ゆめみらいワーク
- リモートワーク
- レッドチーム
- レンタルサーバー
- ロボット
- ロボット導入
- ロボティクス
- 世界モデル
- 京大ミートアップ
- 京都大学
- 京都未踏
- 人型ロボット
- 人工知能
- 人工知能学会
- 光学
- 国際ロボット展
- 国際標準化
- 基礎
- 多拠点開発
- 大阪公立大学
- 宇宙セキュリティ
- 宮崎オフィス
- 強化学習
- 応用
- 技育プロジェクト
- 技術イベント
- 技術ブログ
- 技術同人誌
- 技術広報
- 技術書典
- 拡張知能
- 新卒
- 新卒研修
- 映像
- 映像クリエイター
- 暗号
- 未踏
- 業務効率化
- 機械学習
- 次世代育成
- 決済
- 生成AI
- 産学連携
- 研究開発
- 社会実装
- 社内コミュニティ
- 組織横断
- 耐量子暗号
- 脆弱性診断
- 若手人材育成
- 通信技術
- 開発組織
- 開発者
PICKUP
-
近畿圏の若手14名、半年の開発の起点に。「京都未踏」ブースト会議レポート
イベント
-
【第3回・AI TALK】GMOインターネットグループ・真次さんに聞く、ヒューマノイドの現在地と研究者としての挑戦
技術情報
-
【DEF CON 34 参加レポート】GMOインターネットグループが挑む、世界最高峰セキュリティカンファレンスの最前線
イベント
-
【Expert Cross #4・後編】「場づくり」を通じて新しい概念を組織に浸透。横のつながりと共に広がった「エキスパートとしての視野」
技術情報
-
【Expert Cross #4・前編】技術同人誌からアドベントカレンダーまで。「場づくりの名手」が促進する技術文化
技術情報
-
DEF CON 34参加記(2026/8/6 – 8/9)
カルチャー