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

ARTICLE DETAIL

資訊詳情

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

Pdfium寬度數(shù)組解析:從字體原理到PDF文本重排實(shí)戰(zhàn)

Pdfium寬度數(shù)組解析:從字體原理到PDF文本重排實(shí)戰(zhàn) 上個(gè)月在處理一個(gè)PDF重排項(xiàng)目時(shí)我遇到一個(gè)詭異的問(wèn)題文檔只有幾十頁(yè)字符提取和坐標(biāo)獲取全部正常但只要把文本按行重排中文就全部疊在一起英文卻安然無(wú)恙。一開(kāi)始懷疑是編碼問(wèn)題后來(lái)追到最后才明白罪魁禍?zhǔn)资亲煮w里的寬度數(shù)組——準(zhǔn)確地說(shuō)是我的代碼壓根沒(méi)有讀取它。PDF在排版時(shí)對(duì)每個(gè)字符下一步位置的判斷完全建立在寬度數(shù)組之上因?yàn)槊總€(gè)字形畫(huà)完后光標(biāo)要往右推進(jìn)多少才能讓下一個(gè)字不重疊也不稀散這個(gè)推進(jìn)量就來(lái)自寬度數(shù)組。這篇文章就把我對(duì)“Pdfium如何處理寬度數(shù)組”的完整理解寫(xiě)下來(lái)包括內(nèi)部數(shù)據(jù)結(jié)構(gòu)、讀取接口的能力邊界、容易踩的單位換算坑以及拿寬度數(shù)據(jù)做二次開(kāi)發(fā)的實(shí)用技巧適合正在做PDF文本重排、坐標(biāo)標(biāo)注、版面分析或自定義渲染的開(kāi)發(fā)者參考。1. 寬度數(shù)組PDF文本定位的隱藏基石1.1 一個(gè)浮點(diǎn)偏移引發(fā)的連鎖錯(cuò)位先還原一下那個(gè)問(wèn)題的現(xiàn)象。某文檔里有一段中文和一段英文混排英文提取后按行重排位置幾乎一致中文重排后前一字的右邊緣直接壓到后一字的左邊緣整行字全部重疊。英文正常、中文異常這個(gè)現(xiàn)象本身就說(shuō)明問(wèn)題不在編碼而在字體英文大多走TrueType簡(jiǎn)單字體寬度數(shù)組在字體字典里直接可見(jiàn)Pdfium能輕松讀到中文走的是Type0復(fù)合字體CIDFont它的寬度存儲(chǔ)路徑完全不同一旦路徑斷了就會(huì)回退到默認(rèn)寬度250千分單位而中文字形的真實(shí)寬度普遍在900到1000這個(gè)范圍。實(shí)際排版時(shí)250和1000的差距一乘上字號(hào)錯(cuò)位就會(huì)變得非常明顯。為什么寬度這么關(guān)鍵我們?cè)谄聊簧峡吹降拿總€(gè)字符本質(zhì)上是“畫(huà)”上去的。畫(huà)完一個(gè)字形之后下一個(gè)字的位置由當(dāng)前字形的推進(jìn)量advance width決定。PDF的內(nèi)容流里Tj運(yùn)算符只是把一串字符放在當(dāng)前位置真正決定它們橫向間隔的是每個(gè)字形對(duì)應(yīng)的寬度數(shù)據(jù)。字體負(fù)責(zé)提供形狀寬度數(shù)組負(fù)責(zé)提供排版依據(jù)兩者缺一不可。如果寬度數(shù)據(jù)丟失或錯(cuò)誤輕則文字重疊重則整段布局被打亂連換行位置都會(huì)跟著變化。頁(yè)面坐標(biāo)、字符解析都沒(méi)問(wèn)題但重排結(jié)果錯(cuò)亂說(shuō)明問(wèn)題出在排版數(shù)據(jù)這一層——我拿到了形狀數(shù)據(jù)卻沒(méi)有把寬度數(shù)據(jù)一起帶走。這就像買(mǎi)菜譜只拿食材清單、不拿用量說(shuō)明做出來(lái)的菜當(dāng)然不對(duì)。1.2 PDF里寬度數(shù)據(jù)到底存在哪在PDF文件層面寬度數(shù)據(jù)主要藏在兩個(gè)地方一是字體字典直接嵌入寬度表二是嵌入字體文件內(nèi)部的寬度度量。簡(jiǎn)單字體Type1和TrueType通常直接在字體字典中放一個(gè)Widths數(shù)組同時(shí)用FirstChar和LastChar標(biāo)明數(shù)組覆蓋的字符編碼區(qū)間。數(shù)組下標(biāo)是從FirstChar開(kāi)始的字符編碼c對(duì)應(yīng)的寬度取Widths[c - FirstChar]。如果目標(biāo)字符不在區(qū)間內(nèi)就回退到默認(rèn)寬度簡(jiǎn)單字體里一般用字體自帶的MissingWidth或給一個(gè)固定兜底值不同解析器實(shí)現(xiàn)有差異。復(fù)合字體Type0尤其帶CID的走的是另一套結(jié)構(gòu)字體字典里先放一個(gè)DW值作為默認(rèn)寬度再放一個(gè)W數(shù)組。W數(shù)組里可以按CID區(qū)間寫(xiě)多種格式比如[3 [500 600 700]]表示CID為3的字寬度是500CID為4的字寬度是600CID為5的字寬度是700再比如[10 15 800]表示從CID 10到CID 15這六個(gè)字形寬度統(tǒng)一是800。我一開(kāi)始沒(méi)找到是因?yàn)榱?xí)慣性地只找Widths這個(gè)關(guān)鍵字忽略了Type0字體用的是W而不是Widths更忽略了那些沒(méi)有顯式寬度表、只能靠嵌入字體文件內(nèi)部數(shù)據(jù)才能拿到寬度的情形。這些差異在Pdfium內(nèi)部都有兼容處理但它兼容的結(jié)果不一定符合你對(duì)“寬度”這個(gè)概念的預(yù)期后面會(huì)詳細(xì)展開(kāi)。1.3 Glyph單位、PDF單位與像素之間的換算寬度數(shù)組里的數(shù)值不是能直接當(dāng)像素用的數(shù)字。這里有三層單位搞混了后面全是坑。第一層是字形設(shè)計(jì)單位Glyph Unit字體文件內(nèi)部用的常見(jiàn)取值有1000、2048甚至有些字體用100。這一層只在字體文件內(nèi)部有意義。第二層是PDF千分單位PDF規(guī)范規(guī)定字體寬度以千分之一em為單位也就是把1em通常等于字號(hào)大小等分成1000份寬度數(shù)組里的999表示這個(gè)字形占0.999個(gè)em。第三層才是用戶空間坐標(biāo)也就是頁(yè)面上真實(shí)使用的“點(diǎn)”。從PDF千分單位到用戶空間需要乘以字號(hào)FontSize再到像素還要乘一個(gè)DPI/72的縮放因子。單位層級(jí)常見(jiàn)范圍到下一層的換算典型場(chǎng)景Glyph Unit100 / 1000 / 2048除以u(píng)nits_per_em再乘1000讀取字體文件內(nèi)部hmtx、CFF表PDF千分單位01000左右乘以字號(hào)Pdfium寬度接口、Widths/W數(shù)組用戶空間點(diǎn)與頁(yè)面尺寸相關(guān)乘以DPI/72FPDFText_GetCharBox輸出、頁(yè)面坐標(biāo)如果走FPDFText_GetCharBox拿字符邊界框API內(nèi)部已經(jīng)幫你做完了上述換算但如果你直接操作寬度數(shù)組、自己拼排版就一定要記得在拿到原始寬度后乘字號(hào)。我之前拿重排結(jié)果跟渲染結(jié)果對(duì)比時(shí)字號(hào)越大偏差越明顯正是這個(gè)轉(zhuǎn)換漏掉了。2. Pdfium讀取寬度的內(nèi)部機(jī)制與公開(kāi)API2.1 從FPDFPage到CPDF_Font的解析鏈路Pdfium加載PDF文檔時(shí)并不是把所有字體和寬度數(shù)據(jù)一股腦塞進(jìn)內(nèi)存而是按需解析。調(diào)用FPDF_LoadDocument打開(kāi)文檔后頁(yè)面對(duì)象處于“懶加載”狀態(tài)直到調(diào)用FPDF_LoadPage這一頁(yè)的內(nèi)容流才會(huì)被解析遇到文本對(duì)象時(shí)才會(huì)定位它引用的字體資源。在這個(gè)過(guò)程中字體對(duì)象在內(nèi)部會(huì)被構(gòu)造成CPDF_Font的子類簡(jiǎn)單字體走CPDF_SimpleFont復(fù)合字體走CPDF_CIDFont。這兩個(gè)類內(nèi)部都維護(hù)了寬度相關(guān)成員。CPDF_SimpleFont里有一個(gè)m_Widths數(shù)組構(gòu)建時(shí)會(huì)把字體字典里的Widths和FirstChar/LastChar讀進(jìn)去CPDF_CIDFont則維護(hù)了類似區(qū)間映射的結(jié)構(gòu)再加一個(gè)默認(rèn)寬度字段。理解這條鏈路對(duì)調(diào)試很重要你拿到的字體對(duì)象寬度數(shù)據(jù)是否已經(jīng)就緒取決于它是否被“加載”過(guò)。某些場(chǎng)景下字體對(duì)象可能只有一個(gè)外殼內(nèi)部的寬度表還沒(méi)解析這時(shí)去查寬度會(huì)得到默認(rèn)值。一個(gè)常見(jiàn)的經(jīng)驗(yàn)是在調(diào)用渲染或文本提取相關(guān)接口之前可以先讓頁(yè)面做一次完整的渲染哪怕輸出到一張小尺寸位圖這樣字體解析邏輯基本都會(huì)走完后續(xù)讀寬度會(huì)更可靠。2.2 三個(gè)常用API的能力邊界Pdfium的公開(kāi)API里跟寬度讀取直接相關(guān)的按使用頻次排大概是這三類。第一類是FPDFText_GetCharBox它返回一個(gè)字符在頁(yè)面上的邊界框左右上下坐標(biāo)。嚴(yán)格說(shuō)這不是“寬度數(shù)組”但它包含了渲染結(jié)果層面的寬度信息是大多數(shù)二次開(kāi)發(fā)最先碰到的接口。優(yōu)點(diǎn)是已經(jīng)處理完所有單位換算直接得到頁(yè)面坐標(biāo)缺點(diǎn)是它給的是字符實(shí)際占用方框不等同于排版推進(jìn)量。如果要模擬光標(biāo)推進(jìn)用它右邊界減左邊界也可以但要注意邊界框可能包含字距調(diào)整或字形溢出跟語(yǔ)義上的advance width不完全一致。第二類是按字形ID查寬度的單字形接口。它返回單個(gè)字形在“字體空間”下的寬度這個(gè)字體空間是經(jīng)過(guò)字體內(nèi)部度量矩陣縮放后的千分單位通常等于PDF標(biāo)準(zhǔn)寬度。它的粒度比GetCharBox細(xì)適合做重排但要自己額外獲取字號(hào)并做乘法。要注意接口名在不同版本中略有變化有的版本叫法完全不同使用前先查一下你手上版本的頭文件。第三類是批量獲取寬度數(shù)組的接口能一次性把整個(gè)寬度表拉出來(lái)減少逐字符調(diào)用開(kāi)銷。注意它的語(yǔ)義是返回字體對(duì)象的原始寬度表形狀可能是稀疏數(shù)組或區(qū)間表你需要自己建立從字符編碼/CID到數(shù)組下標(biāo)的映射不能假設(shè)數(shù)組從0開(kāi)始連續(xù)排。我的建議是做快速原型用第一類做重排引擎用第三類批量接口第二類只適合臨時(shí)調(diào)試。因?yàn)橹鹱址{(diào)用的封裝和上下文切換開(kāi)銷在幾萬(wàn)字文本的場(chǎng)景下會(huì)讓性能肉眼可見(jiàn)地變差后文有具體數(shù)據(jù)。2.3 CID字體與Simple字體的寬度存儲(chǔ)差異同樣是“寬度數(shù)組”Simple字體和CID字體的存儲(chǔ)與讀取路徑差得很遠(yuǎn)把兩者搞混是新手常見(jiàn)錯(cuò)誤。Simple字體Type1、TrueType的字符編碼通常是單字節(jié)寬度數(shù)組按CharCode索引區(qū)間連續(xù)、大小固定最多256個(gè)。Pdfium構(gòu)建這類字體時(shí)會(huì)直接把Widths數(shù)組拷貝進(jìn)內(nèi)存后續(xù)可以做到O(1)查找。缺點(diǎn)是一旦字符不在FirstChar和LastChar之間就只能回退到默認(rèn)寬度很多老PDF里亂碼字符或私有區(qū)字符都會(huì)被給出一個(gè)奇怪的默認(rèn)寬度。CID字體Type0的字符編碼是雙字節(jié)起的靠CMap把CharCode映射到CID再通過(guò)字體對(duì)象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)把CID映射到寬度。寬度存儲(chǔ)是按“CID區(qū)間”組織的一個(gè)W數(shù)組可以覆蓋多個(gè)不連續(xù)區(qū)間所以Pdfium在CPDF_CIDFont里會(huì)把這些區(qū)間解析成一個(gè)索引結(jié)構(gòu)查詢時(shí)先找區(qū)間再計(jì)算區(qū)間內(nèi)偏移。對(duì)比項(xiàng)Simple FontType1/TrueTypeCID FontType0寬度表關(guān)鍵字Widths / FirstChar / LastCharDW / W索引依據(jù)CharCode單字節(jié)CID經(jīng)CMap映射數(shù)組形態(tài)連續(xù)數(shù)組長(zhǎng)度一般≤256區(qū)間表可稀疏、可重疊查詢復(fù)雜度O(1)區(qū)間查找通常為對(duì)數(shù)級(jí)常見(jiàn)遺漏默認(rèn)寬度回退W區(qū)間邊界、編碼映射不一致從實(shí)測(cè)看Simple字體的寬度查詢基本是一條直線CID字體在區(qū)間多、字形多時(shí)會(huì)有明顯的查找開(kāi)銷但Pdfium做了緩存普通文檔幾萬(wàn)次查詢差異不大。真正要留神的不是性能而是CID的獲取方式同一個(gè)CharCode在不同CMap下映射到的CID可能不同從而查到不同寬度。如果你做文本處理時(shí)拿到的“字符編碼”和Pdfium內(nèi)部用的“字符代碼”不是同一個(gè)寬度表對(duì)不上就非常正常。3. 手把手讀取寬度數(shù)組并建立緩存3.1 讀取流程與代碼骨架先給一個(gè)能跑的流程。我整理的是C環(huán)境下、不走外部庫(kù)的常見(jiàn)寫(xiě)法核心步驟是打開(kāi)文檔、加載頁(yè)面、定位頁(yè)面對(duì)象、拿到字體句柄、讀取寬度。// 1. 打開(kāi)文檔與頁(yè)面 FPDF_InitLibrary(); FPDF_DOCUMENT doc FPDF_LoadDocument(filePath, nullptr); FPDF_PAGE page FPDF_LoadPage(doc, 0); // 2. 遍歷頁(yè)面對(duì)象找第一個(gè)文本對(duì)象拿字體句柄 int objCount FPDFPage_CountObjects(page); for (int i 0; i objCount; i) { FPDF_PAGEOBJECT obj FPDFPage_GetObject(page, i); if (FPDFPageObj_GetType(obj) FPDF_PAGEOBJ_TEXT) { // 這里演示只拿第一個(gè)文本對(duì)象真實(shí)場(chǎng)景需要遍歷全部 FPDF_FONT font FPDFTextObj_GetFont(obj); // 版本差異較大以你的版本頭文件為準(zhǔn) break; } } // 3. 批量讀取寬度不同版本接口名有差異這里按語(yǔ)義寫(xiě) int widthCount 0; const unsigned int* widths GetFontWidths(font, widthCount);讀出來(lái)之后不要直接對(duì)widths數(shù)組按“字符的Unicode碼”去索引因?yàn)樗南聵?biāo)體系可能是CharCode、GID或CID取決于字體類型。我一般會(huì)再拿當(dāng)前文本對(duì)象的實(shí)際編碼信息建立一張本地映射表。如果批量接口在你的Pdfium版本里不可用退而求其次的寫(xiě)法是遍歷某個(gè)字符區(qū)間逐字符調(diào)單字形寬度接口。但這種方式在Type0字體上通常會(huì)漏掉那些“沒(méi)有顯式寬度、需要回退默認(rèn)寬度”的字符你需要額外結(jié)合DW值做兜底。3.2 Fallback分支DefaultWidth與W數(shù)組區(qū)間寬度數(shù)組天然是稀疏的做讀取時(shí)必須寫(xiě)清楚回退邏輯否則就會(huì)拿到一個(gè)“看似正常其實(shí)錯(cuò)誤”的默認(rèn)值。我用的回退邏輯是這樣double getCIDWidth(const FontWidthTable table, uint32_t cid) { // 先查CID是否落在某個(gè)W區(qū)間內(nèi) auto it table.w_interval.find(cid); if (it ! table.w_interval.end()) { return it-second; } // 不在任何W區(qū)間回退到DW默認(rèn)寬度 return table.default_width; }看起來(lái)簡(jiǎn)單但實(shí)際項(xiàng)目里兩個(gè)細(xì)節(jié)很容易翻車。第一個(gè)W數(shù)組里同一個(gè)CID可能會(huì)出現(xiàn)兩次比如某個(gè)區(qū)間的端點(diǎn)同時(shí)被下一個(gè)區(qū)間覆蓋。多數(shù)解析器按“先到先得”處理但PDF規(guī)范并沒(méi)有嚴(yán)格禁止重復(fù)我建議讀取時(shí)主動(dòng)做“后者覆蓋前者”或者至少打一條日志否則排查時(shí)很難發(fā)現(xiàn)是哪個(gè)區(qū)間生效導(dǎo)致寬度偏大或偏小。第二個(gè)DefaultWidth的默認(rèn)值。規(guī)范建議值是0還是250在Pdfium內(nèi)部CIDFont的默認(rèn)寬度往往初始化為0但如果字體字典里沒(méi)有DWPDF閱讀器通常會(huì)按固定寬度字體的慣例給一個(gè)默認(rèn)值常見(jiàn)實(shí)現(xiàn)是250。你自己代碼里回退時(shí)要注意“標(biāo)準(zhǔn)默認(rèn)值”和“解析器默認(rèn)值”可能不一樣這個(gè)差別會(huì)直接反映在字體缺失時(shí)文字的稀疏或重疊上。3.3 緩存鍵的設(shè)計(jì)字體句柄變體寬度數(shù)據(jù)在文檔生命周期內(nèi)基本不變但每次調(diào)用接口重新讀取都有開(kāi)銷所以一定要緩存。緩存鍵的設(shè)計(jì)上我踩過(guò)一個(gè)坑直接用字體句柄當(dāng)鍵。原因在于同一個(gè)PDF文檔里同一套物理字體可能以多個(gè)不同的字體句柄出現(xiàn)——頁(yè)面A和頁(yè)面B各自引用了不同資源目錄里的同名子集。它們的寬度表內(nèi)容可能完全相同但句柄不同導(dǎo)致緩存命中率上不去。反過(guò)來(lái)同一個(gè)句柄在字體加載前后內(nèi)部字段的可用性也可能變化所以更好的做法是“字體標(biāo)識(shí)名子集標(biāo)識(shí)”作為鍵。我最終用的緩存結(jié)構(gòu)是一個(gè)全局哈希表鍵是編碼后的字符串值是一份不可變的寬度表快照。大文檔幾千頁(yè)、幾萬(wàn)字體引用下這個(gè)緩存在內(nèi)存上大概能省下90%的重復(fù)解析時(shí)間效果非常明顯。緩存時(shí)還要注意線程安全Pdfium本身對(duì)并發(fā)渲染有保護(hù)但你自己的緩存數(shù)據(jù)結(jié)構(gòu)必須自己做加鎖或線程本地化否則高并發(fā)場(chǎng)景下哈希表的并發(fā)寫(xiě)會(huì)直接崩。提示緩存寬度表時(shí)盡量把“寬度來(lái)源”也一起記錄下來(lái)。是來(lái)自PDF的W數(shù)組還是來(lái)自字體文件內(nèi)部的hmtx表這個(gè)信息在排查寬度不一致問(wèn)題時(shí)價(jià)值極高。4. 寬度數(shù)據(jù)對(duì)不上的三類真實(shí)案例4.1 案例一Type3字體的FontMatrix忘乘了先講一個(gè)特征最明顯的案例。某文檔中有一段裝飾字體Type3重排時(shí)字符間距被放大了大約8倍越往后錯(cuò)位越嚴(yán)重。檢查單字符寬度是正常的千分單位數(shù)值檢查字號(hào)也取到了正確值但重排結(jié)果就是不對(duì)。后來(lái)翻到字體對(duì)象內(nèi)部的FontMatrix才明白Type3字體的寬度單位不是固定的千分之一em而是由FontMatrix定義。這個(gè)字體的FontMatrix是[0.125 0 0 0.125 0 0]也就是說(shuō)字體空間下的1個(gè)寬度單位在文本空間里只有0.125個(gè)單位。寬度接口返回的是字體空間值沒(méi)乘這個(gè)矩陣就直接用了等于把字形放大了8倍。處理方式很簡(jiǎn)單拿到寬度后先查一下該字體是否為T(mén)ype3是的話就把寬度乘FontMatrix的比例項(xiàng)。Pdfium渲染層內(nèi)部就是這個(gè)邏輯但公開(kāi)接口并不會(huì)替你完成這步因?yàn)檎{(diào)用者可能想拿原始字體空間數(shù)據(jù)做別的分析。這個(gè)案例也提醒我處理任何字體數(shù)據(jù)前先確認(rèn)它的類型和度量矩陣而不是想當(dāng)然地用一套邏輯通吃。4.2 案例二CFF/OpenType字體的隱藏寬度表另一個(gè)項(xiàng)目里我用某個(gè)工具生成的PDF做處理文檔里的中文總是比預(yù)期窄窄了大約一半。Widths數(shù)組讀出來(lái)沒(méi)有異常但字體是OpenTypeCFF子集。排查過(guò)程比較曲折。先看W數(shù)組找到了范圍和數(shù)值本身都像合理。但是把每個(gè)字符的邊界框用GetCharBox打出來(lái)對(duì)比發(fā)現(xiàn)實(shí)際渲染寬度比W數(shù)組給的寬度小很多。也就是說(shuō)W數(shù)組里的數(shù)字和渲染引擎實(shí)際使用的數(shù)字不一致。繼續(xù)追發(fā)現(xiàn)根源在字體文件內(nèi)部那個(gè)生成工具在子集化時(shí)把CFF字體內(nèi)部的實(shí)際寬度度量改了但PDF的W數(shù)組沒(méi)有同步更新。Pdfium在解析CIDFont時(shí)做了一步“嘗試用字體文件內(nèi)部度量校正寬度”的邏輯——如果字體內(nèi)部有可用的寬度數(shù)據(jù)就會(huì)覆蓋W數(shù)組里的值。這一步在不同版本里行為不一致有的版本完全不看字體內(nèi)部數(shù)據(jù)有的版本只要檢測(cè)到就使用。這個(gè)案例給我的教訓(xùn)是不要假設(shè)“Pdfium返回的寬度一定來(lái)自PDF的寬度數(shù)組”。它有自己的一套優(yōu)先級(jí)而且這套優(yōu)先級(jí)在不同版本、不同字體格式下并不統(tǒng)一。調(diào)試時(shí)如果發(fā)現(xiàn)返回值和字典里的W不一致別急著懷疑自己的讀取代碼先確認(rèn)是不是字體內(nèi)部寬度表在覆蓋。4.3 案例三子集化后PDF寬度表與字體內(nèi)部不一致和案例二類似但更隱蔽的情況出現(xiàn)在TrueType子集字體上。字體字典里的Widths數(shù)組只覆蓋了被保留的字符子集沒(méi)有覆蓋的空洞字符應(yīng)該走默認(rèn)寬度但Pdfium在某些場(chǎng)景下會(huì)返回字體內(nèi)部hmtx表中的值即使該字符沒(méi)有被子集化進(jìn)來(lái)。這會(huì)導(dǎo)致一個(gè)奇怪的現(xiàn)象同一個(gè)CharCode在頁(yè)面A和頁(yè)面B上出現(xiàn)字體句柄不同頁(yè)面A用的子集包含該字符頁(yè)面B用的子集不包含Pdfium給寬度卻是同一個(gè)數(shù)字——因?yàn)樽煮w對(duì)象內(nèi)部從hmtx里能查到但PDF寬度表里查不到。如果自己的代碼完全按“PDF寬度數(shù)組”做緩存就會(huì)出現(xiàn)部分頁(yè)面錯(cuò)位。我的處理是把“字體對(duì)象實(shí)際能提供的寬度來(lái)源”也作為一個(gè)維度記錄下來(lái)而不是只記錄寬度值本身。這樣重排時(shí)至少知道哪些寬度是可靠數(shù)據(jù)、哪些是解析器兜底必要的時(shí)候允許業(yè)務(wù)層做降級(jí)處理。5. 把寬度數(shù)組用好重排、對(duì)齊與性能優(yōu)化5.1 用累計(jì)寬度實(shí)現(xiàn)文本重排做PDF文本重排時(shí)最樸素也最實(shí)用的做法是把原頁(yè)面里每個(gè)文本對(duì)象解析出來(lái)按閱讀順序做累計(jì)寬度求和。偽代碼邏輯如下// 把一行里的字符按原有順序排列用寬度數(shù)組累加出每個(gè)字符的起始X double xCursor lineStartX; for (int i 0; i lineChars.size(); i) { lineChars[i].newX xCursor; double w getWidthForChar(lineChars[i].cid, font); // 如果是Type3記得乘FontMatrix // 如果是垂直文本這里用的是Y方向但原理相同 xCursor w * fontSize * scale; }這個(gè)邏輯對(duì)所有字體通用前提是你已經(jīng)拿到了正確的寬度。要注意的是行內(nèi)可能會(huì)出現(xiàn)多個(gè)文本對(duì)象比如一個(gè)字一個(gè)Tj中間還夾雜著TJ數(shù)組中的偏移量。如果只按“每個(gè)文本對(duì)象的第一個(gè)字符對(duì)齊”行內(nèi)字符就會(huì)錯(cuò)位。我通常的做法是先按文本對(duì)象在頁(yè)面上的坐標(biāo)排序再在每個(gè)文本對(duì)象內(nèi)部用它的起始坐標(biāo)加上累計(jì)寬度去計(jì)算每個(gè)字符的絕對(duì)位置。這樣即使原PDF把一句話拆成幾十個(gè)Tj重排后也能拼回完整的一句話。5.2 TJ數(shù)組里的偏移量與精確對(duì)齊寬度數(shù)組只解決“默認(rèn)推進(jìn)”但PDF內(nèi)容流里真正的排版還包含TJ運(yùn)算符中的數(shù)字偏移??聪旅孢@段內(nèi)容流BT /F1 12 Tf 72 720 Td [(H) 20 (e) -10 (l) 0 (l) 0 (o)] TJ ET這里的20、-10、0都是額外的字間距調(diào)整。H之后的光標(biāo)推進(jìn)等于H的寬度加上20e之后的光標(biāo)推進(jìn)等于e的寬度減10。如果只拿寬度數(shù)組累積完全忽略這些偏移最終重排出的文本會(huì)和原文的視覺(jué)密度差很多。很多初學(xué)者以為字符坐標(biāo)直接拿邊界框就完事了但在做“重排”這種需要重新生成布局的場(chǎng)景里TJ偏移恰恰是還原原作者排版意圖最關(guān)鍵的信息。Pdfium在解析內(nèi)容流時(shí)會(huì)把Tj和TJ統(tǒng)一轉(zhuǎn)成帶偏移的字符對(duì)象序列內(nèi)部是可以拿到每個(gè)字符偏移量的但公開(kāi)接口暴露得不完整。如果項(xiàng)目要求重排結(jié)果與原版“視覺(jué)上一致”就得考慮在文本對(duì)象解析層自己讀TJ數(shù)組把偏移量合并進(jìn)寬度計(jì)算。5.3 減少API調(diào)用次數(shù)與線程安全最后說(shuō)一點(diǎn)性能上的實(shí)操經(jīng)驗(yàn)。寬度數(shù)組看似是小事但在大文檔場(chǎng)景下會(huì)變成性能瓶頸。我做過(guò)一次壓測(cè)某文檔包含約22萬(wàn)字符如果用逐字形接口查寬度總耗時(shí)在單線程下接近4秒如果先批量拉取寬度數(shù)組再在本地做映射耗時(shí)可以壓到0.3秒以內(nèi)差距在13倍左右。具體優(yōu)化手段有三個(gè)。第一按字體聚合先把頁(yè)面所有文本對(duì)象按字體分組同一字體的寬度表只拉一次。第二拿到寬度表后不直接跨接口查找而是把字體內(nèi)部的CharCode/CID到寬度的映射攤平到本地容器里用O(1)查找。第三利用好Pdfium的自帶緩存同一字體對(duì)象在多次查詢時(shí)內(nèi)部其實(shí)有緩存但那是它自己的緩存不等于你的業(yè)務(wù)代碼緩存該自己建的映射還是要建。線程安全方面Pdfium從不同頁(yè)面拿到的字體句柄在并發(fā)渲染時(shí)是受保護(hù)的但如果你把字體句柄保存下來(lái)、在多個(gè)線程里同時(shí)查詢就可能踩到未定義行為。穩(wěn)妥的方案是在單線程環(huán)境下把需要的寬度表全部提取并拷貝成自己的結(jié)構(gòu)之后并發(fā)重排階段只用自己的數(shù)據(jù)不再碰Pdfium對(duì)象。最后再分享一個(gè)我養(yǎng)成的習(xí)慣接到PDF處理任務(wù)時(shí)先寫(xiě)一個(gè)十幾行的小工具把文檔里出現(xiàn)過(guò)的所有字體、字符編碼、寬度數(shù)組和實(shí)際渲染寬度拉出來(lái)打印一份對(duì)照表。有了這張表后面所有關(guān)于重排、對(duì)齊、標(biāo)注的坑都能快速定位到是字體解析層還是業(yè)務(wù)層的問(wèn)題。寬度數(shù)組看著只是PDF解析里一個(gè)不起眼的角落但它串起了字體、排版、坐標(biāo)系統(tǒng)、單位換算、緩存乃至并發(fā)安全把這塊啃下來(lái)比臨時(shí)查一百次文檔都有用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品高潮久久久无码| 91在线精品一区二区三区| 人妻天堂综合网| 九九av| 污到发麻的视频 国产| 熟女高潮合集-永久久久-成人AV| 99re99| 国产一区二区视频在线播放| 蜜桃视频一区二区三区| 激情小说亚洲色图| 在线另类| 亚洲九九视频| 日韩 欧美 另类 人妻| 国产亚洲精品美女久久久久久2021| 91麻豆va国产精品| 超碰97欧美日韩| 97碰| 色97| 久久一二三四五六七八九区区| 91欧| 欧美国产日韩高清在线| 九九九九欧美| 久草网站免费在线观看| 国产夜夜操| 欧美综合亚洲| 五月丁香拍拍激情综合三级| 97超碰天天| 欧美色道啊| 国产精品福利资源在线尤物| 日韩中文字幕熟妇人妻| 亚洲国产美女久久久久| 九九碰九九爱97超| 亚洲AO在线| 日骚逼视频| 全球成人中文在线| 台湾佬大香蕉| 中文无码一二三区| 成人精品无码| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 久热伊人99re| 欧美精品日韩久久久九| 日韩精品人妻中文字幕不卡乱码| 大香蕉伊人久久| 超碰97 线线 在现| 国产性刺激| 国产精品伦理| 久久本道| 特级毛片特黄久久免费看| 蜜桃视频一区二区三区在线观看| 亚洲精品xxx| 中文字幕日韩人妻视频一区二区三区交换夫妻 | 国产午夜在线观看| 天天看人人操屄犊摸阴| 99久久久久| 综合网91| 久草男人天堂| 天天肏夜夜肏| 亚洲av噜噜噜噜噜噜| 四虎在线免费视频| 欧美操逼一二三区| 逼逼逼逼操操操操操操操操操午夜剧场| 加勒比久久av| 伊人久久亚洲中文字幕不卡| 久久亚洲不卡| 淫荡少妇免费| 俞拍自拍| 欧美九九99久久精品| 日韩99精品视频综合区| 国产色图乱伦| 97亚洲在线| 色女免费在线观看视频网址| 人人澡人人爽人人精品| 丁香五月婷婷啪啪| 日本三级一区二区 在线| 欧美色97| 女人香蕉久久毛毛片精品| 97色论| 动漫爆乳3D奶水一区在线观看| 97精品久久| 噜噜噜亚洲精| 亚州Av天美传媒| 殴美日韩m| 色五月综合| 日韩性爱视频在线免费观看| 中文字幕高清精品一区| 香蕉国产精品麻豆亚洲欧美日韩| 東南亚性呦成人伦理资源在线视频| 亚洲男人的天堂在线看| 97超碰这里只有精品| 超硑97精品| 中文字幕在线观看丝袜| 色婷婷六月| 欧美日韩成人在线| 性站| 少妇被玩视频二三区| 久久啊哟| 久久精品老司| 男人成人黄色视频在线观看免费下载| 怡红院网站在线视频| 日韩不卡一二三四| 99这里只有精品| 欧美色图在线视频少妇| 97日亚洲欧美| 淫淫综合网| 农村少妇久久久久久久| 加勒比伊人综合| 超碰av人人人| 91国产美女丝袜足交精品视频| 性性久久| 91啪啪视频| 天天天天干| 色婷婷导航| 爱爱60秒免费视频| 亚洲爱爱视频一区二区| 91操熟女视频 | 97亚洲一区| 国产精品久久久久久9999| 中文字幕欧洲有码| 三男一女不戴套的A片| 精品国产人成在线| 大香蕉五月天| 天天色悠悠激情| 久草精品热视| 97久久国产亚洲精品超碰热| 欧洲一区二区| 奇米四色影视777久久久| 国产亚州高清国产拍精| 九九九久久久久| 欧美 日韩第一性色| 亚洲一区在线观看欧洲| 思思热在线| 国产AV人人 夜夜人人澡| 欧美亚洲特P| 国产亚洲精品久久久久小| 97人人模人人爽人人| 亚洲视频二区 | 欧美熟妇操操视频| 天堂无码精品国产久| 久久精品国产久精国产| 乱伦a片视频| www.色操逼| 成人色女网| 人人妻人人澡人人爽久久av| 色青青久久影视| 吉田爱美AV在线| 女优大全 - 91n| 精品少妇一区二区三区在线视频| 欧美男人一区| 精品无吗m| 欧美性生活综合| 久久人妻一区二区三区高清| gogogo免费高清看中国国语| 国产污视频麻豆传媒一区二区| 九九热精品| 国产免费一区二区三区最新不卡| 精品999一区二区| 五月婷婷基地| 91精片| 日日夜夜天天| 大香蕉2017| 国产亚洲精品自在线亚洲情侣| 99精品综合久久久久五月天| 久久久久久性爱片| 亚洲本色精品一区二区久久| 日韩 欧美 校园一区| 日韩熟女乱伦中出| 欧美日韩97在线| 两性色网| 91在线欧美| 夜夜高潮夜夜爽高清视频一 | 成人老鸭窝人人在线视频| 国产精品美女视频诱惑| 欧美少妇色综合| 51一区二区三区| 97超碰欧美手机在线| 九九国产| 久久精品72| 超碰视97中文| 天天综合网网欲色| 俺去俺来也在线www| 国产五码丝袜屁眼| 五月婷久久| 久久久久久网址| 91精品国产综合久久久蜜臀| 日日碰狠狠添天天爽超| 91精品人妻一品二品三品| 美腿丝袜高跟网免费视频免费视频| 在线精品福利免费播放| 好爽免费视频| 九九九九精品视频| 啊啊啊啊,啊啊好多水| 亚洲熟妇自偷自拍另欧美| 日韩亚洲国产视频| 91被操| 99热在线只有精品| 绑缚麻绳人妻寝取完整版| 日本人妻A片成人免费看片| 操婢日韩| 美女久久久| 亚洲成成熟女人综合一区二区| 黑人精品久久97| 精品国产网站| 激情综合97| 色丁香五月婷婷| 欧美成人一级免费电影| 国产精品成人福利在线| 亚洲中文字幕久久人妻| 欧美人与动性人交a| 91内射| 久久人| 中文字幕1区2区| 久久成人午夜狠狠| 99人妻碰碰碰久久久久禁片| 97er欧美性| 本道在线| 国产91 丝袜在线播放00-百度| 精品97久久| 2021国产成人精品久久| 7777奇米影视久久| 手机看片1025| 精品人妻一区二区免费蜜桃| 97色色,97综合| 蜜臀网址在线| 欧美性爱18观看| 亚洲超碰AV| 九色97| 黄呦呦在线| 青青五月天| 青娱乐福利99| 日韩免费性爱视频在线观看| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 久久97超碰| 欧美传媒| 激情小说五月天| 国产乱码精品久久久久久| 中日韩久久久免费看| 一级婬片120分钟试看| 九九综合久久| 精品999日本| 午夜毛片亚洲精品片国产久久久| 99在线无码精品秘 入口黑人| 99精品视频在线观看| 男人的天堂VA在线| 久久性爱视频99| 少妇一级无码精品| 国产熟女精品区| 国产97色在线| 欧美色偷拍| 91超级碰碰碰| 国产伊人自拍| 欧天美中出| 天堂精品| 天天干天天燥| 欧美aa一级片| 综合色99| 九月AV| 成人久久精品| 97碰久久| 色色五月丁香| 韩国女主播青草在线| 精久久久91| 国产免费一区| 无码78| jk白丝没脱就开始啪啪| 中文字幕91综合| 91精产一区二区三区| 欧美丝袜91| 中文字幕日韩精品久久| 另类图片五月| 日韩精品人妻中文字幕不卡乱码| 亚洲春色一区二区三区| 人妻精品视频一区二区| 东京热av男人的天堂| 玖玖超碰熟| 国产一级高跟丝袜| 欧美黑人与女人91~| 97操碰| 日本精品无码三级网站| 欧美精品在线观看| 亚洲色图欧美一区二区不卡| 国产精品无码av| 日韩av熟女一区二区三区成人| 中文在线视频| 午夜视频久久久久一区| 久久国99999| 国产午夜在线观看| 国产精品久久久视频| 亚州高清av| 亚洲乱色熟女一区| 久久9亚洲| 97精品视频| 婷婷五月天综合网| 91福利网在线观看| 这里是精品| 美女啊啊啊啊啊| 婷婷伊人綜合中文字幕| 国产丝袜一区二区三区| 亚洲二区精品在线观看| 蜜桃狠狠色伊人亚洲综合| 精品少妇一区二区三区在线视频| oumeisetu综合| 日本男人天堂| 亚洲丝袜色图| 亚洲欧美日韩精品久| 加勒比人妻综合| 一区二区三区视频国产免费| 综合视频91| 日韩成人无码| 国产青视频| 第四色奇米影视777| 亚洲综合 欧美| 插日本熟女视频| 97久久综合网| 欧美亚男人的天堂| 精品少妇999| 国产白丝在线| 激情四射婷婷四五月天| 91啦人妻| 熟女熟妇伦久久影院毛片一区二区 | 婷婷国产精品九区| 看日韩操逼| 久久久四区| 激情久久av一区av二区av| 亚洲色图图片| 亚州欧美在线| 大香蕉综合| 无码日韩人妻av一| 久久女人| 日韩无码第3页| 91真人天天在线| 大香蕉啪啪啪| 国模不卡| 精品国产一区探花在线观看| 日本 情色 1区2区3区| 欧美激情亚洲色图| 亚州色图第三区| 青娱乐欧美激情一区二区| 国产丁香精品露脸视频| 久久久久久久六六| 口爆欧美91| 日韩成人午夜精品久久高潮| 大香蕉五月天婷婷| 91丨九色丨国产丨人妻在线| 久久久久斤小| 久久动漫精品视频这里只有精品| 按摩中文字幕| 精品十三区| 久久人妻四季| 日韩AV一区二区三区三州三州| 精品一区二区三区蜜桃臀赵总| 亚洲一卡2卡3卡4卡乱码网站| 性爱视频免费网址| 国产精品日本无码A片| 久久免费少妇| 性生活性生大爱77AV国产| 玖玖爱伊人玖玖爱| 999久久久九九九九| 精品.99999| 欧美亚性天堂| 国产超碰国产97| 伊人久操| 国产精品探花视频| 在线观看日韩av不卡| 欧美少妇性爱网站| 91高清无码下载| 操逼操操操91| 色欲久久综合| wwwxxx日本爽| 亚洲美女色图| 天天综合网合集91| 神马久久久久久久| 天天澡天天爽日日AV| 国产精品另类一区大香蕉| 内射黑人| 亚洲熟妇综合久久久久久| 亚91网| 国模无码人体一区二区三| 思思热影视| 伊人精品久久网站| 啪啪一区| 久久五月婷| 麻豆黄色五月天| A男人的天堂| 999热日韩精品| 久久专区| 任你艹| 亚洲美女色图| 午夜福利合集| 国产在线观看91精品一区| 人人扣人人操| 黑操B| 欧美 亚洲 综合 制服 另类| 91精品91久久久久77777俄罗斯老妇姓x| www.91人妻.com| 九九伊人网| 天天舔天天日天天射| 欧美瑟综合| 又粗又长又爽在线观看| www.狠狠操| www.一本大99| 蜜臀AV午夜精品久| 97人人操人人摸人人爱| 99热最新网址| 超碰在线1234区| 老熟女搡BBBB搡BBBB视频| 综合色播| 91男人天堂网| 夜夜草我| 精品日韩中文在线| 亚洲91极品| 天天综合网日韩7799| 欧美精品成人亚洲| 蜜臀久久久99久久久久 | 中文字幕版| 国产精品第一页国产大屁股视频免费区| 精品免费视频国产一区| 97二区四区| 极品色| 男人夜色天堂ss| 色综合大香蕉| 91在线视频免费中出| 婷婷20月天青娱乐| AV不卡在线| 欧美成人综合| 秋霞蝌科网日本一区| 日本1区2区不卡视频| 另类图片综合| 久久人人看| 啊啊啊啊免费视频| 九九久久首页| 东京热男人的天堂精品| 丝袜亚洲91| 亚洲精品精品一区二区| 欧美宗合色| 黑人天8A∨高清网站| 国产成人无码啪| 色五月天AV| 26uuu性| 伊人视频| 9 9精品一区二区三区| 神马久久久久久| 天天干人妇| 97色在线视频| 欧美精品欧美精品系列| 蜜色网色哟哟| 无码操逼网| 在线看污网站| 亚洲熟女一区| 97色97好| 乱伦AVxx| 九九视频黄色片| 91插B网站| 亚洲国产剧情少妇激情| 亚洲天堂中文字| 台湾佬中文娱乐网久久久久久久久久com | 天天肏美女| 欧美成人黄网色网站| 精品久久久av无码免费| 国产后入内射| 嗯阿好爽好紧| 狠狠狠狠狠| se吧提供国产乱老熟视频胖女人 | 欧美|91色综合| www国产天美久久久| 国产精品久久久久9999小说| 美女AV一区二区| 丁香六月婷婷久久综合| 性做久久久久久久| av最新免费中文字幕| 国产亚洲精品一区二区三区| 9久9久| 操淫穴亚洲五月丁香| 国产超碰在线一区| 亚洲国产综合久久久性感熟妇| 在线观看av区| 亚洲成人一区二区精品| 嫩草在线视频| 一级片视频啪啪| 96麻豆精品一区二区三区| 啊啊啊啊啊啊啊啊要喷了| 成人热久久精品| 97露脸精品丝袜| 歐美性天天| 欧美夜夜骑视频| 日欧美色| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 男人高清无码一区二区| 午夜人人操| 国内精品嫩模A∨私拍小视频| av亚欧| 国产主播福利| 国产AAAAAABBBBB| 9国产超碰| 日韩乱伦AⅤ| 草莓精品视频在线免费观看| 牛牛操视频逼| 一区操逼| 最新啪啪视频| 吻戏激情性巴克| 97操在线| 欧洲一区二区三区免费| 99re在线视频| 男人的天堂va在线| 中文字幕三四区| 在线日韩日本亚洲国产| 国产一级内射无挡观看| 干婷婷综合网| 中美日韩毛片| 蜜臀av中字字幕网站| 超碰99热中文字幕| 日夜精品| 内射夫妻三片| 日韩黄色一区二区三区| 色色色综合网| 午夜福利在线合集| 97视频在线看| 操逼天美3区| 色999五月色| 五月丁香婷婷啪啪| 99青青草国产视频| 亚洲美女AV无码| 亚洲无码国产精品久久| 操久久久久久| 天堂亚洲精品| 日韩AV一区二区三区四四| 日韩影片中文字幕一区二区三区| 九九九九日本| 啊啊啊好大好深| 国产在线综合福利网站| 97色色视频| 欧美性天天影院| 色香欲影| 18禁精品网站在线看| 97人妻碰碰中文无码久热丝袜| 婷婷另类小说| 99热官网| 98福利在线视频| 伦激情人妻另类人妻| 亚洲久热| 亚洲双插| 中文字幕精品一区二区精| 久久国产99精品72福利| 熟妇人妻丰满久久久久久久无码| 欧美成人AⅤ大片在线观看| 97人人中文网| 大屁股人妻女教师撅着屁股| 国产欧美美女免费观看视频| 夜夜欧美 | 久久久久久九九九| 操人91| 色天天野狼综合社区| 日本性爱少妇| 国产日韩美女小穴视频网站不卡| 五十路熟女人妻一区二区在线观看| 久久99人妖视频国产| 激情婷婷丁香| 99色热国产视频精品| 国产一区二区三区不卡手机在线| 大学生美女口爆| 激情自拍 校园春色| 91色图| 97精品国产97久久久久久| 亚洲国产精品成人久久蜜臀| 熟女一区二区| 亚一综合久久久久久久久久| 亚洲国产丝袜在线观看| 岛国黄| 四虎免费看黄| 天天操天天舔| 精品欧美乱码久| 黄色成人网久久久久久| 大香蕉伊人网WWWn0n| 欧美另类精品xxxx| 久久亚州大香蕉| 大香蕉综合| 精品人妻一区二区三区四区不卡在| 天天干夜夜操网| 特污精品女优骚货黄色视频在线免费观看| 中亚av| 国产成年女黄特黄| 熟女天天干| 成人亚欧免费视频| 天天综合中文字幕 91| 日韩内射视频| 婷婷丁香五月天综合东京热| 91久久堂| 欧美后进式| 强奸乱伦亚洲第一页| 亚洲情色 自拍| 91视频观看网站| 深夜激情无码| 久久无码一区二区二三区性色| 偷拍色图| 91N五十路| 亚洲欧洲综合av在线| 在线观看视频91| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 99精品久久久久久久婷婷蜜桃| 色综合加勒比| K8久久久久| 97爱啪| 国产精品久久伊人| 人人操人人操人人操人人操人人操人人人11.CM | 久久九九综合| 女人喷水视频在线观看| 婷婷干黄色| 91日韩网站| 天天天天天天天天综合| 丁香五月天堂网| 激情小说图片亚洲首页| 国产97色在线 | 亚洲| 天美传媒av在线| 97国产天堂岛| 亚洲综合网图| 熟妇人妻一区二区| 老熟女91av| 长长久久曰曰夜夜成人网| 男女激情黄色网址| 97视频免费在线观看| 久久久久白虎| 97久操| 六月丁操逼| 丰满少妇人妻久久久久久| 蜜桃久久一区二区三区| 996热| 夜夜草网站| 亚洲黄色AV电影| 97欧美资源| 97久久久网站| 高精欧美色| 九九操久久国产免费视频| 亚洲精品国产熟女久久久| 国产精品在线一区二区| 老熟妇一区二区三区| 大鸡巴久久| 国产青青综合伊人| 91男人天堂网| 大香蕉日韩欧美| 97天天操天天干| 中文字幕人妻色偷偷久久皮 | 日韩 欧美 国产 麻豆| 夜夜操一区二区| 九九九精品色乱九九九| 大香蕉中文201| 视频不卡中文字幕| 精品成人亚洲午夜电影| 国产懂色精品国产av| 国产色呦呦| 破苞ⅩXXX性无码动漫无码| 五月丁香六月婷| 欧美成人色| 黑人精品欧美一区二区蜜桃| 91综合色噜噜| 日本 色 导航| 色综合一区二区三巨| 日韩精品怡红院| 精品人妻久久久| 天天综合网日韩7799| 95人妻爽爽人人做人人澡| 欧美三级免费伊人| 97视频新免费| 久久老女人| 一区二区三区四区免费视频| 欧美一区91大爱| 粉嫩国产精品久久久| 女优大全 - 91n| 亚洲乱色熟女一区| 人妻啊啊人妻啊| 亚洲图片偷拍欧美| 亚洲图片日本AⅤ欧美在线| 精品一区二区人妖| 96爱综合| 久久综合九色综合欧洲98| 一区三区啪啪| 婷婷丁香一区二区三区| 久久超碰网| 中国亚洲呦女专区| 久久久久9999妇女| w w w.久久精品| 精品成人av一区二区三区在线| 青久操| 性综合网| 蜜桃久久久久久久| 91爱| 五月天婷婷色| 视频二区美腿制服人妻欧美| 黑丝自慰喷水网站| 天海翼久久| 男女性感激情网站| 夜夜国产一区| 成人性爱视频在线看| 色踪合AV| 国产日逼视频| 中文字幕超碰CAO| 成人麻豆av电影网站| 超碰97最新人妻| 男人a天堂手机在线版| 精品成人女人久久| 最新啪啪视频| 好湿好紧视频| 国产一区二区三区中文字幕| 久久精品一区二区三区四区五区| 午夜福利成人免费视频| 国产精品粉嫩福利在线| 亚欧性爱在线无码| 久久蜜桃一区二区| 夜夜夜久久| 久久成人国产精品| 大乔未久88一区| 亚洲av淫乱| 日本一二区不卡| 爱爱动态120秒| 亚洲无码国产精品久久| 中文字幕av一区二区三区人妻少妇 | 亚洲av青草久久一区二区| 伊人亚洲国产一成人久久精品,久久| 91天堂网| 欧美日动态视频| 99久久久| 亚洲国产av中文字幕久久| 超碰视97中文| 婷婷色一区| 亚洲天堂中文字| 精品久久久不卡一区二区| 亚洲精品亚洲人成人网| 国产偷拍网站| 久久久久久免费电影| 精品久久久无码| 91人妻做a观看视频| 粉嫩av一区二区三区天美传媒 | 超碰97导航| 超碰97在线 欧美 国产| 国产懂色精品国产av| 欧美少妇高潮视频| 亚洲视频一二区| 日本色色色视频| 曰韩中文人妻视频| 91激情国产| 丝袜综合色图| 久久久久久久久久久久久久久性生活视频 | 97操97干| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 婷婷激情五月综合| 日本蜜桃| 久久久爆乳翘臀一线天伦理视频| 精品人妻一区二区视频| 老熟女乱伦一区| 91欧美综合| 中文字幕一区二区三区四五区| 亚洲情色在线| 欧美黄色图片| 天天欧美色| 久久本道| 天美传媒国产原创中文字幕亚洲欧美另类 | 五月色综合| 日韩性爱免费视频在线网站| 最新av网站在线观看| 亚洲国产一级黄色视频| 91亚洲欧美激情| 中文字幕一二三av| 欧美日韩亚洲天堂| 97久久综合网| 日本高清视频在线观看黄已三辽| 欧美超碰人妻97| 97超碰人操| 久久久久9999妇女| 亚洲麻豆18发?| 97少妇人妻中文字幕久久| 欧美性天天影院| 久久天堂网| 欧美日韩人妻精品系列一区二区三区| 99色热| 精品欧美老熟女一二区| 成年无码动漫av片无尽在线 | 欧美色一二三| 人妻熟女一区二区| 白嫩妹子国产骚| 超碰人妻97| 精品丰满熟妇人妻一区| 9Ⅰ超碰| 九七超碰| 91伊人久| PMv在线观看| 人人看人人爰人人操| 伊人网综合在线视频| 色成人Www精品永久观看| 一区二区三区机械有限公司| 麻豆亚洲Av成人无码一区精品| 国产日本熟女顶级一区二区三区视频 | 亚洲色图加勒比| 六月婷婷一区二区三区| 中文字幕国产| 丝袜人妻av一区二区| 一个国产在线综合网站| AV一区观看| 九九久久一区二区伦理| 日韩精品一二三四| 亚洲男人的天堂AV| 夜夜欧美| 国产亚洲精品美女久久久久久2021| 嫖老熟女A片一二三区| 麻豆2区1区天美| 久久綜合很很很| 蜜桃天美传媒AV一区二区三区| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 97综合在线观看| 91老熟女91老女人| 亚洲欧美色图小说| 色婷婷亚洲婷婷| 日本高清电影欧美色图| 婷婷8月天青娱乐| 国产一级黄色片在线观看| 狠狠操狠狠爱| 欧美日韩国产电影| 777超碰| 欧美gv在线观看| 91九九| 久夜操| 综合久久欧美| 二对二中文字幕。| 亚洲无线观看久久| 另类综合另类| 欧美在线电影| 日亚韩精品视频二区三| 中文熟女五十乱码在线| 黄色片一区二区三区四区五区| 在线无码网站| 欧色综合| a片久久久久久久久久久久 | 欧美97爱| 狠狠干综合| 综合五月天| 99日韩| 久久人妻无码毛片A片麻豆| 国内精品久久人妻性色av| 色五91| 亚州性9| 青娱乐亚洲热| 国产美女裸体秘 永久无遮挡| av午夜玫瑰| 久久双插| 在线观看精品国产免费| 日韩中文字幕精品一二三事国产精品| 日韩黄色一区二区三区| 色踪合AV| 精品性爱一区二区| 狠狠入| 婷婷综合激情| 亚洲欧美不卡线| 国产女人成人精品视频| 91制服丝袜| 大香蕉色网| 蜜乳av一区二区| 久久久熟女一区| 热热色AV| 激情综合婷婷| 国产色产精品在线观看 | 91亚洲欧美综合高清在线| 色色香蕉| 东京热综合久久一区二区| 2010男人的天堂| 人人操,人人插| 日本国产二线女色| 激情综合五月| 人妻献身系列第54部| 东京男人天堂| 中文字幕超碰CAO| 日韩 欧美 另类 人妻| 九九热精品视频六| 97色97好| 操狠狠| av日韩在线观看电影| 日本一级真人黄色性爱视频| 欧美日韩亚洲天堂网| 成视频在线观看免费看| 五十路六十路素人熟女| 国内一级精品| 亚洲91综合| 亚洲宅男天堂| 26uuu国产免费观看| 久久久国产av美女私房| 国产91美女视频| 涩涩久久精品| 99这里只有精品| 艹比视频国产精品| 日本黄色大片一级视频免费麻豆| 超碰色老头| 久久久免费高清中文视频| 大香蕉在线视频重口味毛片在线| 狠狠综合网| 色一色综合网| 无码高清国产AV| 欧美区亚洲区偷拍区| 干妹子| 色www精品视频在线观看| 日韩精品 资源| 美女自卫慰黄网站免费| 日本性爱网址| 成人七区| 中文字幕在线观看永久| 亚洲网站一区二区在线| 搡老女人老91二区| 亚欧洲日韩国产精品| 夜夜高潮夜夜爽国产伦精品| 9999久久久久| 午夜精品人妻二区三区| 久久久久久少妇| 色与欲影视天天看综合网| 78精品| 一区二区无码视频| 国产AV天美传媒一区二区三区 | 欧美日日操| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久亚洲欧美中文字幕国语| 日韩av电影成人在线| www.99色| 亚洲成人在线资源| 精品在线78| 97超碰日韩| 26uuu最新| 日韩熟女乱伦中出| 大香蕉免费乱伦视频| 久久久精品成人国产| 国产小视频91| 国产乱伦一二三区| 成人免费在线网站| 婷婷五月天av| 刺激精品视频| 美女主播色欲91抠b在线播放| 97这里都是精品| 欧美日韩亚洲少妇寂寞影院正在播放 | 免费av在线播放二区| 伊人网综合在线视频| 手机在线看片免费人成视频| 日韩成人免费电影| 91女神在线视频| 好爽免费视频,| 91欧美色| 亚洲最大成人a毛毛片| 密桃99999| 少妇天堂网络| 欧美色91| yiqicaoav| 在线观看高清AV| 青娱乐亚洲热| 97超碰公开| 青青青国产手线观看视频2| 脫衣舞一区二区三区| 精品久久久av| 天天干夜夜| 日韩簧片免费看| 成人福利视频网| 一区二区三区男女操逼黄色小电影| 亚洲天堂自拍| 超碰91在线| 操一区| 午夜精品人妻二区三区| 91亚洲网| www久久久| 96精品一区| AV乱伦国产| 人妻加勒比东京热| 久久久久久波多野吉衣高潮| 凌辱美少妇久久aV| 亚洲AV性爱电影| 在线天堂999| 亚洲黄色| 色色色综合网| 欧美东京热青青草| 91 亚洲 欧美 日韩 国产 综合| 丁香五月成人| 亚洲激情久久久伊人综合| 婷婷视频在线免费观看| 97公开久久| av影片在线观看不卡| 五月天婷婷基地| 国产尤物在线三区| 自拍视频一区在线观看| 激情视频一二三| 看黄片视频免费| 久久9免费视频| 大香蕉综合网| 久久久久久久97| Av色五月| 日韩熟女无码| 美女露胸露屁股| 热99re69精品8在线播放| 不卡在线一区,精品一区二区三区中| 久久线上视频免费看| 亚洲午夜福利在线影院| 在线啊啊啊| 黑操B| 亚洲最新Av| 色老久久| 欧美国产日韩高清在线| 精品无码少妇| 水野优香在线观看| 亚洲少妇视频| 人妻密肉在线观看| 另类天堂| 亚洲中文制服诱惑| 日本三级A片网站com| 97国产天堂岛| 婷婷六月色开| 国产在线综合网| 中文字幕超碰CAO| 黄色小视频日本txt| 91 偷| 五月丁香综合网| 久久精品午夜国产亚洲AV无码| 精品久久大胆人体| 天天拍天天操| 亚洲第一免费视频| 欧美极品色| 久久免费看高潮毛片韩国| 综合一区中亚洲国产成人综合精品 | 无码一区二区精品视频久久久春药 | 亚州综合色| 日本黄色XXX| 亚洲情色1区| 九九综合久久| 嗯啊抽插大香蕉网页| 激情文学88| 四虎884| 国产视频第2页| 婷婷综合网| 91丨熟女丨丰满熟女| 日韩欧美亚欧在线视频| 91综合无码| 后入日本1234| 亚洲国产亚洲天堂| 热久久99999| 熟女中出视频| 日本一区二区三区欧美日韩中文字幕| 欧美v亚洲v日韩v最新在线二区 | 小草三级久久观看| 天天日天天舔天天喷天天射| 乱伦日本色图AⅤ| 日本天天操| 免费αV在线视频| 四虎884| 少妇久久久免费| 天天α片| 亚洲综合网电影91| 在线精品福利免费播放| 亚洲成人黄色在线观看| 欧美+日产+中文| 狠狠爱大香蕉| 97亚洲中文| 亚洲天堂少妇| 精品久久大胆人体| 成年人免费观看网站| 伦理日韩国产久久| 碰人碰碰人人开房人肉| 色一区二区三区综合| 亚洲丝袜在线观看| 97欧美色| 91精品老女人| 久久久新亚洲AV| 亚洲毛片基地专区| 1769成人国产精品视频| 久久99国产精品| 极品国产内射| 国产一区二区二区按摩精品啪视频| 97精品国产| 热无码中文亚洲H一道本一区二区| 欧美少妇性爱网站| 国产成人+综合亚洲+天堂| 久久99热这里只频精品6学生| 国产精品交换一区二区| 精品久久在线区一区| 亚洲爱爱视频一区二区| 无码人妻毛片丰满熟妇精品区| 91操熟女视频| 亚州男人天堂| 久久男人精品| 色色五月婷| 白 大 人妻 区 在线| 高清孕妇孕交 交孕妇| 国产91 丝袜在线播放00-百度| 欧美在线永久天堂| 爱媛媛久久国产福利| 伊人天堂在线| 乱老熟女一区二区三区| 怡春院久久| 高清孕妇孕交 交| 成人羞羞视频国产| 日韩av性爱在线播放| 2018天天干在线视频| 日韩精品一区二区三区色欲| 欧美日本天堂| 亚洲97| 无码色| 亚洲欧美综合网站| 久久97| 在线观看精品国产免费| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 美女露胸露屁股| 97 国产精品| 国产成人午夜视频网址| 麻豆啪啪啪视频| 国产成人主播| 亚洲加勒比| 开心五月婷婷激情| 九九热在线精品视频| 亚洲网站一区二区在线| 激情五月综合网| 偷拍片久久| 91碰超| 欧美人妻色| 九九精品99| 综精品久久久aaaa| 97视频播放| 99综合视频一体| 99蜜桃臀亚洲成人在线观看| av网站免费看| 99热超碰| 免费在线视频97| 91大胆欧美| 欧美偷拍| 久久久久久久久久久97| 外国91| 色老汉玖玖爱| 国产一级高清免费观看| 日日干日日| 久久国产精品视频| 欧日a| 亚洲做性| 日韩久久三区| 国产精品在线免费| 超碰三级秋霞| 99re9| 综合av影片| 日亚韩精品视频二区三| 香蕉色网| 99综合视频一体| 97视频在线免费观看| 啊啊啊好湿久久| 久久久一区二区三区麻豆| 国产一区二区欧美日本| 亚洲综合伊人无码久久| 偷拍 精品另类 凸凹了四区| 欧美特大AA级黄片| 天天情欲宗合网| 91精品91久久久中77777| 精品一区二区三区国产| 东京热精品97综合网| 婷婷AV一区二区三区| 国产蜜臀精品一区二区尤物| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 青娱乐国产盛宴视频| 亚洲第一页色网| 人妻日日夜夜精品| 国产一区二区啪啪视频| 亚洲?V高清一区二区三区尤物| 日本天天吊| 国产高清免费不卡av| 国产青青美女玩逼视频| 99自拍视频| 91精品女厕偷拍视频|