Прежде всего, вы не получите исходное изображение обратно. PDF поддерживает только очень немногие форматы растровых изображений: JPEG, JPEG2000, некоторые форматы факсов, но определенно не PNG. PNG преобразуются во внутренний формат растрового изображения PDF, и после извлечения их лучше всего преобразовать обратно в PNG.
Кроме того, причина, по которой в классе PdfStampAnnotation
нет простого метода getImage
, заключается в том, что внешний вид штампа может быть сконструирован так же, как и содержимое обычной страницы, он может содержать текст, он может содержать векторную графику. , он может содержать растровые изображения, он может содержать произвольную смесь этих элементов. Таким образом, все, что вы можете извлечь из аннотации, это ее внешний вид.
Если вы уверены, что аннотация содержит только изображение (или вы, по крайней мере, не заинтересованы ни в чем, кроме изображения), вы можете извлечь это изображение с помощью механизма синтаксического анализа iText, например как это:
Map<byte[], String> extractAnnotationImages(PdfStream xObject) {
final Map<byte[], String> result = new HashMap<>();
IEventListener renderListener = new IEventListener() {
@Override
public Set<EventType> getSupportedEvents() {
return Collections.singleton(RENDER_IMAGE);
}
@Override
public void eventOccurred(IEventData data, EventType type) {
if (data instanceof ImageRenderInfo) {
ImageRenderInfo imageRenderInfo = (ImageRenderInfo) data;
byte[] bytes = imageRenderInfo.getImage().getImageBytes();
String extension = imageRenderInfo.getImage().identifyImageFileExtension();
result.put(bytes, extension);
}
}
};
PdfCanvasProcessor processor = new PdfCanvasProcessor(renderListener, Collections.emptyMap());
processor.processContent(xObject.getBytes(), new PdfResources(xObject.getAsDictionary(PdfName.Resources)));
return result;
}
( ExtractAnnotationImage метод)
, который возвращает отображение из байтовых массивов изображений в расширение файла для использования.
Я использовал его в этом вспомогательном методе:
void saveAnnotationImages(PdfDocument pdfDocument, String prefix) throws IOException {
for (int pageNumber = 1; pageNumber <= pdfDocument.getNumberOfPages(); pageNumber++) {
PdfPage page = pdfDocument.getPage(pageNumber);
int index = 0;
for (PdfAnnotation annotation : page.getAnnotations()) {
PdfDictionary normal = annotation.getAppearanceObject(PdfName.N);
if (normal instanceof PdfStream) {
Map<byte[], String> images = extractAnnotationImages((PdfStream)normal);
for (Map.Entry<byte[], String> entry : images.entrySet()) {
Files.write(new File(String.format("%s-%s-%s.%s", prefix, pageNumber, index++, entry.getValue())).toPath(), entry.getKey());
}
}
}
}
}
( ExtractAnnotationImage вспомогательный метод)
для извлечения всех изображений из аннотаций из выходных данных примера iText AddStamp
, на которые вы ссылаетесь, и получите одно изображение:
Кстати, вы поймете, что прозрачность отсутствует. Прозрачность в PDF моделируется с помощью второго изображения, маскирующего изображения, которое фактически представляет собой нечто вроде альфа-канала. Эту маску можно извлечь из объекта ImageRenderInfo.getImage()
.