В дополнение к словарям, которые вы уже отметили как обновленные
tmpPage.getCOSObject().setNeedToBeUpdated(true);
tmpPage.getResources().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);
также пометьте запись XObject в словаре ресурсов как обновленную:
tmpPage.getResources().getCOSObject().getCOSDictionary(COSName.XOBJECT).setNeedToBeUpdated(true);
Вы задаетесь вопросом, почему вам не нужно было делать это при добавлении первого изображения?
В исходном PDF-файле пока нет записи XObject в словаре ресурсов. Таким образом, он генерируется заново и, следовательно, неявно помечается как обновленный.
Вы задаетесь вопросом, почему вам не нужно было делать это при добавлении в файл, в котором уже были изображения?
В этом другом файле запись XObject в словаре ресурсов является прямым объектом, т. Е. Немедленно содержится в словаре ресурсов.
4 0 obj
<<
/Type /Page
/Resources <<
/ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 5 0 R /gs2 6 0 R /gs3 7 0 R>>
/XObject <</Im1 8 0 R /Im2 9 0 R>>
>>
/MediaBox [0 0 611.03998 864.95996]
/Contents [10 0 R 11 0 R 12 0 R 13 0 R 14 0 R]
/StructParents 0
/Parent 2 0 R
>>
endobj
Таким образом, всякий раз, когда пишется новая копия словаря ресурсов, неявно записывается и новая копия записи XObject .
В файле, в котором PDFBox создал запись XObject в словаре ресурсов, PDFBox создал ее как косвенный объект, т. Е. В словаре ресурсов XObject отображается только на ссылка на номер объекта, а в объекте с этим номером можно найти фактический словарь записей.
2 0 obj
<<
/Type /Page
/Resources <<
/ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 3 0 R>>
/XObject 7 0 R
>>
/MediaBox [0 0 611.03998 864.95996]
/Contents [8 0 R 4 0 R 9 0 R]
/StructParents 0
/Parent 5 0 R
>>
endobj
7 0 obj
<<
/Im1 10 0 R
>>
endobj
Поэтому, когда пишется новая копия словаря ресурсов, в этом случае не создается неявная новая копия словаря записей XObject .
Кстати, ваш текущий подход не поможет вам с вашей задачей
Поскольку я также работаю с подписанными PDF-файлами, все изменения должны быть сохранены как «saveIncremental».
Добавление изображений к содержимому страницы недопустимо для изменения подписанного PDF, поэтому Adobe Reader по-прежнему будет указывать, что ваша подпись недействительна. Чтобы получить сводку разрешенных и запрещенных изменений после подписания, просмотрите этот ответ и документы, на которые имеются ссылки.
Вместо этого попробуйте добавить изображения в аннотации.