Docs轉PDF
在構建知識庫應用時,發(fā)現在文檔解析步驟,PDF解析(使用pdfplumber)的效果(在處理表格方面)要強于Docs文檔(使用unstructured);
分析該現象,發(fā)現一些專門文檔的解析工具包在處理文檔時的效果會優(yōu)于一些通用類的工具;
故在文檔加載階段,初步定了兩種處理方案:
- 不同文檔類型使用效果較優(yōu)的工具進行處理;
- 將非PDF文檔轉換為PDF文檔后(轉換后無法修改),進行處理;
本筆記是記錄Docs轉換為PDF的使用過程;
工具選擇
由于服務系統(tǒng)環(huán)境為Linux,故只考慮Linux環(huán)境下的工具使用
- LibreOffice
1. 安裝LibreOffice
sudo apt-get install libreoffice
2. 工具命令行方式
libreoffice --headless --convert-to pdf your_document.docx --outdir /path/to/output
3. python方式使用
import subprocess
import os
def convert_doc_to_pdf(input_path, output_dir):
# 確保輸入文件存在
if not os.path.exists(input_path):
raise FileNotFoundError(f"輸入文件不存在: {input_path}")
# 構造命令
cmd = [
"libreoffice",
"--headless",
"--convert-to", "pdf",
input_path,
"--outdir", output_dir
]
# 執(zhí)行命令
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"轉換失敗: {result.stderr}")
else:
print(f"轉換成功!PDF 保存至: {output_dir}")
# 示例用法
convert_doc_to_pdf("input.doc", "/tmp/output")
- Pandoc + LaTeX
1. 安裝依賴
apt-get install pandoc texlive-full
2. 命令行方式
pandoc -s your_document.docx -o output.pdf
3. python方式使用
import pypandoc
def word_to_pdf(word_path, pdf_path):
output = pypandoc.convert_file(word_path, 'pdf', outputfile=pdf_path,extra_args=['--pdf-engine=xelatex'])
assert output == ""
# 將Word文檔轉換為PDF
word_to_pdf("docs/test_01.docx", "pdfs/trans_test_01.pdf")
過程問題處理
- LaTeX升級到最新版本
通過apt-get安裝的版本較老,若要升級到最新版本,可通過從官網下載安裝包進行安裝,步驟如下:
a.) wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
b.) 解壓并安裝(安裝的時間比較長)
tar -xzf install-tl-unx.tar.gz
cd install-tl-*
./install-tl
PS:在安裝過程中,如果磁盤空間足夠,可以選擇安裝完整版(scheme-full),這樣會包含所有可用的 TeX Live 包;
c.) 配置PATH
echo 'export PATH=/usr/local/texlive/2025/bin/x86_64-linux:$PATH' >> ~/.bashrc
source ~/.bashrc
d.) 驗證安裝
tlmgr --version 或則 tlmgr info --list
- 執(zhí)行l(wèi)ibreoffice命令時提示錯誤
1. 錯誤信息如下:
/usr/lib/libreoffice/program/javaldx: error while loading shared libraries: libreglo.so: cannot open shared object file: No such file or directory
Warning: failed to read path from javaldx
2. 原因分析
javaldx找不到libreglo.so,查看/usr/lib/libreoffice/program/ 目錄下是否存在libreglo.so;
該目錄下已經存在libreglo.so,執(zhí)行命令 ldd /usr/lib/libreoffice/program/javaldx,發(fā)現: libreglo.so => not found
3. 處理方式
強制刷新系統(tǒng)的庫緩存:
echo '/usr/lib/libreoffice/program' | sudo tee /etc/ld.so.conf.d/libreoffice.conf
sudo ldconfig
4. 如果依舊不能執(zhí)行該命令,則
a.) 重新安裝
先清除配置文件(如果有):
rm -rf ~/.config/libreoffice
rm -rf ~/.local/share/libreoffice
再進行重新安裝:
sudo apt purge libreoffice*
sudo apt autoremove
sudo apt install libreoffice
或則
b.) 使用容器化運行(Ubuntu)
拉取鏡像:
docker pull libreoffice
運行l(wèi)ibreoffice容器:
docker run -d --name libreoffice -v /path/to/your/documents:/documents libreoffice
測試功能:
docker exec -it libreoffice /bin/bash
libreoffice --version
libreoffice --headless --convert-to pdf --outdir /documents /documents/input.docx
同時Python的使用方式修改如下:
import subprocess
container_name = "img_libreoffice"
command_to_run = ["libreoffice", "--headless","--convert-to","pdf","--outdir","/documents","/documents/test.docx"]
docker_exec_command = ["docker", "exec", container_name] + command_to_run
process = subprocess.Popen(docker_exec_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
if process.returncode == 0:
print("Command executed successfully!")
print("Output:")
print(stdout)
else:
print("Failed to execute command in container.")
print("Error:", stderr)
- pandoc轉換時,提示無法在指定的字體中找到字符
1. 錯誤信息如下:
[WARNING] Missing character: There is no 有 (U+6709) (U+6709) in font [lmroman10-regular]:mapping=t
2. 處理方式
指定引擎(xelatex)和字符集,先查看系統(tǒng)支持中文的字符集(fc-list :lang=zh);
在pandoc命令中指定字符集如: pandoc -s your_document.docx -o output.pdf --pdf-engine=xelatex -V mainfont="Noto Sans CJK TC"
python代碼如下:
import pypandoc
def word_to_pdf(word_path, pdf_path):
output = pypandoc.convert_file(word_path, 'pdf', outputfile=pdf_path,extra_args=['--pdf-engine=xelatex','-V', 'mainfont="Noto Sans CJK TC"'])
assert output == ""
# 將Word文檔轉換為PDF
word_to_pdf("docs/01.docx", "pdfs/trans_01.pdf")
print(f'deal finish!!')
## 如果總是提示"xelatex not found"則直接使用完全路徑,如:/usr/local/texlive/2025/bin/x86_64-linux/xelatex
PS:如果word文檔中的表格是合并單元格之類的復雜表格,pandoc轉換后,表格的信息可能丟失。