当前位置: 首页 > 知识库问答 >
问题:

有没有办法避免在iText 7中加载XMP元数据?

农均
2023-03-14

我有一个PDF文件,里面有海量的xmp元数据,当我用itext7处理它的时候,程序卡在语句var pdfdoclepdf=new pdffile(pdfader);查看源代码,发现在Pdffile对象的构造函数中执行了open(null)方法,最后卡在了reader.pdfaconformancelevel=pdfaconformancelevel.getconformancelevel(xmpmatafactory. ParsefromBuff(xmp元数据));并且没有避免它的选项,xmp元数据对我来说毫无用处。

有了itextSharp,基于PDF/A上的删除XMP元数据,我可以得到一个没有元数据的pdf文件。

PdfReader reader = new PdfReader(src);
PdfDictionary dict = reader.Catalog;
dict.Remove(PdfName.METADATA);
dict.Remove(PdfName.PROPERTIES);
reader.RemoveUnusedObjects();
PdfStamper stamper = new PdfStamper(reader, new FileStream(target, FileMode.Create, FileAccess.ReadWrite));
stamper.Close();

我试图创建PdfReader或PdfDocument的子类,试图干扰元数据的加载,但都失败了。

使用itext7,有没有办法避免加载元数据?或者有没有办法删除XMP元数据?

共有1个答案

谢正初
2023-03-14

这就是如何覆盖PdfReader并跳过元数据对象的读取。事实上,对象是被读取的,但我们读者的行为就像没有元数据一样,它不会告诉任何人它存在。

自定义PdfReader实现:

private static class MetadataFreePdfReader extends PdfReader {
    public MetadataFreePdfReader(String filename) throws IOException {
        super(filename);
    }

    @Override
    protected PdfObject readObject(PdfIndirectReference reference) {
        PdfObject obj = super.readObject(reference);
        if (obj instanceof PdfStream && PdfName.Metadata.equals(((PdfStream) obj).getAsName(PdfName.Type))) {
            // skip metadata object
            return null;
        }
        return obj;
    }
}

这就是如何将重载实例传递给PdfDocument

PdfDocument pdfDocument = new PdfDocument(new MetadataFreePdfReader("C:/path/to/140mmX90mm-2000BGJCV1M.pdf"));
 类似资料:
  • 我正在寻找一种在InitState方法上加载异步数据的方法,在构建方法运行之前,我需要一些数据。我使用的是GoogleAuth代码,我需要执行build方法,直到流运行为止。 我的initState方法是: 如有任何反馈,我将不胜感激。

  • 好的,所以我有一个小问题,扫描器前进了一条额外的线。我有一个文件,其中有许多行包含整数,每行由一个空格分隔。文件中的某个地方有一行没有整数,只有单词“done”。当发现完成时,我们退出循环并打印出小于每行中每个给定整数的最大素数整数(如果整数已经是素数,则不对其进行任何处理)。我们一直这样做,直到“完成”为止。 我的问题:假设文件包含6行,第6行是完成这个词。我的输出将跳过第1、3和5行。它只会返

  • 我正在开发一个反应原生应用程序并使用Firebase fiRecovery作为集中式数据库。在将用户数据放在firest之前,我正在使用crypto js加密数据。现在我想在数据库中搜索,问题是数据已加密,当我再次尝试加密相同的数据时,crypto js会创建不同的加密数据。有没有可能在Firebase中搜索加密数据,而无需在移动应用程序中加载数据然后解密它?

  • 问题内容: 有没有办法用TypeScript语言进行方法重载? 我想实现以下目标: 这是我不想做的一个例子(我真的很讨厌JS中重载hack的那一部分): 问题答案: 根据规范,TypeScript确实支持方法重载,但是它很笨拙,并且包含许多手动检查参数类型的工作。我认为这主要是因为在纯JavaScript中最接近方法重载的地方还包括检查,并且TypeScript尝试不修改实际的方法主体,以避免任何

  • 问题内容: 我正在尝试为旧框架实施一些单元测试。我正在尝试模拟数据库层。不幸的是,我们的框架有些陈旧,没有很好地使用最佳实践,因此没有明确的关注点分离。我有点担心尝试模拟数据库层可能会使JVM加载大量甚至无法使用的类。 我不太了解类加载器,所以这可能不是问题。是否有办法在一个特定的ClassLoader加载的所有类中发挥最大作用,以证明引擎盖下发生了什么? 问题答案: 警告使用 将产生巨大的产出。

  • 很抱歉没有提供实际的代码,我的情况完全符合jackson中的问题--不要序列化惰性对象。由于这个问题没有解决方案,所以我强调了这个问题,以确保是否有解决方案,或者在本例中使用什么方法,而不是使用Jackson以JSON格式作为响应发送给对象。 谢谢