2015-02-10 4 views
1

До сих пор все примеры, похоже, связаны с добавлением метаданных при создании нового документа. Я хочу взять существующий PDF-файл и добавить GUID для XMP каждой страницы, используя штампКак добавить метаданные XMP на каждую страницу существующего PDF с помощью iTextSharp

ответ

1

Наиболее распространенное использование XMP в контексте PDF - это когда вы добавляете поток XMP для всего документа, на который ссылается корневой словарь PDF (он же Каталог).

Однако, если вы обратитесь к спецификации PDF, вы заметите, что XMP можно использовать в контексте многих других объектов внутри PDF, причем уровень страницы является одним из них. Если вы посмотрите на спецификацию, вы обнаружите, что /Metadata является дополнительным ключом в словаре страниц. Он ожидает ссылки на поток XMP.

Если вы хотите использовать iText для создания PDF-документа с нуля, вы не найдете конкретного метода для добавления этих метаданных, но вы можете использовать общий addPageDictEntry(), который доступен в PdfWriter. Вы передали бы PdfName.METADATA в качестве ключа и ссылку на поток, который уже добавлен в значение PdfWriter.

Ваш вопрос заключается не в создании PDF-кода с нуля, а в изменении существующего PDF-файла. В этом случае вам также нужен словарь. Это очень легко получить эти словари:

PdfReader reader = new PdfReader(src); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    // do stuff with the page dictionary 
} 

Этот фрагмент был взят сюда на Rotate90Degrees примере. В этом примере мы рассмотрим /Rotate запись, которая является номер:

PdfNumber rotate = page.getAsNumber(PdfName.ROTATE); 

Вы должны искать /Metadata записи, которая представляет собой поток:

PRStream stream = (PRStream) page.getAsStream(PdfName.METADATA); 

Может быть, этот поток null, в этот случай, вам нужно добавить /Metadata запись, как показано в примере AddXmpToPage:

// We create some XMP bytes 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
XmpWriter xmp = new XmpWriter(baos, new PdfDictionary()); 
xmp.close(); 
// We add the XMP bytes to the writer 
PdfIndirectObject ref = stamper.getWriter().addToBody(new PdfStream(baos.toByteArray())); 
// We add a reference to the XMP bytes to the page dictionary 
page.put(PdfName.METADATA, ref.getIndirectReference()); 

Если есть поток XMP, вы хотите сохранить его и добавить что-то к нему.

Это, как вы получите байты XMP:

byte[] xmpBytes = PdfReader.getStreamBytes(stream); 

Вы выполняете свой XML магию этих байт, в результате чего нового byte[] именованного newXmpBytes. Вы заменить исходные байты с этими новыми байт, как это:

stream.setData(newXmpBytes); 

Все эти операции выполняются на существующем файле, который находится в PdfReader объекте. Теперь вы должны сохранить изменения следующим образом:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
stamper.close(); 
reader.close(); 
+0

Большое вам спасибо (общий ленивый вопрос, который я знаю), но как добавить запись метаданных. Не гарантируется, что на каждой странице будет запись метаданных. Еще раз спасибо – Rahul

+0

Я обновляю свой вопрос. –

Смежные вопросы