提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|行业资讯|编辑:王香|2016-11-15 11:31:10.000|阅读 302 次
概述: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@cahobeh.cn
通过提供强大的3D CAD数据访问工具并适用于桌面、移动和Web的高级环境3D可视化发动机,HOOPS在提升造船设计和制造流程的效率方面发挥了重要作用。
HOOPS Luminate在汽车行业中的应用具有广泛的潜力和深远的影响。它通过提供高效的3D可视化、虚拟装配与拆解、性能分析、客户定制等功能,帮助汽车制造商在设计、生产和销售过程中提升效率、降低成本并提高产品质量。
在不断发展的软件开发世界中,使工具和框架与最新的平台版本保持同步至关重要,欢迎查阅~
全球航运业对国际贸易至关重要,全球 90% 以上的商品通过海运运输。准确监控和控制这些集装箱的移动对于维持高效的供应链至关重要。手动输入集装箱号码是这一程序的关键部分,它带来了相当大的挑战,例如人为错误和效率低下。
Big Faceless Java PDF Library是一个敏捷的Java类库,用于创建、编辑、显示和打印Acrobat PDF文档。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢