Hướng dẫn này dành cho người có kinh nghiệm về linux
Cài các thư viện cần thiết nếu chưa có
apt install tesseract-ocr tesseract-ocr-vie
apt install poppler-utils
apt install libreoffice
apt install imagemagick
Chuyển đổi
Bước 1: Chuyển các trang trong tệp pdf thành từng file ảnh sau đó dùng Tesseract để OCR sang tệp txt
pdftoppm sgv.pdf page -png
for img in *.png; do
tesseract "$img" "${img%.*}" -l vie
done
Bước 2: Chuyển từng trang thành tệp docx sang đó nén lại thành tệp zip. Mỗi tệp docx bên trên là ảnh của trang đó, bên dưới là nội dung dạng text, bạn có thể mở lên copy text để đỡ phải gõ lại.
Tạo và chạy tool bash convert.sh
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
TARGET="$(readlink "$SOURCE")"
if [[ $TARGET == /* ]]; then
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
SOURCE="$DIR/$TARGET"
fi
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
cd "$DIR/"
DIR_PATH=$PWD
echo "$DIR_PATH"
DIRZIP="sgv"
# Tạo thư mục đầu ra nếu chưa có
rm -rf "${DIR_PATH}/$DIRZIP"
rm -rf "${DIR_PATH}/output"
mkdir -p "${DIR_PATH}/output"
rm -f "${DIR_PATH}/"*.html
rm -f "${DIR_PATH}/"*.docx
rm -f "${DIR_PATH}/"*.odt
# Vòng lặp qua tất cả các tệp từ 01 đến 96
for i in $(seq -w 1 206); do
# Tên tệp ảnh và tệp văn bản
img_file="page-${i}.png"
txt_file="page-${i}.txt"
temp_file="page-${i}.html"
odt_file="page-${i}.odt"
output_file="page-${i}.docx"
# Kiểm tra xem tệp ảnh và tệp văn bản có tồn tại không
if [[ -f "${DIR_PATH}/$img_file" && -f "${DIR_PATH}/$txt_file" ]]; then
base64_string=$(base64 -w 0 "${DIR_PATH}/$img_file")
# Tạo tệp HTML tạm thời chứa ảnh và văn bản với font Times New Roman
echo "<html><body style=\"font-family: 'Times New Roman', serif;\">" > "${DIR_PATH}/$temp_file"
echo "<img src=\"data:image/png;base64,${base64_string}\" style=\"width: 680px; height: auto;\">" >> "${DIR_PATH}/$temp_file"
echo "<pre style=\"font-family: 'Times New Roman', serif;\">" >> "${DIR_PATH}/$temp_file"
cat "${DIR_PATH}/$txt_file" >> "${DIR_PATH}/$temp_file"
echo "</pre></body></html>" >> "${DIR_PATH}/$temp_file"
# Chuyển đổi tệp HTML tạm thời thành tệp ODT bằng LibreOffice
libreoffice --headless --convert-to odt --outdir "${DIR_PATH}/output" "${DIR_PATH}/$temp_file"
if [[ $? -gt 0 ]] || [[ ! -f "${DIR_PATH}/output/page-${i}.odt" ]] ; then
echo "--convert-to odt error"
exit
fi
# Tiếp tục chuyển ODT thành DOCX
libreoffice --headless --convert-to docx --outdir "${DIR_PATH}/output" "${DIR_PATH}/output/$odt_file"
if [[ $? -gt 0 ]] || [[ ! -f "${DIR_PATH}/output/page-${i}.docx" ]] ; then
echo "--convert-to docx error"
exit
fi
# Đổi tên tệp đầu ra thành page-XX.docx
mv "${DIR_PATH}/output/page-${i}.docx" "${DIR_PATH}/$output_file"
# Xóa tệp HTML tạm
rm "${DIR_PATH}/$temp_file"
rm "${DIR_PATH}/output/$odt_file"
echo "Đã tạo $output_file"
else
echo "Bỏ qua page-${i}: không tìm thấy tệp ảnh hoặc tệp văn bản"
fi
done
mkdir -p "${DIR_PATH}/$DIRZIP"
cp "${DIR_PATH}/"*.docx "${DIR_PATH}/$DIRZIP/"
zip -r "${DIR_PATH}/${DIRZIP}.zip" "$DIRZIP/"
rm -f "${DIR_PATH}/"*.html
rm -f "${DIR_PATH}/"*.odt
rm -f "${DIR_PATH}/"*.docx
rm -rf "${DIR_PATH}/output"
rm -rf "${DIR_PATH}/$DIRZIP"
echo "Done!"
PDF không phải là dạng ảnh
Trong trường hợp tệp PDF không phải là ảnh scan thì dùng
apt install python3-pip
pip install pdf2docx
pdf2docx convert sgk.pdf sgk.docx
Công cụ pdf2docx tương đối tốt