文档管理控件PDF Library 2.18和Output Profiler类

PDF library是一款文档管理类控件,可用于创建、编辑、显示和打印Acrobat PDF文档。 PDF API小巧、快速、操作简单,完全用Java编写,可以集成几乎所有的项目。PDF Library新版本有一些非常不错的新功能,Output Profiler类的开发更是为大家带来了诸多方便,一起来了解一下。

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);

2016年终促销

背景线程

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 = newOutputProfiler.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 = newOutputProfiler.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以存储的人,将会减少存档的大小,并使其更有用。

PDF Library 2.18下载

本文翻译自:http://bfo.com/

转载请注明控件网

标签:文档管理文件格式转换PDF

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年10月12日
下一篇 2016年10月12日

相关推荐

发表回复

登录后才能评论