java - iText:为页面上的图像设置图像插值

标签 java pdf-generation itext interpolation

我想遍历 PDF 的页面并编写一个新的 PDF,其中所有图像的插值设置为 false。我期望能够执行如下操作,但我找不到访问 PDF 页面上的图像或矩形的方法。

PdfCopy copy = new PdfCopy(document, new FileOutputStream(outFileName));
copy.newPage();
PdfReader reader = new PdfReader(inFileName);
for(int i = 1; i <= reader.getNumberOfPages(); i++) {
    PdfImportedPage importedPage = copy.getImportedPage(reader, i);
    for(Image image : importedPage.images())
        image.isInterpolated(false);
    copy.addPage(importedPage);
}
reader.close();

但是,没有 PdfImportedPage.images()。关于我如何做同样的事情有什么建议吗?

干杯

尼克

最佳答案

事情不会那么容易。没有高级的方法可以做你想做的事。您必须枚举寻找 XObject 图像的资源,并清除它们的/Interpolate 标志。

您必须在创建 PdfImportedPage 之前执行此操作,因为没有公共(public)方式来访问其资源。咕噜。

void removeInterpolation( int pageNum ) {
  PdfDictionary page = someReader.getPageN(pageNum);
  PdfDictionary resources = page.getAsDict(PdfName.RESOURCES);

  enumResources(resources);
}

void enumResource( PdfDictionary resources) {
  PdfDictionary xobjs = resources.getAsDict(PdfName.XOBJECTS);

  Set<PdfName> xobjNames = xobjs.getKeys();
  for (PdfName name : xobjNames) {

    PdfStream xobjStream = xobjs.getAsStream(name);

    if (PdfName.FORM.equals( xobjStream.getAsName(PdfName.SUBTYPE))) {
      // xobject forms have their own nested resources.
      PdfDictionary nestedResources = xobjStream.getAsDict(PdfName.RESOURCES);
      enumResources(nestedResources);
    } else {
      xobjStream.remove(PdfName.INTERPOLATE);
    }
  }
}

上面的代码中跳过了相当多的空检查。页面不必有资源字典,尽管它们几乎总是有。 XObject 表单也是如此。如果给定的键丢失或类型不同,所有 getAs* 函数都将返回 null...您明白了。

关于java - iText:为页面上的图像设置图像插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4791450/

相关文章:

java - 通过 iText 合并 1000 个 PDF 会抛出 java.lang.OutOfMemoryError : Java heap space

.net - 使用 ITextSharp 和 PDFSharp 渲染 PDF 表的性能 Not Acceptable

c# - 找到 iTextSharp 对象的页码

java - org.xml.sax.SAXParseException : Premature end of file

java - 如何使用 Selenium WebDriver 和 Java 获得选定的选项

java - 不同语言版本的Murmurhash会得到不同的结果

google-apps-script - 谷歌脚本仅粘贴值

ios - 从 iPad 发送电子邮件时 PDF 签名会轮换

java - 自更新 14.1.1 以来,无法在 IntelliJ 中运行代码覆盖率

html - Rotativa 生成的 PDF 无法正确呈现 - 分页符/元素中断