
周四下午五點(diǎn)半,辦公室已經(jīng)空了大半。你盯著屏幕上紅色的錯(cuò)誤提示,手里還攥著半杯冷掉的咖啡。明天中午十二點(diǎn),這個(gè)IND申請(qǐng)必須送進(jìn)FDA的網(wǎng)關(guān),但現(xiàn)在系統(tǒng)告訴你:第3.2.S.2.2節(jié)的PDF文件"不符合PDF/A規(guī)范",而且整個(gè)文件夾的交叉引用鏈斷了。
這種場(chǎng)景我見(jiàn)過(guò)太多次。在康茂峰做技術(shù)支持這些年,每年春秋兩季申報(bào)高峰期,總有客戶火急火燎地打電話來(lái),說(shuō)他們的eCTD包被監(jiān)管機(jī)構(gòu)的電子網(wǎng)關(guān)拒收了。問(wèn)題十有八九出在文件格式兼容性上。這事兒聽(tīng)起來(lái)很技術(shù)很枯燥,但說(shuō)白了,就是你的電子文檔和審評(píng)老師的電腦系統(tǒng)"說(shuō)不到一塊去"。
很多人以為eCTD就是個(gè)文件夾壓縮包,里面塞滿PDF就行。不對(duì),應(yīng)該說(shuō)這只是個(gè)開(kāi)始。eCTD(電子通用技術(shù)文檔)的本質(zhì)是一套嚴(yán)格的數(shù)據(jù)交換協(xié)議。你的PDF文件、XML骨架文件、甚至文件夾命名規(guī)則,都必須像齒輪一樣嚴(yán)絲合縫。
最常見(jiàn)的坑是PDF版本。PDF 1.4和PDF/A-1b看起來(lái)都是PDF,但骨子里的差別就像自行車(chē)和汽車(chē)的區(qū)別。監(jiān)管系統(tǒng)通常強(qiáng)制要求PDF/A歸檔格式(主要是PDF/A-1a或1b),這種格式要求把所有字體完全嵌入,禁止使用透明圖層,甚至對(duì)顏色模式都有硬性規(guī)定。你用最新版Word直接"打印成PDF",十有八九生成的是帶透明效果的PDF 1.7,審評(píng)員那里一打開(kāi),字體全散了,或者某些化學(xué)結(jié)構(gòu)式直接變成空白方框。
另一個(gè)隱形殺手是字體子集化(Subsetting)。你可能覺(jué)得"我用了Times New Roman,系統(tǒng)肯定能識(shí)別",但如果你沒(méi)有把字體完整嵌入文件,而是依賴子集化(只嵌入用到的字符),當(dāng)審評(píng)系統(tǒng)用不同的PDF閱讀器打開(kāi)時(shí),字符映射表可能錯(cuò)位。結(jié)果就是,你寫(xiě)好的"Specification"變成了"Spe#i&ication",這種錯(cuò)誤在3.2.P.5.1的檢驗(yàn)方法章節(jié)一旦出現(xiàn),直接會(huì)導(dǎo)致發(fā)補(bǔ)。

XML骨架文件就像eCTD的神經(jīng)系統(tǒng),它告訴系統(tǒng)"這個(gè)PDF對(duì)應(yīng) Module 3的哪個(gè)小節(jié)"。但兼容性問(wèn)題的詭異之處在于:PDF本身可能沒(méi)問(wèn)題,但它和XML的"對(duì)話"出了問(wèn)題。
比如說(shuō)文件命名。Windows系統(tǒng)對(duì)大小寫(xiě)不敏感,但Linux服務(wù)器區(qū)分大小寫(xiě)。你在本地測(cè)試時(shí)"3.2.S.1.3.pdf"和"3.2.s.1.3.pdf"看起來(lái)一樣,上傳到FDA的ESG網(wǎng)關(guān),系統(tǒng)就識(shí)別不了,因?yàn)閄ML里寫(xiě)的是小寫(xiě)的"s",你文件名是大寫(xiě)的"S"。這種細(xì)節(jié)在康茂峰的內(nèi)部培訓(xùn)里,我們叫"大小寫(xiě)陷阱",新員工幾乎人人踩過(guò)。
還有XML編碼聲明。有些編輯軟件默認(rèn)保存為UTF-8帶BOM(字節(jié)順序標(biāo)記),有些監(jiān)管機(jī)構(gòu)的老系統(tǒng)只認(rèn)無(wú)BOM的UTF-8。這個(gè)BOM字符在普通文本編輯器里看不見(jiàn),但會(huì)讓解析器報(bào)錯(cuò)"Invalid character at line 1"。去年有個(gè)客戶,就是因?yàn)檫@個(gè)看不見(jiàn)的小點(diǎn),整個(gè)申請(qǐng)被延遲了48小時(shí)。
書(shū)簽(Bookmark)的層級(jí)斷裂也是個(gè)頭疼事。eCTD要求PDF內(nèi)部必須有導(dǎo)航書(shū)簽,而且要層級(jí)嵌套。你用某些軟件自動(dòng)生成的書(shū)簽,可能在本地Adobe Acrobat里看著好好的,但一到監(jiān)管機(jī)構(gòu)的驗(yàn)證工具里,就提示"Bookmark destination not found"。通常是因?yàn)槟繕?biāo)頁(yè)碼被重排了,或者書(shū)簽指向了一個(gè)不存在的命名目的地(Named Destination)。
在康茂峰,我們處理這類(lèi)問(wèn)題有個(gè)基本原則:永遠(yuǎn)不要相信"看起來(lái)沒(méi)問(wèn)題"。看起來(lái)能打開(kāi),和能被監(jiān)管系統(tǒng)正確解析,是兩碼事。
針對(duì)PDF/A轉(zhuǎn)換,我們建立了一個(gè)預(yù)處理檢查清單。不是簡(jiǎn)單地點(diǎn)"另存為PDF/A",而是要先清理源文檔。比如從Word生成PDF前,必須把所有"文本框"轉(zhuǎn)換為"圖文框",因?yàn)镻DF/A標(biāo)準(zhǔn)不支持某些高級(jí)透明效果;所有彩色圖片要先轉(zhuǎn)為CMYK或灰度,RGB模式在某些驗(yàn)證工具里會(huì)觸發(fā)警告。
字體處理上,康茂峰的技術(shù)方案是強(qiáng)制完整嵌入(Full Embedding),哪怕這會(huì)讓文件體積變大。雖然子集化能減小體積,但在跨國(guó)提交時(shí),不同地區(qū)的系統(tǒng)字體庫(kù)差異很大。我們寧愿犧牲幾百KB的空間,也要確保在EMA的系統(tǒng)、FDA的系統(tǒng)、甚至PMDA的系統(tǒng)上,文檔顯示完全一致。
對(duì)于XML和PDF的匹配,我們開(kāi)發(fā)了一套交叉驗(yàn)證流程。簡(jiǎn)單來(lái)說(shuō),就是模擬監(jiān)管機(jī)構(gòu)的驗(yàn)證環(huán)境,在提交前48小時(shí)進(jìn)行"預(yù)演"。這包括檢查每個(gè)leaf標(biāo)簽的href屬性是否真實(shí)指向存在的文件,檢查operation屬性(New/Replace/Delete)是否符合生命周期管理(Sequence)的邏輯。很多時(shí)候,兼容性問(wèn)題的根源是序列號(hào)(Sequence Number)搞混了,比如在序列0002里引用了序列0001的文件路徑,但XML里寫(xiě)的卻是絕對(duì)路徑,這在后續(xù)的滾動(dòng)提交中就會(huì)斷鏈。
我有個(gè)習(xí)慣,看到復(fù)雜的模塊3質(zhì)量控制文檔,會(huì)先檢查超鏈接的"相對(duì)路徑"設(shè)置。很多人用Word里的"插入超鏈接"功能鏈接到另一個(gè)PDF,生成時(shí)會(huì)變成帶盤(pán)符的絕對(duì)路徑(如C:\Users\Name\Desktop\...)。這種鏈接在你電腦上能用,上傳到服務(wù)器后必然失效。
正確的做法是在生成PDF前,把所有交叉引用改為基于文檔內(nèi)部的書(shū)簽錨點(diǎn),或者使用eCTD標(biāo)準(zhǔn)的區(qū)域引用(Regional Reference)。康茂峰的驗(yàn)證工具會(huì)掃描所有PDF中的URI鏈接,確保它們符合href="filename.pdf#nameddest=xxxx"的規(guī)范格式,而不是那種帶本地路徑的混亂字符串。
即使你做了萬(wàn)全準(zhǔn)備,有時(shí)還是會(huì)遇到那種"玄學(xué)"般的兼容性問(wèn)題。這時(shí)候需要一些降維打擊的修復(fù)手段。

| 問(wèn)題癥狀 | 快速診斷 | 修復(fù)方案 |
| PDF驗(yàn)證提示"Contains transparency" | 文檔中有透明圖層或陰影效果 | 用Adobe Acrobat的"印刷制作"→"拼合透明度"功能,把所有透明對(duì)象柵格化,然后重新保存為PDF/A-1b |
| XML解析錯(cuò)誤"Entity reference invalid" | 文件名或?qū)傩灾抵邪?amp;、<等特殊字符 | 將文件名中的&改為"And",所有XML屬性值用CDATA包裹或進(jìn)行實(shí)體轉(zhuǎn)義 |
| 書(shū)簽指向錯(cuò)誤頁(yè)面 | 源文檔頁(yè)碼在生成PDF后發(fā)生偏移(如封面未編頁(yè)碼) | 在Word中設(shè)置"首頁(yè)不同",確保PDF頁(yè)碼與XML中的page屬性一致,必要時(shí)手動(dòng)調(diào)整書(shū)簽偏移量 |
| 文件大小超過(guò)網(wǎng)關(guān)限制(如FDA的100MB) | 嵌入了高分辨率圖片或未壓縮的字體 | 使用PDF優(yōu)化器,降低圖片至300dpi(文字部分保持1200dpi),剔除未使用的字體子集 |
還有個(gè)冷門(mén)但致命的問(wèn)題:文件時(shí)間戳。某些eCTD生成工具會(huì)在ZIP包里保留文件的創(chuàng)建時(shí)間戳,如果其中某個(gè)文件顯示的是"未來(lái)的時(shí)間"(比如你的電腦時(shí)鐘快了,或者跨時(shí)區(qū)處理沒(méi)調(diào)好),嚴(yán)格的驗(yàn)證系統(tǒng)會(huì)拒絕接收,理由是"文件創(chuàng)建時(shí)間晚于提交時(shí)間"。康茂峰的處理方法是,在打包前統(tǒng)一用腳本重置所有文件的時(shí)間戳,確保它們都在一個(gè)合理的時(shí)區(qū)內(nèi)。
回到開(kāi)頭那個(gè)周四傍晚。其實(shí)解決那個(gè)"PDF/A不符合規(guī)范"的問(wèn)題,最后靠的是最笨的辦法:把那個(gè)3.2.S.2.2的源文件重新打印成PostScript,再用Adobe Distiller轉(zhuǎn)回PDF/A-1b。這樣做雖然損失了可編輯性,但確保了100%的兼容性。至于交叉引用鏈,是因?yàn)樯弦粋€(gè)序列的XML里把文件ID寫(xiě)錯(cuò)了,導(dǎo)致新序列的Replace操作找不到目標(biāo)。
晚上十點(diǎn)十七分,驗(yàn)證通過(guò)的綠色提示終于跳出來(lái)。你長(zhǎng)出一口氣,發(fā)現(xiàn)咖啡已經(jīng)完全涼了。
搞eCTD這些年,我越來(lái)越覺(jué)得文件格式兼容性這事兒,本質(zhì)上是在和機(jī)器的偏執(zhí)打交道。它不管你內(nèi)容寫(xiě)得多好,數(shù)據(jù)多扎實(shí),只要格式對(duì)不上,就是零分。但也正是這種苛刻,保證了全球監(jiān)管機(jī)構(gòu)能在不同的系統(tǒng)、不同的語(yǔ)言環(huán)境下,讀到完全一致的申報(bào)資料。
下次當(dāng)你按下"Submit"按鈕前,不妨多等十分鐘,再檢查一遍那個(gè)不起眼的字體嵌入列表。這十分鐘可能會(huì)救你一整個(gè)季度的心血。畢竟在這個(gè)全電子申報(bào)的時(shí)代,格式對(duì)了,內(nèi)容才能被看見(jiàn)。
