原創(chuàng)|行業(yè)資訊|編輯:王香|2016-11-15 11:31:10.000|閱讀 367 次
概述:PDF library是一款文檔管理類控件,可用于創(chuàng)建、編輯、顯示和打印Acrobat PDF文檔。 PDF API小巧、快速、操作簡(jiǎn)單,完全用Java編寫,可以集成幾乎所有的項(xiàng)目。PDF Library新版本有一些非常不錯(cuò)的新功能,Output Profiler類的開發(fā)更是為大家?guī)砹酥T多方便,一起來了解一下。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
PDF Library 2.18版包括新預(yù)檢功能,以前,如果要識(shí)別PDF中存在哪些要素,并且可選地修改這些要素使得PDF與輸出配置文件(例如PDF / A或PDF / X)一致,那么您將使用PDF上的兩種方法 get Full Output Profile和set Output Profile,但這樣的方法存在一些問題。(文末附下載地址)
1、確定PDF上現(xiàn)有的OutputProfile可能需要相當(dāng)長(zhǎng)的時(shí)間,因?yàn)樗ǔT谡{(diào)用線程中完成,這樣便沒有辦法檢查操作的進(jìn)度或取消操作。
2、在PDF上設(shè)置新的Output Profile會(huì)使PDF適應(yīng)新配置文件的要求,但是該過程僅限于我們可以修復(fù)的項(xiàng)目。但在過程中無法指定替換字體或顏色等更進(jìn)一步操作。
3、一旦確定了PDF上的配置文件,將不能管理緩存。 如果再進(jìn)行調(diào)用getFull Output Profile返回相同的對(duì)象,需要重新運(yùn)行分析。
事實(shí)上,修復(fù)這些問題比我們現(xiàn)有的API要復(fù)雜得多,這也是以上兩個(gè)方法被棄用的原因。 Output Profiler類是替換,這里我們將介紹它是如何工作的。
如果使用過時(shí)的方法,也是可以運(yùn)作的,而且我們不用更改代碼,除非需要?jiǎng)h除已棄用的警告。
如果想升級(jí)代碼,我們可以用以下代碼替換對(duì)pdf.getFullOutputProfile()的調(diào)用:
OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfile profile = profiler.getProfile();
如果調(diào)用pdf.setOutputProfile(target),就可以做一個(gè)更多的行:
OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfile profile = profiler.getProfile(); profiler.apply(target);
背景線程
Output Profiler類可以在后臺(tái)線程中運(yùn)行,而另一個(gè)線程從PDF中讀取(修改PDF文件時(shí)會(huì)導(dǎo)致錯(cuò)誤,所以通常不這樣做),但是閱讀內(nèi)容,如將頁面轉(zhuǎn)換為位圖,是沒有問題的。如果你想了解背景線程的過程、和API文檔可以點(diǎn)擊進(jìn)入進(jìn)入isRunning。
使用FontAction替換PDF中的字體
Output Profiler類的最大好處是可以在PDF上運(yùn)行新的操作,這可以讓我們對(duì)文檔內(nèi)容進(jìn)行很大的更改,特別是在預(yù)檢期間通常會(huì)發(fā)生問題的一些領(lǐng)域,比如字體,顏色和圖片。
PDF/A和PDF/X都需要嵌入PDF中的所有字體,如果不是這樣,會(huì)出現(xiàn)兩個(gè)選項(xiàng)“將頁面轉(zhuǎn)換為位圖”、“替換字體”。我們前面已經(jīng)介紹過轉(zhuǎn)換位圖的方法,這是首選,但如果想轉(zhuǎn)換字體,可以在調(diào)用apply之前在Output Profiler上設(shè)置一個(gè)FontAction。
其中還提供了一個(gè)名為Auto Embedding FontAction的接口,它將用嵌入的字體替換任何未嵌入的字體。也會(huì)嘗試識(shí)別正確的字體來使用啟發(fā)式。給這個(gè)類嵌入字體時(shí),將根據(jù)字體名稱、字形指標(biāo)(每個(gè)字符有多寬)和字體是否共享相同的基本屬性找到最佳匹配 - Serif,Bold,Italic等等。
PDF pdf = new PDF(new PDFReader(file)); OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfiler.AutoEmbeddingFontAction fontaction = new OutputProfiler.AutoEmbeddingFontAction(); File[] fontfiles = new File("C:\\Windows\\Fonts").listFiles(); for (int i=0;i<fontfiles.length;i++) { if (fontfiles[i].getName().endsWith(".ttf")) { OpenTypeFont font = new OpenTypeFont(new FileInputStream(fontfiles[i]), 2); fontaction.add(font); } } profiler.setFontAction(fontaction); profiler.apply(OutputProfile.Default); pdf.render(new FileOutputStream(outfile));
上面的示例僅替換字體,但不會(huì)以任何其他方式修改PDF - OutputProfile.Defaultprofile,通常我們將替換字體轉(zhuǎn)換為PDF/A的一部分。想要確保PDF未嵌入任何對(duì)嵌入有限制的字體,替換未嵌入的字體不是唯一的可能性,如果你有這些字體的列表,這就變得更容易了,如下所示,在上面的示例中替換FontAction:
OutputProfiler.FontAction fontaction = new OutputProfiler.FontAction() { public PDFFont getFont(OutputProfiler profiler, String name, boolean embedded, PDFFont font) { if (embedded & disallowedfonts.contains(name)) { return appropriateSubstituteFont; } return null; } };
需要注意的是,替換字體不會(huì)重排文檔,因?yàn)镻DF不是可重排格式,并且新字體中的任何字形應(yīng)該和要替換的字形大致相同。所以新的字形將被拉伸或壓縮以匹配原始度量。而且對(duì)于部分極端情況(例如用比例替換等寬字體)將會(huì)導(dǎo)致字形失真。
使用ColorAction替換顏色
PDF/A和PDF/X還對(duì)PDF中的顏色(更準(zhǔn)確地說是ColorSpace)進(jìn)行了重新定義,即所有顏色必須校準(zhǔn),它們必須包括如何轉(zhuǎn)換為CIE XYZ ColorSpace的詳細(xì)信息。 PDF/X另外要求顏色是加性的,即它們不是RGB。
這意味著PDF中指定的任何顏色必須明確地是已校準(zhǔn)ColorSpace的一部分,或者必須能夠被解釋為PDF的輸出意圖的一部分。對(duì)于PDF/X,通常是打印機(jī)的ICC配置文件;對(duì)于PDF/A,任何ICC配置文件將做過度簡(jiǎn)化,并且通常使用sRGBspace。
對(duì)于允許操作的設(shè)相關(guān)顏色,必須可以轉(zhuǎn)換為ColorSpace,這意味著必須是RGB配置文件的RGB、CMYK或灰色的CMYK配置文件,不滿足這些要求的任何顏色都要進(jìn)行轉(zhuǎn)換。
但對(duì)于上述問題,我們也提供了一個(gè)標(biāo)準(zhǔn)ColorAction:ProcessColorAction,用于將未校準(zhǔn)的RGB、CMYK或灰度顏色轉(zhuǎn)換為指定的ColorSpace。如果針對(duì)未校準(zhǔn)的ColorSpace定義任何專色,則它們將被重新定義以映射到新的ColorSpace。以下是使用方法:
PDF pdf = new PDF(new PDFReader(file)); ICC_Profile icc = ICC_Profile.getProfile(ColorSpace.CS_sRGB); OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfiler.AutoEmbeddingFontAction coloraction = new OutputProfiler.ProcessColorAction(icc); profiler.setColorAction(coloraction); profiler.apply(OutputProfile.Default); pdf.render(new FileOutputStream(outfile));
與上面的FontAction示例一樣,這只是將PDF中所有未校準(zhǔn)的顏色轉(zhuǎn)換為sRGB。一般來說,這是轉(zhuǎn)換為PDF/A或PDF/X最重要的部分之一,具體演示結(jié)下了提供。有了自己專屬ColorAction的實(shí)現(xiàn),就會(huì)有更度的操作可能性。
coloraction = new OutputProfiler.ColorAction()
final ColorSpace target = ColorSpace.getInstance(ColorSpace.CS_GRAY); public ColorSpace changeColor(OutputProfiler profiler, ColorSpace cs, float[] src, float[] dst, boolean fill, int type) { if (dst != null) { // Convert to XYZ, then use Y value with gamma of 2.2 src = cs.toCIEXYZ(src); float g = src[1]; dst[0] = (float)Math.pow(g, 1 / 2.2); } return target; } };
重新采樣圖像
OutputProfiler還可以對(duì)圖像進(jìn)行下采樣。這在現(xiàn)代工作流程中也許無關(guān)緊要,但對(duì)于文件大小比保真度更重要的文檔來說仍然有用。 PDF中的所有圖像都被分類為1位、灰度和顏色,這些可以使用setMaxImageDPI方法進(jìn)行下采樣。
這些新操作,應(yīng)該意味著更多的PDF文檔可以轉(zhuǎn)換為PDF/A,而不必將其轉(zhuǎn)換為位圖。還有在PDF/X-3和PDF/A-1中不允許透明度,因此具有透明度的PDF仍然需要光柵化。 但是,對(duì)于那些需要將大量PDF轉(zhuǎn)換為PDF/A以存儲(chǔ)的人,將會(huì)減少存檔的大小,并使其更有用。
本文翻譯自:
轉(zhuǎn)載請(qǐng)注明慧都控件網(wǎng)
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn