Программа для замены слов (переменных) в .docx файле на другие
Требуется помощь от комьюнити по достаточно нетривиальной задаче. Дело в том, что необходимо разработать одну программку, которая бы принимала на вход строку и записывала бы её вместо другой строки в word-файл (формата .docx). Грубо говоря, реализовать запись в ворд документ. Например, есть шаблон договора, где есть поле "ФИО: (и здесь какое-нибудь слово, которое надо заменить)". Пользователь вводит ФИО и соответственно эта информация попадает в docx документ. На просторах яндекса я нашёл следующий, код, он успешно читает данные с файла, однако как-то оперировать этими данными я не совсем понимаю, ведь parse_docx("hello.docx").unwrap() имеет тип данных вот такой '()'. Также как возможно реализовать замену через крейт docx-rs может с ним кто-то работал? Есть ещё один крейт, это просто docx, однако как я выяснил он не работает. Помогите кто чем сможет, а может если вы знаете простые решение на другие форматы документов, например .pdf или .rtf, то пожалуйста скажите об этом.
use std::io::Read;
use docx_rs::*;
use serde_json::Value;
fn main() {
let content = parse_docx("hello.docx").unwrap();
// let some = content.to_string();
}
fn read_to_vec(file_name: &str) -> anyhow::Result<Vec<u8>> {
let mut buf = Vec::new();
std::fs::File::open(file_name)?.read_to_end(&mut buf)?;
Ok(buf)
}
fn parse_docx(file_name: &str) -> anyhow::Result<()> {
let data: Value = serde_json::from_str(&read_docx(&read_to_vec(file_name)?)?.json())?;
if let Some(children) = data["document"]["children"].as_array() {
children.iter().for_each(read_children);
}
Ok(())
}
fn read_children(node: &Value) {
if let Some(children) = node["data"]["children"].as_array() {
children.iter().for_each(|child| {
if child["type"] != "text" {
read_children(child);
} else {
println!("{}", child["data"]["text"]);
}
});
}
}