Есть ли способ избежать загрузки метаданных XMP в iText 7? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть файл PDF с огромным количеством метаданных xmp. Когда я использую itext7 для его обработки, программа застревает в операторе var pdfdocument origpdf = new pdfdocument (pdfreader); Глядя на исходный код , я обнаружил, что метод open (null) был выполнен в конструкторе объекта Pdfdocument, и, наконец, застрял на reader.pdfaconformancelevel = pdfaconformancelevel.getconformancelevel (xmpmatafactory. Parsefrombuffer (xmpmetadata)); и нет возможности избежать этого, метаданные xmp для меня бесполезны.

При использовании itextSharp, основанного на Удалите метаданные XMP в 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?

1 Ответ

1 голос
/ 28 марта 2020

Так вы можете переопределить 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"));
...