odtファイルの中身を静的チェックしたい!

誰しもそんな気分になる事はありますよね

一時期ドキュメント大臣みたいなことをやっていてですね、
ドキュメントつくりまくっていたんですが、
文言チェックにすごい工数を使っていました。

あのころは若干人海戦術も使えましたしね。
でも、まぁプログラマーなので、文言チェックを静的にチェックできないかなーと昔ツールをつくった時にしった
あれこれを作っていこうと思います。

対象チェック対象ファイルはodtでした。
OpenOfficeのwriterソフトです。

作りたいのは指定したフォルダにあるodtの書いてある文字をJavaで読み取って、
String.contents()判定をして含まれていればエラーにするってものですね。

xlsとかだとpoiって便利なライブラリがありますが、なかなか見つけられずこんな方法でやっていました。

■odtファイルはzip化して解凍すると色々いじくれる。

そのままStream系で読み込むことはできなかったので、違う手段を探していたところ、
「odtの中身はxmlファイル」
ということを知りました。

コレだ!と。

手元にodtファイルを用意して、拡張子をzipに変更します。

で変更したzipを解凍するとこんなファイル構成になっています。

これらがいい感じになって表示されているみたいです。

今回重要になるのは
content.xml
です。

ここにタグと一緒に文字が保存されています。

なのでコイツをよみとればいいわけです。
こんな感じでファイルを読み取れば解消です。

■折角なので一例。。。

こんな感じで動くんじゃないですかね

コピペしたらインデントが凄いことになりましたが、、、

public class XmlLoadDao {

public static final String CONTENT_FILE_NAME = “content.xml”;
public static final String STYLES_FILE_NAME = “styles.xml”;

public static List<String> handleOdtFile(File odtFile) throws FileNotFoundException, IOException, SAXException, ParserConfigurationException {
System.out.println(odtFile.getName());
List<String> returnList = new ArrayList<String>();
try (ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(odtFile)))) {
ZipEntry entry = null;
while ((entry = zipStream.getNextEntry()) != null) {
if (CONTENT_FILE_NAME.equals(entry.getName())) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int b = 0;
while ((b = zipStream.read()) > 0) {
outStream.write(b);
}
outStream.flush();
outStream.close();
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(outStream.toByteArray()));
search(odtFile.getName(), document, returnList);
}
}
}
return returnList;
}

private static void search(String file, Node node, List<String> returnList) {
if (node.getNodeName().startsWith(“text”)) {
returnList.add(node.getTextContent());
} else {
for (int i = 0; i < node.getChildNodes().getLength(); i++) {
search(file, node.getChildNodes().item(i), returnList);
}
}
}
}

■文字チェックの設計について

多分すぐ気づくことなんですが、
文言チェックの一覧作るじゃないですか。NGWordList的なもの。
こんな感じのテーブルをつくってます。
ID:ID
NG_WORD:ワード(使っちゃだめな文字列)
REVISION:改訂(こう書き換えるといいよ)
ALERT_LV:警戒レベル(0:絶対だめ、1:非推奨。条件付で使用可)
REMARKS:所見(駄目な理由)
MEMO:メモ、備考

で、コレともう一つ許可する用の機構を作っておくといいです。

例えばわかりやすい例では
「コンサル」は「コンサルタント」と略さないで書いて欲しいのでNG_WORDに「コンサル」と追加します。
でもそうすると「コンサルタント」にも「コンサル」の文字列が入っているのでNG対象になってしまいます。

「更に」を「さらに」と日本語で統一したいのでNG_WORDに追加します。
でも「変更になります」とかのチェックにも引っかかります。

こういったことを防ぐために、NG_WORDに引っかかったけど、
この単語であればOKみたいな機構を最初から想定しておいたほうがいいです。

こういったことはどんどんシステム化していきたいですねー

今ではこんな感じでチェックできますー
(直接打っても良いし、ドラッグドロップでもいける!)

コメント

タイトルとURLをコピーしました