原創|行業資訊|編輯:王香|2016-11-15 11:31:10.000|閱讀 367 次
概述:PDF library是一款文檔管理類控件,可用于創建、編輯、顯示和打印Acrobat PDF文檔。 PDF API小巧、快速、操作簡單,完全用Java編寫,可以集成幾乎所有的項目。PDF Library新版本有一些非常不錯的新功能,Output Profiler類的開發更是為大家帶來了諸多方便,一起來了解一下。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
PDF Library 2.18版包括新預檢功能,以前,如果要識別PDF中存在哪些要素,并且可選地修改這些要素使得PDF與輸出配置文件(例如PDF / A或PDF / X)一致,那么您將使用PDF上的兩種方法 get Full Output Profile和set Output Profile,但這樣的方法存在一些問題。(文末附下載地址)
1、確定PDF上現有的OutputProfile可能需要相當長的時間,因為它通常在調用線程中完成,這樣便沒有辦法檢查操作的進度或取消操作。
2、在PDF上設置新的Output Profile會使PDF適應新配置文件的要求,但是該過程僅限于我們可以修復的項目。但在過程中無法指定替換字體或顏色等更進一步操作。
3、一旦確定了PDF上的配置文件,將不能管理緩存。 如果再進行調用getFull Output Profile返回相同的對象,需要重新運行分析。
事實上,修復這些問題比我們現有的API要復雜得多,這也是以上兩個方法被棄用的原因。 Output Profiler類是替換,這里我們將介紹它是如何工作的。
如果使用過時的方法,也是可以運作的,而且我們不用更改代碼,除非需要刪除已棄用的警告。
如果想升級代碼,我們可以用以下代碼替換對pdf.getFullOutputProfile()的調用:
OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfile profile = profiler.getProfile();
如果調用pdf.setOutputProfile(target),就可以做一個更多的行:
OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf)); OutputProfile profile = profiler.getProfile(); profiler.apply(target);
背景線程
Output Profiler類可以在后臺線程中運行,而另一個線程從PDF中讀取(修改PDF文件時會導致錯誤,所以通常不這樣做),但是閱讀內容,如將頁面轉換為位圖,是沒有問題的。如果你想了解背景線程的過程、和API文檔可以點擊進入進入isRunning。
使用FontAction替換PDF中的字體
Output Profiler類的最大好處是可以在PDF上運行新的操作,這可以讓我們對文檔內容進行很大的更改,特別是在預檢期間通常會發生問題的一些領域,比如字體,顏色和圖片。
PDF/A和PDF/X都需要嵌入PDF中的所有字體,如果不是這樣,會出現兩個選項“將頁面轉換為位圖”、“替換字體”。我們前面已經介紹過轉換位圖的方法,這是首選,但如果想轉換字體,可以在調用apply之前在Output Profiler上設置一個FontAction。
其中還提供了一個名為Auto Embedding FontAction的接口,它將用嵌入的字體替換任何未嵌入的字體。也會嘗試識別正確的字體來使用啟發式。給這個類嵌入字體時,將根據字體名稱、字形指標(每個字符有多寬)和字體是否共享相同的基本屬性找到最佳匹配 - 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));
上面的示例僅替換字體,但不會以任何其他方式修改PDF - OutputProfile.Defaultprofile,通常我們將替換字體轉換為PDF/A的一部分。想要確保PDF未嵌入任何對嵌入有限制的字體,替換未嵌入的字體不是唯一的可能性,如果你有這些字體的列表,這就變得更容易了,如下所示,在上面的示例中替換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; } };
需要注意的是,替換字體不會重排文檔,因為PDF不是可重排格式,并且新字體中的任何字形應該和要替換的字形大致相同。所以新的字形將被拉伸或壓縮以匹配原始度量。而且對于部分極端情況(例如用比例替換等寬字體)將會導致字形失真。
使用ColorAction替換顏色
PDF/A和PDF/X還對PDF中的顏色(更準確地說是ColorSpace)進行了重新定義,即所有顏色必須校準,它們必須包括如何轉換為CIE XYZ ColorSpace的詳細信息。 PDF/X另外要求顏色是加性的,即它們不是RGB。
這意味著PDF中指定的任何顏色必須明確地是已校準ColorSpace的一部分,或者必須能夠被解釋為PDF的輸出意圖的一部分。對于PDF/X,通常是打印機的ICC配置文件;對于PDF/A,任何ICC配置文件將做過度簡化,并且通常使用sRGBspace。
對于允許操作的設相關顏色,必須可以轉換為ColorSpace,這意味著必須是RGB配置文件的RGB、CMYK或灰色的CMYK配置文件,不滿足這些要求的任何顏色都要進行轉換。
但對于上述問題,我們也提供了一個標準ColorAction:ProcessColorAction,用于將未校準的RGB、CMYK或灰度顏色轉換為指定的ColorSpace。如果針對未校準的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中所有未校準的顏色轉換為sRGB。一般來說,這是轉換為PDF/A或PDF/X最重要的部分之一,具體演示結下了提供。有了自己專屬ColorAction的實現,就會有更度的操作可能性。
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還可以對圖像進行下采樣。這在現代工作流程中也許無關緊要,但對于文件大小比保真度更重要的文檔來說仍然有用。 PDF中的所有圖像都被分類為1位、灰度和顏色,這些可以使用setMaxImageDPI方法進行下采樣。
這些新操作,應該意味著更多的PDF文檔可以轉換為PDF/A,而不必將其轉換為位圖。還有在PDF/X-3和PDF/A-1中不允許透明度,因此具有透明度的PDF仍然需要光柵化。 但是,對于那些需要將大量PDF轉換為PDF/A以存儲的人,將會減少存檔的大小,并使其更有用。
本文翻譯自:
轉載請注明慧都控件網
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn