【问题标题】:Is there any way to avoid loading XMP metadata in iText 7?有什么方法可以避免在 iText 7 中加载 XMP 元数据?
【发布时间】:2020-03-27 08:03:00
【问题描述】:

我有一个包含大量 xmp 元数据的 PDF 文件。我用itext7处理的时候,程序卡在var pdfdocument origpdf = new pdfdocument (pdfreader);语句中查看source code,发现是在Pdfdocument对象的构造函数中执行了open(null)方法,最后卡在reader.pdfaconformancelevel = pdfaconformancelevel.getconformancelevel (xmpmatafactory. Parsefrombuffer (xmpmetadata));并且没有办法避免它,xmp 元数据对我来说毫无用处。

使用 itextSharp,基于Remove XMP Metadata on PDF/A,我可以得到一个没有元数据的 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 元数据?

【问题讨论】:

  • 您好,能否附上PDF文件重现问题?
  • testfile.谢谢。

标签: c# pdf .net-core itext7


【解决方案1】:

这是您可以覆盖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"));

【讨论】:

  • 完成!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多