久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Python調(diào)用LibreOffice實現(xiàn)ODT轉(zhuǎn)PDF實戰(zhàn)指南

Python調(diào)用LibreOffice實現(xiàn)ODT轉(zhuǎn)PDF實戰(zhàn)指南 上周有個朋友發(fā)來一份 ODT 文件說在 WPS 里轉(zhuǎn) PDF 后表格全部錯位問我能不能寫個 Python 腳本穩(wěn)定搞定。這個問題其實特別典型ODT 轉(zhuǎn) PDF 在辦公自動化里天天遇到但很多人只會改后綴名、用在線轉(zhuǎn)換網(wǎng)站文件一多要么格式崩要么隱私泄露。我自己在幾個項目里折騰過各種方案踩了不少坑今天把這套實戰(zhàn)經(jīng)驗完整捋一遍。內(nèi)容圍繞 Python 調(diào)用 LibreOffice 命令行實現(xiàn)文檔轉(zhuǎn)換也會聊到純 Python 庫的局限性、批量并發(fā)處理的正確姿勢、Web 服務(wù)里怎么用才不把進(jìn)程卡死。適合正在搭建文檔處理管線的 Python 開發(fā)者也適合辦公自動化剛?cè)腴T、想少走彎路的朋友。真正要做的是渲染而不是改名ODT 內(nèi)部是一堆 XML 和資源文件打包成的 ZIPPDF 則是排版引擎把每個字符、圖片、表格按固定坐標(biāo)繪制出來的結(jié)果兩者之間必須有一個軟件真正打開文檔、計算分頁、導(dǎo)出 PDF。LibreOffice 就是干這個的最可靠選擇而且它提供了無需圖形界面的命令行模式非常適合被 Python 腳本調(diào)用。1. ODT 轉(zhuǎn)換 PDF 的本質(zhì)為什么看起來簡單卻問題不斷1.1 改擴(kuò)展名和真正導(dǎo)出的區(qū)別先回答一個很多人問過的蠢問題把document.odt直接重命名為document.pdf會怎樣答案是不會怎樣雙擊打開 PDF 會報錯。原因在于 ODT 和 PDF 的文件結(jié)構(gòu)完全不同。ODT 本質(zhì)是一個 ZIP 壓縮包里面裝著content.xml、styles.xml、meta.xml和一堆圖片資源而 PDF 至少包含對象樹、內(nèi)容流、交叉引用表等結(jié)構(gòu)需要由渲染引擎繪制出來??梢灶惐瘸勺霾薕DT 是一份菜譜和一堆食材PDF 是最終端上桌的成品菜肴。重命名只是給菜譜貼了個成品的標(biāo)簽并沒有人真正烹飪。真正的轉(zhuǎn)換必須由某個軟件打開 ODT解析樣式、計算文本流的換行與分頁、確定圖片位置、處理表格寬度再調(diào)用字體渲染引擎輸出頁面。LibreOffice、OpenOffice、ONLYOFFICE 這類辦公套件內(nèi)置的就是這個能力。1.2 市面上能得到的三條路線從 Python 的角度出發(fā)想要把 ODT 轉(zhuǎn)成 PDF可選的路線大致三條調(diào)用 LibreOffice/OpenOffice 命令行最成熟、保真度最高能處理復(fù)雜的頁眉頁腳、樣式、圖表。LibreOffice 提供 headless 模式無界面后臺運行適合服務(wù)器。用純 Python 庫解析 ODT 并自己生成 PDF比如odfpyreportlab理論上可行但實現(xiàn)成本極高只適用于極簡純文本文檔。調(diào)用在線轉(zhuǎn)換 API上傳文檔然后下載結(jié)果適合不要求隱私、偶爾轉(zhuǎn)換的個人場景不適合批量自動化因為網(wǎng)絡(luò)傳輸慢、文件大小受限、還有數(shù)據(jù)泄露風(fēng)險。我的選型結(jié)論很直接只要條件是穩(wěn)定、私有化、可控就選 LibreOffice 命令行。下面所有方案都圍繞這條路展開。1.3 為什么第一個推薦是 LibreOfficeLibreOffice 是自由開源的辦公套件它的 Writer 組件原生支持 ODT 格式也就是說 ODT 是它自己的文件格式。用自己最熟悉格式的軟件去轉(zhuǎn)換錯誤率自然最低。它提供soffice命令可以通過--headless --convert-to pdf直接批量轉(zhuǎn)換不彈窗、不需要登錄、不依賴網(wǎng)絡(luò)。GitHub 上很多文檔轉(zhuǎn)換項目最終都退回到這個方案道理就在這。2. 環(huán)境準(zhǔn)備Python 環(huán)境、LibreOffice 安裝和版本兼容性坑2.1 Windows 系統(tǒng)下安裝與配置Windows 下安裝 LibreOffice 很簡單去官網(wǎng)下載最新安裝包安裝時一直下一步就行。安裝完成后重點注意soffice.exe的路徑默認(rèn)在C:\Program Files\LibreOffice\program\soffice.exe有些版本也存在于C:\Program Files (x86)\LibreOffice\program\soffice.exe。建議把這個目錄加到系統(tǒng) PATH 環(huán)境變量里否則 Python 每次調(diào)用時都要寫絕對路徑腳本換一臺機(jī)器就廢了。添加 PATH 的方式右鍵此電腦 → 屬性 → 高級系統(tǒng)設(shè)置 → 環(huán)境變量 → 在系統(tǒng)變量里找到 Path → 編輯 → 新建 → 粘貼安裝目錄 → 確定。然后在新的命令行窗口里輸入soffice --version如果顯示版本號說明配置成功。如果提示找不到命令多半是環(huán)境變量沒生效重開終端或者直接用絕對路徑。這里有個容易忽略的點LibreOffice 有 32 位和 64 位兩種版本但 Python 的subprocess調(diào)用并不關(guān)心位數(shù)只要系統(tǒng)能運行對應(yīng)程序即可。不過建議和操作系統(tǒng)位數(shù)一致避免某些第三方組件不兼容。2.2 Linux 系統(tǒng)下的安裝與字體坑Linux 服務(wù)器上安裝一般用 apt/yum。Ubuntu/Debian 上我通常只安裝 Writer 組件減小體積sudo apt update sudo apt install -y libreoffice-writer如果嫌依賴解析麻煩也可以直接sudo apt install -y libreoffice會裝全家桶但磁盤占用多幾個 GB。瘦身黨可以裝libreoffice-core再加libreoffice-writer不過新手還是建議裝完整版省得缺組件后排查半天。裝完檢查soffice是否符合預(yù)期which soffice通常輸出/usr/bin/soffice。Linux 上最大的坑是字體。服務(wù)器不帶圖形界面通常也不裝中文字體導(dǎo)致轉(zhuǎn)換出來的 PDF 中文全是方框或亂碼。我踩過不止一次。解決辦法是安裝中文字體包sudo apt install -y fonts-noto-cjk裝完可以用fc-list | grep -i noto驗證。實際演示時我還專門寫過一段代碼檢查系統(tǒng)中文字體是否存在后面會給出。2.3 macOS 上的一行命令macOS 上用 Homebrew 最方便brew install --cask libreoffice安裝后可執(zhí)行文件路徑不是直接soffice而是/Applications/LibreOffice.app/Contents/MacOS/soffice建議在.zshrc里加一行 aliasalias soffice/Applications/LibreOffice.app/Contents/MacOS/soffice另外 macOS 會要求首次運行白名單授權(quán)如果在服務(wù)器上以launchd方式跑注意給足夠權(quán)限。3. 方案一subprocess 調(diào)用 LibreOffice 命令行的完整解讀3.1 基礎(chǔ)命令結(jié)構(gòu)與參數(shù)語義LibreOffice 的命令行轉(zhuǎn)換核心長這樣soffice --headless --convert-to pdf --outdir /output/path /input/file.odt四個關(guān)鍵參數(shù)逐一解釋--headless無頭模式不啟動圖形界面。服務(wù)器上必須加否則會因為沒有顯示器直接報錯。--convert-to pdf指定輸出格式為 PDF。LibreOffice 內(nèi)置導(dǎo)入過濾器會自動根據(jù)目標(biāo)格式調(diào)用 Writer 導(dǎo)出。--outdir /output/path指定輸出目錄。值得注意的是如果不加--outdir生成的 PDF 會放在輸入文件所在目錄并覆蓋實際測試并不會覆蓋原 ODT只是在旁邊生成同名 PDF。但為了保險我始終顯式指定--outdir。/input/file.odt輸入文件完整路徑。路徑中不能有不符合編碼的字符否則轉(zhuǎn)換會靜默失敗。還可以更精細(xì)地指定 PDF 過濾器參數(shù)例如soffice --headless --convert-to pdf:writer_pdf_Export:{SelectPdfVersion:{type:long,value:17}} test.odt這段的意思是使用writer_pdf_Export過濾器并設(shè)置 PDF 版本為 1.7值為 17 表示 PDF/A-1a需要注意不同版本枚舉不同。日常轉(zhuǎn)換不需要這種級別但當(dāng)你需要控制 PDF/A 屬性、壓縮質(zhì)量、字體嵌入策略時就需要研究過濾器選項了。一般默認(rèn)參數(shù)已經(jīng)夠用。3.2 Python 調(diào)用代碼示例正確處理路徑、輸出和退出碼Python 里用subprocess調(diào)用時最忌諱用shellTrue拼字符串因為路徑里的空格、中文、引號會讓命令直接卡殼。正確做法是把命令參數(shù)寫成列表由subprocess自行處理轉(zhuǎn)義import subprocess import os import sys def odt_to_pdf(input_path: str, output_dir: str) - str: input_path os.path.abspath(input_path) output_dir os.path.abspath(output_dir) os.makedirs(output_dir, exist_okTrue) cmd [ soffice, --headless, --convert-to, pdf, --outdir, output_dir, input_path ] result subprocess.run(cmd, capture_outputTrue, textTrue, timeout120) if result.returncode ! 0: raise RuntimeError(f轉(zhuǎn)換失敗: {result.returncode}\n{result.stderr}) base os.path.splitext(os.path.basename(input_path))[0] pdf_path os.path.join(output_dir, base .pdf) if not os.path.isfile(pdf_path): raise FileNotFoundError(fPDF 文件未生成: {pdf_path}) return pdf_path幾個細(xì)節(jié)說明capture_outputTrue用于捕獲 LibreOffice 的 stdout 和 stderr方便排查問題。textTrue把輸出解碼為字符串否則是 bytes。timeout120防止轉(zhuǎn)換幾十頁的大文檔時進(jìn)程掛死。如果轉(zhuǎn)換超時subprocess.run會拋出TimeoutExpired外層捕獲后應(yīng)該殺掉殘留 soffice 進(jìn)程這點在并發(fā)場景尤為重要。returncode非零時拋出異常是常規(guī)操作。但你一定會遇到returncode 為零但 PDF 沒生成的情況比如輸入文件損壞、字體缺失時 LibreOffice 可能只輸出一條警告仍然返回 0。所以生成后檢查 PDF 文件是否存在非常有必要。3.3 同名文件覆蓋與特殊字符問題LibreOffice 在輸出目錄下生成與輸入 ODT 同名的 PDF。如果目標(biāo)目錄已經(jīng)存在同名 PDF新轉(zhuǎn)換會直接覆蓋舊文件不會有任何確認(rèn)提示。這個行為在批量重復(fù)轉(zhuǎn)換時反而省事但如果你希望保留歷史版本要自己在腳本里處理沖突比如按時間戳重命名。文件名里如果帶有、(,),[,],#等特殊字符subprocess 列表形式不會有問題因為沒經(jīng)過 shell 解析。但如果路徑里包含非 UTF-8 編碼的字符比如從某個舊 Windows 系統(tǒng)拷過來的 GBK 文件名Python 側(cè)就可能先報編碼錯誤這通常不是 LibreOffice 的問題而是操作系統(tǒng)文件名編碼不統(tǒng)一。生產(chǎn)環(huán)境中最好在入庫時就把文件名統(tǒng)一成 ASCII 或規(guī)范 UTF-8。3.4 高頻典型問題用戶配置文件鎖導(dǎo)致的間歇性失敗這個坑幾乎每個用 LibreOffice 做并發(fā)的團(tuán)隊都會遇到。LibreOffice 首次啟動會創(chuàng)建一個用戶配置文件目錄Windows 在%APPDATA%\LibreOffice\4\userLinux 在~/.config/libreoffice/4/user。當(dāng)你連續(xù)調(diào)用好幾個soffice進(jìn)程時它們會爭搶這個配置文件導(dǎo)致報錯信息類似Error: source file could not be loaded或者The lock file ... already exists, another LibreOffice process is using it實際上文件本身沒問題純粹是并發(fā)沖突。解決辦法是在每次調(diào)用時給 LibreOffice 一個獨立的臨時配置目錄soffice -env:UserInstallationfile:///tmp/lo_profile_123 --headless --convert-to pdf ...這樣每個進(jìn)程用獨立的 profile互不干擾。Python 里可以用進(jìn)程 ID 或隨機(jī)字符串拼一個唯一路徑import tempfile profile_dir tempfile.mkdtemp(prefixlo_profile_) cmd [ soffice, f-env:UserInstallationfile://{profile_dir}, --headless, --convert-to, pdf, --outdir, output_dir, input_path ]用完最好把臨時目錄回收。后面講并發(fā)時還會專門說。4. 方案二純 Python 庫方案為什么不可靠——從一個 content.xml 實驗講起4.1 ODT 內(nèi)部結(jié)構(gòu)長什么樣為了說清楚純 Python 方案的局限我直接解壓一個 ODT 文件看看內(nèi)部結(jié)構(gòu)unzip -l sample.odt典型輸出包含mimetype content.xml styles.xml meta.xml settings.xml Pictures/1.png manifest.rdf META-INF/manifest.xml其中content.xml是正文和大部分內(nèi)容所在styles.xml保存樣式定義Pictures/是嵌入的圖片。我們可以用 Python 的zipfile讀取content.xmlimport zipfile from lxml import etree with zipfile.ZipFile(sample.odt) as z: with z.open(content.xml) as f: root etree.fromstring(f.read()) text_parts root.findall(.//{urn:oasis:names:tc:opendocument:xmlns:text}1.0/p)如果文檔只有幾段普通文字你會得到清晰的text:p列表。這給了很多新手一種錯覺把text:p里的文本提取出來用reportlab一行行畫到 PDF 不就行了4.2 解析 XML 自己畫 PDF 的五個致命傷真正動手后會發(fā)現(xiàn)任何非平凡文檔都會讓這個方案崩盤樣式繼承ODT 的文本樣式通過text:span text:style-nameT1引用樣式表中定義的字體、字號、顏色、縮進(jìn)而樣式表又有段落樣式、字符樣式、表格樣式、頁面樣式四層。要完整復(fù)現(xiàn)等于重寫一個排版引擎。字體度量PDF 繪制文本必須知道每個字符的寬度才能計算自動換行和對齊。你需要讀取系統(tǒng)字體計算每個字形寬度并處理中英文混排時的基線對齊。分頁計算ODT 文檔流是動態(tài)分頁的段落前后的分頁符、表格行跨頁、頁眉頁腳跟隨頁面樣式變化。純規(guī)則引擎很難處理 keep-next 這類 Word 處理習(xí)慣的段落控制屬性。圖片位置正文中的浮動圖片、錨定段落、環(huán)繞模式全都需要模擬 Writer 的排版邏輯。表格寬度ODT 表格列寬可以使用絕對單位、相對百分比、甚至自適應(yīng)內(nèi)容。真實世界里的表格幾乎都有復(fù)雜跨行、跨列、合并單元格純 XML 遍歷處理會寫到你懷疑人生。結(jié)論很明確除非文檔是你自己程序生成的、結(jié)構(gòu)極度受控的純文本 ODT否則不要用純 Python 庫轉(zhuǎn) PDF。這不是 Python 不行而是 Office 排版引擎本身就是巨大的工程。4.3 什么場景下純庫方案反而合適當(dāng)然純庫方案并非一無是處。如果你處理的文檔是程序自動生成的比如導(dǎo)出訂單、發(fā)票、通知函正文只有標(biāo)題、段落、一個簡單表格且你已經(jīng)完全了解 ODT 的結(jié)構(gòu)那么用odfpy讀取內(nèi)容再用reportlab生成 PDF響應(yīng)速度會更快也不會依賴服務(wù)器上安裝 LibreOffice。我的經(jīng)驗是凡是一次性轉(zhuǎn)換用戶上傳的任意 ODT 文件都不要碰純庫方案凡是你自己模板生成的 ODT數(shù)量大、格式固定純庫也許是愛。但現(xiàn)實里為了一個純文本模塊去維護(hù)兩套渲染邏輯后期成本很高。我最終還是在項目中統(tǒng)一回退到 LibreOffice。5. 方案三Windows 沒有 LibreOffice 時的曲線救國——ODT 轉(zhuǎn) DOCX 再轉(zhuǎn) PDF5.1 用 win32com 調(diào) Word 直接打開 ODT 的局限性有些公司只給開發(fā)機(jī)裝了 Microsoft Office不允許再裝 LibreOffice。此時很多同事會想著用pywin32調(diào) Word 的 COM 接口處理轉(zhuǎn)換import win32com.client import os def convert_odt_to_pdf_with_word(input_path, output_path): word win32com.client.Dispatch(Word.Application) word.Visible False doc word.Documents.Open(input_path) doc.SaveAs2(output_path, FileFormat17) # 17 表示 wdFormatPDF doc.Close() word.Quit()這個方案確實能跑通但我要說實話Word 打開 ODT 的兼容性并不好。普通的文本、圖片問題不大可一旦遇到 LibreOffice 特有的樣式屬性、頁面設(shè)置、表格邊框Word 渲染結(jié)果經(jīng)常和原文件有差異。更麻煩的是 COM 調(diào)用要求機(jī)器上有完整的 Office 許可、不允許無頭運行服務(wù)器上還會彈出奇怪的交互對話框。若非不得已不推薦。5.2 橋接五次不如原生一次為什么還是建議裝 LibreOffice也有人推出一個橋接思路先用 LibreOffice——等等既然你都裝了 LibreOffice為什么不直接轉(zhuǎn) PDF所以這個思路本質(zhì)上只在一種情況下成立你手頭既有 Word 又要保留可編輯的 DOCX需要先轉(zhuǎn)換格式再交給 Word 做二次處理。但中間轉(zhuǎn)兩次格式必然會損失部分細(xì)節(jié)浪費的時間和空間也不值得。我在實際項目里的判斷標(biāo)準(zhǔn)很簡單如果服務(wù)器允許安裝開源軟件優(yōu)先裝 LibreOffice一步到位只有當(dāng)你確定客戶環(huán)境絕對不允許安裝任何額外辦公套件、且所有 ODT 文檔都是簡單格式時才考慮win32com調(diào) Word。前者穩(wěn)定可控后者看人品。5.3 其他跨平臺替代工具ONLYOFFICE 和 Calligra 值得一提除了 LibreOfficeONLYOFFICE Desktop Editors 也支持 ODT 轉(zhuǎn) PDF而且它的排版引擎在網(wǎng)頁協(xié)作場景表現(xiàn)不錯。Calligra 是 KDE 社區(qū)的辦公套件但成熟度相對一般。服務(wù)器自動化領(lǐng)域LibreOffice 依然是命令接口最完整、文檔最多、坑最少的選擇。OpenOffice 大家也常用但它的無頭模式 API 更老新版本不開源支持下更新緩慢。除非公司強(qiáng)依賴 OpenOffice 的 UNO 擴(kuò)展否則沒必要繞遠(yuǎn)。6. 實戰(zhàn)包含圖片、表格、頁眉頁腳的復(fù)雜 ODT 轉(zhuǎn)換與異常排查6.1 準(zhǔn)備一個帶料的測試文檔并跑通為了驗證方案的可靠性我特意用 LibreOffice Writer 創(chuàng)建了一個測試文檔test_complex.odt里面包含一個三行兩列的表格其中一格跨兩列、一張嵌入圖片、打印樣式的頁眉和頁腳、標(biāo)題下面的一個無序列表。然后在虛擬環(huán)境里執(zhí)行python -c from converter import odt_to_pdf; print(odt_to_pdf(test_complex.odt, out/))輸出/abs/path/out/test_complex.pdfPDF 打開后頁眉頁腳完整圖片居中表格邊框無溢出。這個結(jié)果說明--convert-to pdf默認(rèn)導(dǎo)出已經(jīng)足夠處理大部分辦公文檔。真正復(fù)雜的部分往往不是轉(zhuǎn)換本身而是異常處理。6.2 生產(chǎn)級函數(shù)超時、臨時 Profile、錯誤號一個都不能少我整理了一份在多個項目里用過的生產(chǎn)級函數(shù)。它比上面的基礎(chǔ)版多了四件事獨立臨時配置目錄、超時后清理進(jìn)程、返回碼非零時打印完整 stderr、生成文件后校驗大小非零。import os import shutil import subprocess import tempfile def odt_to_pdf_pro(input_path: str, output_dir: str, timeout: int 180) - str: input_path os.path.abspath(input_path) output_dir os.path.abspath(output_dir) os.makedirs(output_dir, exist_okTrue) profile_dir tempfile.mkdtemp(prefixlo_profile_) try: cmd [ soffice, f-env:UserInstallationfile://{profile_dir}, --headless, --norestore, --convert-to, pdf, --outdir, output_dir, input_path ] proc subprocess.run( cmd, capture_outputTrue, textTrue, timeouttimeout ) except subprocess.TimeoutExpired as e: # 超時后嘗試清理殘余進(jìn)程 subprocess.run([pkill, -f, profile_dir], capture_outputTrue) raise RuntimeError(f轉(zhuǎn)換超時: {input_path}) from e except FileNotFoundError as e: raise RuntimeError(找不到 soffice是否安裝 LibreOffice 并配置 PATH?) from e finally: shutil.rmtree(profile_dir, ignore_errorsTrue) if proc.returncode ! 0: raise RuntimeError( fLibreOffice 返回碼 {proc.returncode}: {proc.stderr} ) base os.path.splitext(os.path.basename(input_path))[0] pdf_path os.path.join(output_dir, base .pdf) if not os.path.isfile(pdf_path) or os.path.getsize(pdf_path) 0: raise RuntimeError(fPDF 未生成或大小為 0: {pdf_path}) return pdf_path幾個小細(xì)節(jié)--norestore防止 LibreOffice 恢復(fù)上次未保存的文檔彈窗pkill -f profile_dir用于殺殘留進(jìn)程最后檢查文件大小非零很多靜默失敗能在這里被攔截。6.3 字體缺失導(dǎo)致整頁方塊的真實案例有次我在一臺干凈的 Debian 服務(wù)器上跑批量轉(zhuǎn)換所有中文文本轉(zhuǎn)出來都是□□□。逐個排查后發(fā)現(xiàn)服務(wù)器上沒有任何中文字體。fc-list輸出里只有幾個 DejaVu 字體而 DejaVu 不含中文字形。裝好fonts-noto-cjk后重新轉(zhuǎn)換中文恢復(fù)正常。這類問題最坑的地方在于LibreOffice 不會因為缺字體而報錯它只是找一個能用的字體替代替代不了就畫方框。所以轉(zhuǎn)換后的 PDF 必須做可視化抽查或至少抽樣驗證文本內(nèi)容長度。如果必須自動化檢查可以用pdftotext抽文本pdftotext out.pdf - | wc -l對比源文檔的文本量能發(fā)現(xiàn)約八成缺字問題。7. 批量與并發(fā)轉(zhuǎn)換把腳本從能用升級到抗打7.1 批量轉(zhuǎn)換的基本框架glob 失敗清單第一步先把單個轉(zhuǎn)換擴(kuò)展成掃目錄全部轉(zhuǎn)換同時保留失敗清單不要因為一個壞文件中斷整個任務(wù)from pathlib import Path def batch_convert(input_dir: str, output_dir: str): input_dir Path(input_dir) output_dir Path(output_dir) errors [] for odt_path in input_dir.glob(*.odt): try: pdf_path odt_to_pdf_pro(str(odt_path), str(output_dir)) print(fOK: {odt_path.name} - {Path(pdf_path).name}) except Exception as e: errors.append((odt_path.name, str(e))) print(fFAIL: {odt_path.name}: {e}) print(f完成成功 {len(list(input_dir.glob(*.odt))) - len(errors)}失敗 {len(errors)} 個) return errors如果要遍歷子目錄把glob(*.odt)改成rglob(*.odt)。7.2 concurrent.futures 做并發(fā)時必踩的連環(huán)坑很多人寫完串行版本嫌慢就上了ThreadPoolExecutor。結(jié)果發(fā)現(xiàn)要么崩潰要么報 profile 鎖錯誤。核心原因前面提過LibreOffice 的默認(rèn)用戶配置目錄只有一個多個進(jìn)程同時寫會沖突。解決方案有三個層級方案 A完全不并發(fā)串行跑。文件不多時最簡單不會出問題。 方案 B限制并發(fā)數(shù)為 1本質(zhì)還是串行但用線程池統(tǒng)一管理超時與異常。 方案 C真正的并發(fā)每個子進(jìn)程都指定獨立的-env:UserInstallation臨時目錄讓每個進(jìn)程擁有獨立 profile。經(jīng)過測試并發(fā)數(shù)控制在 2~4 時CPU 和內(nèi)存收益最現(xiàn)實數(shù)量再多容易內(nèi)存爆炸。代碼示例from concurrent.futures import ThreadPoolExecutor, as_completed def convert_one(item): return odt_to_pdf_pro(item, output_dir) with ThreadPoolExecutor(max_workers4) as executor: futures {executor.submit(convert_one, str(p)): p for p in input_dir.glob(*.odt)} for future in as_completed(futures): try: pdf future.result() print(成功:, Path(pdf).name) except Exception as e: print(失敗:, futures[future].name, e)注意真正的瓶頸通常在內(nèi)存。每個 soffice 進(jìn)程大約占用 200~400MB 內(nèi)存4 并發(fā)就是 1.6GB服務(wù)器只有 2GB 內(nèi)存時建議 max_workers2。7.3 在 Web 服務(wù)里避免同步阻塞和后端超時如果只是寫腳本subprocess.run阻塞沒什么問題。但放到 FastAPI 或 Flask 接口里直接同步調(diào)用會讓請求線程干等一個 180 秒的轉(zhuǎn)換。正確姿勢是使用線程池把轉(zhuǎn)換任務(wù)放到后臺執(zhí)行并限制并發(fā)數(shù)量。最簡單的示例from fastapi import FastAPI, File, UploadFile from concurrent.futures import ThreadPoolExecutor app FastAPI() pool ThreadPoolExecutor(max_workers2) app.post(/convert/odt-to-pdf) async def convert_odt(file: UploadFile): content await file.read() # 保存臨時文件調(diào)用 pool.submit(odt_to_pdf_pro, ...) # 返回一個 task_id前端輪詢?nèi)蝿?wù)狀態(tài)真正的生產(chǎn)項目里我一般不會直接在 Web 進(jìn)程內(nèi)跑 LibreOffice而是把任務(wù)丟給 Celery/Redis 隊列由獨立 worker 進(jìn)程去轉(zhuǎn)換避免 Web 服務(wù)器被打垮。如果業(yè)務(wù)量不大用線程池加信號量也夠用關(guān)鍵是千萬不要用os.system同步調(diào)用否則用戶請求線程全卡在等待上。7.4 日志、重試和統(tǒng)計的工程化套路工程化腳本還要加日志。核心信息包括輸入文件路徑、輸出路徑、耗時、返回碼、stderr 前 500 字符。出現(xiàn)失敗時自動重試一次等待 2 秒如果仍然失敗記入錯誤清單。import logging, time logger logging.getLogger(odt_converter) def convert_with_retry(path, output_dir, retries2): for i in range(retries): try: start time.time() pdf odt_to_pdf_pro(path, output_dir) logger.info(轉(zhuǎn)成功 %s - %s 耗時 %.2fs, path, pdf, time.time()-start) return pdf except Exception as e: logger.warning(第 %d 次嘗試失敗 %s: %s, i1, path, e) time.sleep(2) raise RuntimeError(f重試后仍失敗: {path})日志文件名建議按天滾動不然生產(chǎn)環(huán)境日志會巨大。8. 錯誤速查表與我的最后幾點私貨8.1 高頻錯誤速查對照表把幾年里遇到的典型錯誤整理成了表格方便直接查報錯現(xiàn)象可能原因解決方案soffice: command not foundLibreOffice 未安裝或 PATH 未配置正確安裝并配置 PATH或調(diào)用絕對路徑Error: source file could not be loaded輸入文件損壞、路徑編碼異常、實際不是 ODT檢查文件能正常用 Writer 打開統(tǒng)一文件名為 UTF-8return code 77缺系統(tǒng)基礎(chǔ)庫或字體安裝字體與依賴如libreoffice-gtk3或fonts-noto-cjk報 profile lock 錯誤多進(jìn)程并發(fā)共用用戶配置目錄每個調(diào)用使用獨立-env:UserInstallation轉(zhuǎn)換完成但 PDF 是空白的ODT 文檔內(nèi)容異常、或者過濾參數(shù)錯誤手動打開確認(rèn)文檔正常取消自定義過濾器參數(shù)中文全部是方框服務(wù)器缺少中文字體apt install fonts-noto-cjk或部署中文字體文件Python 報編碼 UnicodeDecodeError文件或 stdout 編碼不兼容 Windows使用textFalse然后按 utf-8 容錯解碼轉(zhuǎn)換耗時很長且 CPU 100%文檔含大量高清圖片或復(fù)雜表格考慮限制圖片導(dǎo)出分辨率doc 中圖片壓縮后再轉(zhuǎn)這個表不是萬能藥但覆蓋了 90% 的日常報錯。8.2 我最后想說的幾句實在話搞了幾年文檔轉(zhuǎn)換最有價值的教訓(xùn)就是不要一開始就追求并發(fā)和花哨的庫先把最小的串行鏈路跑通再不斷加防護(hù)。LibreOffice 是這里面最普通卻最可靠的工具它沒有 Python 生態(tài)那種亮眼包裝但一個soffice命令穩(wěn)定得可怕。如果你在處理 ODT 轉(zhuǎn)換時遇到格式錯亂先別急著改代碼打開 LibreOffice 人工轉(zhuǎn)一次。如果人工也一樣亂那問題就在源文檔本身不在腳本。如果人工正常而腳本生成的 PDF 亂再檢查字體和profile 鎖也不遲。另外轉(zhuǎn)換速度真的和機(jī)器性能關(guān)系極大。小文檔 1 秒內(nèi)出結(jié)果帶幾十張高清圖的文檔可能要 10 秒。批量任務(wù)上不要盲目設(shè) 120 秒超時可以按文檔大小乘以 5 再加 20 秒來動態(tài)計算。我的項目中一般做成可配置參數(shù)默認(rèn) 180 秒。最后分享一個小技巧如果你需要轉(zhuǎn)換的 ODT 是從網(wǎng)上銀行、政府系統(tǒng)導(dǎo)出的里面常帶數(shù)字簽名和只讀保護(hù)。LibreOffice 默認(rèn)模式會提示輸入密碼或跳過受保護(hù)區(qū)域。這時在命令里加一個--writer參數(shù)指定文檔類型可以繞開部分保護(hù)彈窗。具體寫法是soffice --headless --writer --convert-to pdf --outdir ...。遇到導(dǎo)入時彈密碼框的文檔不妨試試這個組合能免去不少人工介入。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
美女尤物人人操| 99色在线| 亚洲91在线| 日韩 欧美 校园一区| 无码抄逼网| 天天做天天爱夜夜爽毛片试看| 国产一区二区精品在线视频| 混色激情av| 乱伦AVxx| 欧美aaaaaaa| 91精品国产91久久福利| 国产精品免费1区2区视频| 久久久久久久久国产| 大香蕉伊在线久草麻豆天堂故事| 69人妻人人揉人人躁人人精品| 人人射人人操人人摸| 中国一级操逼视频| 十八禁啪啦拍视频无遮挡| 色y情视频免费看| 91丝袜在线播放| 国产精品69久久久久久久| 素人无码中文字幕| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 夜夜操一区二区| 久操视频免费在线观看| 国产av高清版| 最新欧美色网| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 日本免费一级AAA大片器| 久久久久久久久一区二区三区| 大香蕉综合在线| 天堂av2019| 91狠狠综合久久久久久| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 日韩亚洲中文字幕在线| 婷婷久久综合| 国产11页| 精品一区二区三区四区外站| 91性感网站| 亚州综合图片| 国产三级中文字幕粉嫩| 密臀在线视频| 熟女探花啪啪| 久久亚洲国产成人| 中文字幕奈奈美被公侵犯| 久久久久亚洲三级电影| 精品国产www久久| 亚洲国产午夜真人一级片中文字幕精品黄网站| 免费观看的黄色的网站| 激情综合亚洲| 91新在线欧美| 不卡视频一区蜜桃视频| 国产成年女黄特黄| 久久国产乱子伦精品免费女人| 密乳AV免费观看| 人妻日日干| 色欲久久综合| 欧美亚洲性爱一区二区| 97超级欧美| 一本色道久久综合亚洲二区三区| 992视频一区| 色香天天| 欧美人人AAA| 五月丁香综合啪啪| 女性91网站| 九九九九AV| 蜜乳中文字幕a在线| 九月激情婷婷| 婷婷四五区| 粉嫩AV一区夜夜嗨| A级在线视频| 欧美性爱91| 在线性黄高清免费视频| 99热99re超碰精品| 亚洲素人综合| 四虎午夜影院| 高清不卡国产| 欧美图片校园春色| 蜜乳Av成人片网站| 精品久久久久黄少妇| 日韩噜噜69| 精品久| 中文字幕奈奈美被公侵犯| 天天日天天色| 日韩本不卡视频在线观看| 91影库| 日本色婷婷| 久久久久78| www男人天堂| 久久东京伊人一本到鬼色| 色五月婷婷麻豆在| 天美av在线| 翔田千里一区二区三区奶水| 九九热免费国产视频婷婷伊人五月| 午夜精品人妻二区三区| 国产日韩欧美中文在线播放| 日韩一区二区熟女| 欧美成人性活片| 午夜一区| SS久久| 国产馆极品诱惑| 麻豆视频国产一区二区| 青青操网| 国产亚洲99久久精品熟| 亚洲精品乱码线路中文字幕| 日本东京热久久久电影| 色嗨嗨在线| 日本东京热加勒比久久| 欧洲一级性爱视频在线观看| 一区二区三区激情在线观看| 国产成人精品日本视频| 色色综合网站| 美女诱惑久久| 91成人无码| 日日摸日日碰夜夜爽视频| 极品少妇久久久久| 天美91| 淫荡网址| 国内精品久久人妻性色av| 久久久精品电影| 澳门黄片一香蕉视频| 精品蜜乳AV免费观看| 日本精品中文字幕视频| 一个国产在线综合网站| 欧美性爱一级操| 十八禁啪啦拍视频无遮挡| 九九色婷婷| 91色情黑丝搞鸡在线观看一区二区三区三州| 97色干| 亚洲高潮少妇| 少妇天堂网络| 一区二区三区麻豆| 八戒午夜福利理论片| 亚洲欧洲综合av在线| 国产免a费看黄片在线| 亚洲AV噜噜狠狠网址蜜桃动漫| 乱伦图一区| 国产激情久久久| 91在线美女| 亚洲黄a三级三级三级看三级| 蜜桃AV天堂| 青青在线视频日韩欧美| 99在线无码精品秘 入口黑人| 九九综合色| 校园春色综合色| 吊色| 亚洲另类欧美精品| 国产一区二区视频在线播放| 日韩中文字幕熟妇人妻| 亚州高清AV| 黄骗免费网站| 欧美人妻精品一区二区| 区一在线观看| 国产h小视频在线观看免费| 国产亚洲中文不卡二区| 校园春色综合| 亚洲欧美91√| 永久免费av无码网站国产app| 丁香五月天激情网站| 日韩精品三区四区| 啊啊啊男女| 草草电影院| 国产欧美日韩精品中文| 蜜臀AV成人精品蜜臀AV久久| 青娱乐黄色录像| 91在线秘 男同| 超碰精品在线| 蜜桃精品一区二区三区久在线| 色噜噜狠狠色综无码久久合欧美| 中文字幕亚洲在线一区| 天堂涩涩| 青娱乐二区免费| 欧美性爱一级操| 高树玛利亚无码流出| 久久久性少妇| 3028国产精品| 天天操天天干美女网址导航| 成人性爱av.com| 这里是精品| 清纯唯美综合| 亚洲国产无码精品首页久久久| jiujiujiujingpin| 超碰国产精品久| 超碰 97国产熟女| av2014 日韩在线中文字幕| 成人小说视频在线精品欧美| 校园春色综合色| 香蕉人欧美综合| 色九九综合| 超碰综合97在线| 一区二区三区黄色片a| 久久骚少妇| 国产真乱mangent| 97人人爱人人做人人乐| 日韩精品色呦呦| 久久久久久性爱片| 国产91av在线播放| 欧美大片一区二区三区| 约操熟妇| 青青草一区二区高清无码视频| 超碰人人超在线观看| 欧美综合网1| 日韩精品国产一区二区| 使劲用力艹少妇视频一区二区| 欧美Ⅴ性爱| 人妻天天操天天爽视频免费 | 日韩黄色一区二区三区| 97国产|免费| 婷婷色导航| 国产又粗又长视频| 热久日综合| Av手机版天堂网| 亚洲自拍欧美国产首页网曝| 国产人妖的免费的视频| 老鸭窝日丰县女人| 东京热激情视频一二三区| 亚洲有码视频二区| 裸体1区| 波多野结衣先锋影音| 久久熟女久| 亚洲中文字母在线播放| 91熟女视频| 大香蕉天天看妹子| 日韩黄色一区二区三区| 久久久久女教师免费一区| 中文字幕在线观看丝袜| 日韩av电影成人在线| 欧美青青视频| 99亚洲精品| 成人线上超碰| 美女91色黄18| 亚洲天堂,男人| 亚洲人在线成线成人| 精品无码一区二区三区| 亚洲中文sv| 9热9热综合网| 日本亚洲熟女视频| 黄片www视频免费| 欧美A√综合网| 在线观看国产黄色| 精品无码久久久久久久杏吧| 色香欲天天天天综合色| 伊人综合色网| 日韩精品黄片免费观看| 日本人妻最新在线中| 色眯眯av| 91逼逼女人91| 在线观看国产黄色| 日韩激情无码影院| 一区二区三区一亚洲中文字幕、综合区灬| 熟女欧美日韩综合婷婷| 99啪啪| 日本性爱欧美性爱| 亚洲无992tv| 亚洲素人综合| 射丝袜大香蕉| 欧美色图片91| 伊人天堂在线| 99精品久久久久久久婷婷蜜桃| 欧美日韩大香蕉| 麻豆熟妇乱妇熟色A片在线看| 色老汉色| 久久欧洲| 丝袜六区| 久久人妻视频| 韩国一级婬片A片AAAAA| 中文字幕国产| 女欧美一区二三区| 99re免费| 亚洲情色综合| 嗯嗯不要 视频| 日本孕妇孕交| 国产AV人人 夜夜人人澡| 欧美另类色图片| 国产超碰| 国人欧美精品一区二区| 青草青草久热| 性在久久久久久| AV天堂国产| 国产又黄又爽| 天天看天天日| 亚洲毛片基地专区| 男人天堂资源| 欧美97爱| 黄色大片视频在线免费看| 欧美热图99| 亚州欧美在线| 嗯嗯不要 视频| 天天综合站| 茄子社区国产精品| 伊人96在线| 亚洲97成人在线观看| 国产精品com| 九九热九九| 超碰久久.com| 亚洲色婷婷综合久久久久中文| wuyechaopeng| 欧美天天综合网版| 亚洲97| 国产强奸乱伦第1页| 极品销魂美女一区二区 | 人妻人妻天天碰| 欧美伦乱爱| 亚洲区限制级| 日本久久久精品电影| 久草久日| 女人天堂av在线播放| 久久少妇| 免费αV在线视频| 久久久久久久久久va| 国产黄色影片在线观看| 强奸乱伦Av网| 五月婷婷激情综合| 天堂精品小草| 久久视频,这里只有精品| 亚洲天堂资源| 欧美精品宗合| av在线观看不卡网站| xxx0国产在线播放| 97久久视频| 超碰97资源大奶| 少妇三P| 青青草导航在线视频| 亚洲欧美伦综合| 日韩视频精品在线观看| 亚洲精品亚洲人成人网| 成人AV素股で擦久久| 超碰欧美在线欧美| 啊啊啊啊啊好多水| 色狠狠 - 百度| 激情久久av一区av二区av| 少妇超碰在线| 日韩图区| 91丝袜在线观看| 一级片在线观看高清无码| 亚洲精品乱码久久久久久蜜桃麻豆| 中文字幕永久在线| 欧美色图 人妻| 久久久无码精品人妻二区| 精品人妻中文字幕高清| 在线观看精品国产免费| 99自拍B亚洲| 亚洲丝袜99| 欧美后入| 九九色精品| 情色五月天久久久| 色臀AV| 美女视频尤物网在线看| 天天综合在线4| 超碰无码五月97| 久久精品熟女亚洲AV麻豆软件| 欧美精品日韩久久久九| 东北女人被操| 亚洲成a人v欧美综合天堂下载| 操逼逼福利视频| 美女网站91| 九月丁香婷婷色| 亚洲av在线免费观看| 亚州大图综合色图| 久久久久久69国产一区二区| 色老汉玖玖爱| 超碰97伊人| 99re公开精品免费视频| 精品v1区| 欧美天天综合网| 高清无码国产亚洲| 91少妇通奸网站| 久久久精品中文字幕爱豆| 丝袜美腿诱惑亚洲欧美视频在线观看 | 日产狠狠干| 男人天堂网手机版婷婷| xxx0国产在线播放| 日韩啪啪啪视频| 曰韩人妻中文字幕在线| 亚洲天堂另类美腿| 久久春色| 亚洲欧美精品一区天堂久久 | 东京热熟女亚洲视频网站| 三上悠亚在线毛片91| 久久亚洲婷婷| 深爱伊人影院| 91人妻Pr| BBBBB97COM| 女人高潮大叫一级毛片| 欧美日韩妖精91com| 日韩丝袜二区| 天天日天天干天天摸天天操| 欧美亚洲日本激情在线| 美女网站黄页| 在线观看精品国产免费| 91美女视频直播| 免费看日产一区二区三区| 欧美极品色| 亚洲乱码尤物193YW| 不卡六六在线91| 国产精品探花在线| 精品少妇高潮久久| 丁香五月天堂网| 丰满人妻-区二区三区免费看 | 高清在线偷拍自拍视频| 九九热精品视频六| 久久极品一区二区| 九九九精品| 骚乳在线| 欧美日韩国产三级黄色| 国产又长又大又粗的视频| 日本三级R| 久久风骚城市人| 啊啊在线| 超碰在线91| 久久久久九九九| 亚洲人妻熟妇三十三区| 国语精品内射在线观看| 久久久555| 97日本超碰综合| 人人操,人人插| 日本超碰色精品| 国产大学生高潮在线播放| 久久久久女教师免费一区| 久久欧美按摩999| 性videos欧美熟妇hdx| 中国熟女网站| 大香蕉97久久| 国产特级毛片AAAAAA高潮流水| 久久天堂网| 丝袜美腿诱惑亚洲欧美视频在线观看| 国产丝袜欧美在线视频| 亚洲区小说| 人妻碰碰碰碰碰碰| 美国一区二区免费视频| 天天拍夜夜| 韩国三级三级BD在线| 色久桃花影院在线观看| 亚洲97在线观看| 粉嫩久久久久| 久久精品人体| 强奸乱伦大香蕉网| 欧美人与动性人交a| 岛国不卡超碰护士AV在线播放| 色色婷婷五月天| 另类TS人妖一区二区三区| 人妻少妇无码 | 久草大| 亚洲熟伦熟妇AV无码春色| 熟女91网| 老熟女熟妇| 超碰人人在线| 一区操逼日比视频| 成 人 A V免费视频在线观看| www.成人无码| 麻豆 亚洲 97| 欧美AB在线观看| a级理论午夜日本| 亚洲欧洲中文日韩女优乱码| 亚洲在线91| 人妻精品一区一区三区蜜桃91| 中文字幕亚洲欧美在线不卡| 人妻熟女字幕一区二区| 五月丁香社区婷婷日韩欧美精品影院 | 国产精品色哟哟| 六月丁丁香| 日韩精品在线观看网站| av在线观看不卡网站| 国产97亚洲| 疯操AV| 日韩欧美水蜜桃人妻| 国产视频三区四区| 中文字幕精品人妻丝袜| 日本在线一二| 亚洲五月丁香花狠狠干一区二区三区| 99热9| 日韩一区二区三区四区五区| 人妻少妇被猛烈进入中| 黄色片一区二区三区四区五区| 少妇色| 亚洲色图欧美色图另类图片| 人妻丝袜二区| 久久久久久加勒比| 人人操人人肉久久精品| 久久东京热久久| 色色九区| 成人性交免费视频| 另类欧美色| 夜夜爽夜夜操| 久久久蜜桃臀无码视频| 日韩肏逼视频| 国产JDAV无码视频在线观看| 欧美18 在线观看| 色欲天天婬色婬香WWW夜色| 午夜美女福利视频| 国产日韩无码一区二区三区久久区| 亚洲av青草久久一区二区| aa片毛片| 热久久国产| 亚州操逼图| 无码免费精品高清| 丁香啪啪| 91人人爽人人爽| 五月天伊人| 夜夜狠狠躁日日躁色视频| 双插在线| 久久精品视频一区三区小泽玛利亚| 亚洲怡春院| av2014 日韩在线中文字幕| 伊香蕉综合久久久久久久噜噜噜| 超碰成人人人爽人人爽| 色操逼网| 美女被艹尤物视频| 亚洲天堂区| 久久超碰亚洲人| 男人的天堂在线| 久9爱精品| 亚洲欧美综合| 操逼1区| 激情五月综合网| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 亚洲无992tv| 无码 黑人一区二区三区| 色噜噜人妻丝袜a∨先锋影| 久热无码| 欧美大片天天看| 国内毛片四区| ,成人免费啪啪视频| 日韩性爱再线视频| 欧美熟妇乱码在线一区| 国产精品色| 亚洲情色综合| 日本亚洲熟女视频| 91暧暧| 国产一区二区精品在线视频| 啪啪综合网| 凹凸久久人人| 啊a一区在线| 亚洲中亚日激情视频| 亚洲欧美第一页| 国产欧美岛国精品一区| 国产精品久久久久绯色| 色婷婷日韩精品一区二区三区| 大JI巴好深好爽又大又粗视频| 天天综合AV| 黄站在线免费观看| 曰韩香蕉97| 久久男人的天堂| 久久成人国产| 色狠人在线99| 大香蕉综合网| 激情专区综合| 精品国产国产AV| 国产9区| 国产综合操逼高清| 最新av在线| 久久精品国产Aⅴ| 日本在线播放不卡一区| 日韩78m视频| 日本操逼无码| 天天插天天射| 麻豆熟妇乱妇熟色A片在线看| 亚洲免费在线探花| 久久成年精品| 日本淫乱女一区二区三区视频| 色婷久久| 97在线播放| 97人人操人人摸| 国产天天看| 国内偷拍精品一区二区| 亚洲中文字幕噜噜噜久久久| 亚洲高潮影院| 成人性爱电影网| 美女网站黄页| 熟女字幕| 97在线观看免费| 日韩国产在线观看av| 九九夜精品九九在线| 美女天天干| 有码人妻系列| 日韩字幕一区| 九九热视频这里只有精品| 男女一进一出视频久久| 91暧暧| 日韩无码一级黄色av片| 九九热免费国产视频婷婷伊人五月 | 爽爽淫人网| 91综合无码| 99在线观看| 国产一二三在线视频五十路| 91在线页| 性夜影院爽黄A爽免费动漫| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 91亚洲欧洲| 亚洲国产欧美日韩人妻日中文| 日本精品五区| 久久九九一区二区三区成人| 天天操人人操狠狠插| 国产无码精品久久久久久| 97久久精品亚洲| 麻豆久久一区二区三区| 欧美激情一区二区| 亚洲精品无码成人久久久99| 狠狠干妹子| 色色婷婷五月| 超碰97久久| 久久精品72| 国产不卡免费在线视频| 亚洲 欧美 日韩另类 麻豆| 狠狠狠狠狠狠| 国产精品不卡一区二区电影| av线电影| 九月色婷婷| 国产在线综合福利网站| www.男人天堂| 婷婷丁香五月综合| 日韩兔费看黄片| 密臀国产在线| 高清视频一区| 夜夜嗷嗷一区二区| 大香蕉五月天| 乱伦熟女专区| 亚洲玖玖爱| 婷婷三区| 爆操无码| 天堂69亚洲精品中文字| 天天爱综合网| 99久久无色码| 久久国内| 97无码视频在线播放| 台湾佬中文娱乐网久久久久久久久久com| 九色婷婷| 99国产在线 精品 视频| 综合久久2017| 人人操人人射人人干| 亚洲色图激情小说| 肉嘟嘟www视频在线观看高清| 欧美日韩中文视频播放| 麻豆区久久久久亚| 精品国产99| 色五月婷婷麻豆在| 五月丁香社区婷婷日韩欧美精品影院| 91内射| 亚洲人妻久久久| 亚洲永久AV无码精品秋霞| 亚洲成人网站在线观看| 欧美另类精品xxxx| 色综合一本| 麻豆av一区二区| 很很很很操| 动漫片子网站3黄| 婷婷五月天成人网| 日本Xx性爱| 嫩草美女久久| 精品综合久久久久久五月天| 97在线/亚洲| 偷拍2020| 亚熟hd视频在线| 96AV久久久| 五月天开心网| 亚洲综合精品国产一区| 日本黄色大片一级视频免费麻豆| 国产精品扒开腿做爽爽爽视频| 精品无人区麻豆乱码1区2区图片| av东京热男人的天堂| 成人精品视频一区二区| 亚洲AV免费在线观看| 丁香五月av| 99久久婷婷国产综合| 在线可观看的黄色网址| 黑人操一区二区| 日韩无码操逼片| 国产一区二区三区高清视频| 人人操欧美风骚| 超碰九7| 久久东京热久久| 91N综合网| 天天色综合影视网| 国产97av| 91狠狠综合久久| 91N综合网| 久久久555| 熟妇人妻丰满久久久久久久无码| 亚洲无码一区成人免费午夜| 欧美伊人电影| 最新制服中文第一页| 久久99九九九九6666免费观看软件| 日韩日韩日韩-国产乱码精品一区二区| 国产精品97超碰| 超碰天天去日穴| 97视频一区| 91精品导航| 大香蕉久久| 国产精品女aA片爽爽视频| 亚洲九九九| 国产精品黑人一区二区三区| 操www| 亚洲1区2区三区高清中文字幕| 人妻人人做人人澡人人爽欧美一区| AAAAAAAAA黄片| 色综合久| 日本大片日本一区二区免费高清| 精品夜夜澡人妻无码| 精品人妻一区二区三区-国产| 国产传媒日本欧美专区| 人妻少妇精品久久久| 97超碰色中文字幕| 日韩人妻无码不卡网站| 国产高清亚洲日韩一区 | 无码操逼天堂| 久久在肏| 成人蜜乳小视频网站| 伊人精品久久网站| 久久人人爽人人爽人人片Ⅴ| 色蜜AV| 欧美激情片一区二区| 国产99999久久精品| 四虎av在线| 97精品一区二区视频| 欧美黄色手机在线观看| 综合在线导航一区| 综合熟女| 97精品国产手机| 色97欧美| 三级日本一区二区三区| 精品国产www久久| 爱射综合| 中文一区在线日| 欧美91变态| 久草国产在线视频| 蜜臀av一区二区三区免费观看| 久久夜色一区二区| 深爱伊人影院| 97色伦97色伦国产欧美| 日本在线视频导航| 欧洲Au麻豆| 97操碰| 欧美自拍偷拍综合图片| 色情综合网| 伊人久久亚洲中文字幕不卡| 青草精品视频-日本久久久久网站| 免费公开人人操| 91人人爽人人爽| 色偷偷综合91久久噜噜| 性饥渴少妇av无码毛片| 天天爱天天韩国日本牛牛牛牛| 欧美久久人妻少妇一区二区| 精品人妻一区二区三区四区不卡在| 国产黄片在线免费观看| 男人天堂站| 亚洲资源一区| 国产乱码精品一区二区三区四川| 不卡码视频| 蜜臀99久| 亚洲第一在线视频| 偷拍色图| 懂色中文一区二区三区| 国内91熟女人妻丝袜天天精品视频在线 | 性色avv| 亚洲精品熟妇1区2区3区。| 国产精品毛片?v一区二区三区| 超AV色女| 1240青青草一区二区三区视频天爱| 99久久久无码国产精品性男| 亚洲污污网站| 成人97人人超碰人人| 啊啊啊啊啊啊在线看| 亚洲情色 欧美| 亚洲AV成人在线| 中文字幕av一区二区三区人妻少妇| 国产91乱伦| 日韩精品操少妇| 亚洲啪AⅤ永久无码| 少妇同性| 美女操逼A A| 婷婷激情一区二区三区俺也去| 大学生美女口爆| 99国产精品人妻人伦| 国产久久久| 玖玖视频在线资源一区二区三区| 亚洲图片91| 五月丁香影院| 蜜臀久久99精品久久久久久婷婷| 婷婷伊人| 啊啊啊爽爽| 日韩性色b| 日韩综合无码一区久久92| 亚洲天堂东京热| 懂色Av| 成人精品视频一区二区| 伊人操你| 欧美在线l亚洲| 日韩亚洲国产视频| 97操综合| 丁香五月婷婷色| 国产综合久久久麻桃个| 超碰日本97美女人妻人人玩人人爱 | 丝袜综合色图| 搞中出久久| 久久综合久色欧美综合狠狠| 久久香蕉国产线看观看猫咪av| 蜜臀中文无码午夜| 国产毛片精品一区二区色欲黄A片| 亚洲人妻精品一区二区| 久草综合京东| 国产精品永久免费10000| 骚女高跟AV在线| 无码自拍SM| 青青青青操国内视频在线| 九一屌逼| 国产精品一二三在线看| 亚洲中文字幕av | 9久久精品| 久操视频在线观看| 青女在线| 国产精品老师| 男女啪啪网站免费视频| 亚洲一区亚洲天堂| 久久综合婷婷| 一道α片欧美| 91热色| AV色天香在线| 久草网站免费在线观看| 97资源亚洲| 韩国女主播青草在线| 亚洲一本大道中文字幕无码在线| 男人的天堂免费| 天天干天天日天天射黄色片| 中文字幕av乱伦| 国产精品96| 99在线啪| 九九无码久久精品视频| 欧美性爱www免费版| 色综91| 亚洲自拍欧美色综合| 欧美另类色图片| 成人激情无码在线视频| 亚洲色图欧洲| 久久人人爽av亚洲精品天堂桃色| 黑操B| 亚洲 国产 精品一区| 大JI巴好深好爽又大又粗视频| 人妻激情在线视频| 大香蕉伊人一区在线观看| 自慰白浆在线观看| 强奸乱伦AV网址| 欧美乱欲| 中文字幕av一区二区三区人妻少妇| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 久久9免费视频| 啊啊啊啊啊在线视频| 丁香五月成人| 久久久久国产精品喷潮免费观看臀| 乱欲视频| 东京热av影院| 色偷偷超碰亚洲| 日本97久久久精品| 日韩三级一区| 在线视频日韩欧美国产| 琪琪精品免费一区二区三区 | 久久久96精品| 操死我了嗯嗯嗯| 国产精品乱人伊人网| 日韩精品一区的| 亚一综合久久久久久久久久| 五月天婷婷在线看| 91综合网站| 日韩欧美三级| 国产中午字一暮区| 91超碰碰在线| 国产熟妇一区二区| 夜夜高潮夜夜爽| 综合网欧美在线| 人人扣人人操| 国产激情av女片自拍| 国产日韩在线播放av| 午夜国产成人精品视频| 亚洲图片另类| 九九九九精品精| 精品免费囯产一区二区三区| 俺去啦自拍| 99热国产| 超碰 国产熟女精品一区| 久久视频少妇美女| 久啪| 久久久国产精品亚洲精品| 2000亚洲男人天堂| 亚洲激情色片| 欧美男人亚洲天堂| 天堂资源站| 2017天天透天天通天天擦| 中文字幕AV片| 97超碰中文| 丝袜狂射91| 人人摸人人舔一区二区| 99热国产精品| 91久久久久| 国产丁香精品露脸视频| 成人精品久久| 亚洲色图欧洲| 久久夜夜| 色视频蜜乳| 中文字幕五月婷婷免费| www.伪伪| 亚洲黄网在哪免费看| 亚洲天堂 视频你懂的| 久久婷婷色| 一区二区激情国产熟女| 91xingse| 久久精品老司| 麻豆人妻偷人精品无码视频| 青草伊人久久| 久久久久99精品成人片蜜臀| 亚州综合| 韩国免费播放一级毛片| 97在线精品观看视频| 久久九九视频九九视频| 欧美成人午夜免费福利785| 婷婷激情四射| 后入 亚洲 美女 射| 自拍视频大全亚洲专媒视频/一区二区三区 | 中文字幕啊啊啊在线观看视频| 夜夜夜久久| 97免费视频网| 欧美色图自拍| 97久久网| 久久东京伊人一本到鬼色| 国产精品久久久久无码AV会牛| 99热最新| 综合 青草 伊久久 影院 综合| 91少妇香蕉久久精品| 欧美黑人与女人91| 一区二区三区美女超清| 青娱乐国产盛宴视频| 黄污污污污| 久久久久七视频| 素人伊尹大香蕉免费下载视频| 亚洲熟女av中文字幕| 亚洲熟女精品| 久久人妻精品| 欧州激情视频在线一区二区| 加勒比无码毛片| 激情综合婷婷| 少妇天堂网络| 91无码人妻精品一区二区三区蜜桃| 国产深喉视频一区二区| xxx0国产在线播放| 97色冈| 伊人午夜福利视频| 国产精品美女久久久久久网站| 久久精品店| 台湾佬中文娱乐自偷自拍| 91网站在线播放| aaa亚无码专区| 3p国产色噜噜一区| 无码视频一区二区| 色臀AV| 一级特级aaaa毛片免费观看| 国产精品久久久视频| 亚洲交换| 国产一级137片内射麻豆| 五月丁香色婷婷| 亚洲视频二区 | 亚洲97在线观看| 国产一级做a爰大片免费久久| 艳美熟妇先锋一二三区| 成人日本片久久久蜜桃| 欧美成人A天堂片在线观看| 校园春色制服丝袜中文字亚洲| 午夜精品久久久久久久| 日韩精品字幕| 欧美不卡在线美女| 欧美综色欧| 色哟哟511老熟女| 亚洲日韩青青草色月| 亚州综合在线| 亚洲AV成人在线| 亚洲诱惑天堂| 亚洲?V无码专区在线电影| 91久精品| 色妺妺AⅤ| 婷婷精品| 尤物视频新赏网鲜网色诱网| 免费一级黄色录像影片| 国产AV天美| 东京热一区二区中文字幕| 九九九九久久久| 91制服丝袜| 国产精品亚洲美女久久久久| 欧美韩日精品资源| 亚洲国产一区二区入口| 久久久熟妇熟女国产| 婷婷av在线中文字幕| 日韩99神马视频播放片在线播放| 女生久久网| 很很干很很操| 神马麻豆福利院| 大香蕉亚洲中文| 欧美丝袜中文字幕07在线| 大香蕉综合在线| 有码专区最新中文字幕有码| **一级毛片国产| 欧日韩一二三f区| 最近的最新的中文字幕视频| 97chaopenrihan| 日本道久久综合色色| 青青草好吊| 天美麻花大全视频| 天天夜夜rb| julia高潮后不停追击中出| 嗯嗯不要视频| 麻豆天美久久91| 超碰97人妻免费在线| 性生活久久久久久久久久| 免费a级毛片av无码久久精品中文字幕| 日韩av熟女一区二区三区成人| 日本阿v天堂在线观看| 欧美久久毛片基地| 国产成年女人免费视频播放a| 亚洲无限观看| 黄片www.| 午夜爽爽爽| 久九干| 人人看人人爰人人操| 久久噜| 99热最新| 高清有码一区二区| 香港日本韩国人妇99www.wccm20| 黄色网址在线免费观看| 欧美视频一区二区三区| 欧美另类色图片| 精品国产乱码| 天天性射网| 天堂蜜桃无码视频一区二区| 在线有码中文字幕| 久久成人午夜狠狠| 五月天伊人| 欧美精品23| 丝袜天堂网| 亚码激情| 999亚洲国产视频| 淫纸中9区| 蜜奶av| 中国国国产一级特黄毛片| 欧美色干| 97爱b| 亚洲欧美精品91| 日本黄色精品专区网站| 精品9999| 殴美性色a级欧美| 免费公开人人操| 国产精品久久久久婷婷二区次| 五月天综合网| 九热视频| 黑人白女精品一区| 上床啊啊啊| 骚熟女吞| 开心激情站| av在线一区二区三区| 无码人妻一区二区三区免费九色| 9精品久久| 粉嫩国产精品久久粉嫩| 久久成人午夜精品影院| 少妇综合| 福利天天都操| 国产精品视频播放| 五月婷婷丁香六月| 日韩人妻播放| 91福利网在线观看| 欧日韩一二三f区| 欧美91精彩| 欧美少妇一区二区三区| 色狠狠色| 人妻大相焦在线| 中文字幕高清20页视频| 中文字幕精品资源在线| 妇女性内射冈站HDWWWCOM| 大香蕉线| 五月天精品| www被窝色com| 久久九九一区二区三区成人| 激情文学网伊人| 欧美一区二区亚洲天堂| 免费αⅴ在线观看| 操逼无码操逼| 青娱乐啪啪视频| 97亚洲色图| 久久久国产护士丝袜美腿一| 日日橹狠狠爱欧美超碰| 啊啊啊啊啊啊在线看| 激情婷婷五月天| 免费av大片| 温婉少妇玩3p| 欧美一级久久久久久久大片动画| 精品九九九| 啊啊啊爽爽| v91av| 青青草大香蕉视频| 综合网亚洲1| 北野未奈加勒比av| 日韩图区| 九九九九免费高| 成人热久久精品| 综合网欧| 岛国人妻少妇av在线观看| 免費人妻夜夜爽天天爽爽一区| 国产欧美伊人| 91亚洲人电影| 91欧美高清| 激情文学网伊人| 中文字幕啊啊啊在线观看视频| 亚洲欧美精品91| 五月综合色| 日韩AV片| 神马视频久久久久久| 亚洲 欧美 中文 日韩超碰| 欧美午夜精品久久久久久3D| 亚洲色吧网| 精品四五区| 99999精品成人| 日韩ab网| 亚洲污污网站| 吊色| 亚洲色婷婷综合久久一区二区三区| 亚洲有薄码区久久在线一区| 少妇九九九九| www欧美91| 99无码狠狠久久| 欧美性爱第一页久久| 乱伦色图网址是多少| 中文字幕一区二区三区高清| 国产精品欧美日韩久久| 国产精品爽爽va在线观看98| 996热| 97视频观看| 久久、1234| 欧美日韩亚洲电影| 夜夜高潮夜夜爽国产伦精品| 视频二区美腿制服人妻欧美| 欧美亚洲综合高清在线| 玖玖爱在线视频免费观看| 性爱Av免费| 日韩中文字幕在线视频观看| 三级三级三级日本99| 后入人妻一区| 欧美色图人妻| 91中出视频| 囯产精品久久久久久久久久梁医生 | 亚洲人妻色图| 国产高清成人免费视频| 亚洲天堂一区二区久久| 九九黄色视频在线观看| 欧美|91色综合| 亚洲97P| 日韩青久久| 97亚洲综合| 免费亚洲黄色视频在线观看| 超碰人人草| 在线视频一区二区传媒| 最新9久久久9免费视频| 夜夜精品视频| 综合久久久久久久综合网| 99热91| 自拍欧美| 蜜臀久久99精品久久久久久成人小说 |