Chuyển PDF dạng ảnh scan thành DOCX

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

Tags: ubuntu
  0 Bình luận
Chia sẻ:  

Một số lệnh thông dụng trên linux

Đăng kí nhận tin mới
Hãy để lại email của bạn, tôi sẽ thông báo với bạn khi có bài viết mới nhất.
Bạn đã không sử dụng site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây