彩票走势图

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

原创|行业资讯|编辑:王香|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);

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

本文翻译自:

转载请注明慧都控件网


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

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP