Размер изображения в PDF - PullRequest
0 голосов
/ 19 июня 2020

У меня есть код, который извлекает изображения из документов PDF. Я хочу пропустить слишком большие изображения, но я не знаю, как узнать, что изображение слишком велико. Я пробовал использовать PdfImageXObject.getCOSObject().getLength(), но в моем тесте оказалось, что он возвращает гораздо большее значение, чем размер изображения в файловой системе. Как мне хотя бы приблизительно узнать размер изображения в байтах, не извлекая его (дорогостоящая операция)?

1 Ответ

3 голосов
/ 19 июня 2020

getLength() не является хорошей мерой, поскольку возвращает закодированную длину потока. В зависимости от кодировки, используемой в файле PDF, и кодировки, которую вы используете в файловой системе, вы получите либо меньшее, либо большее значение.

  • Изображение в PDF использует кодировку JPEG, вы не кодируете при сохранении изображения: getLength() будет намного меньше, чем размер в файловой системе.
  • Изображение в PDF не закодировано, вы сохраняете как изображение JPEG: ваше изображение на диске будет быть намного меньше.

Более надежный способ сделать это - посмотреть на ширину и высоту изображения, которое вы можете получить из PDImage. Это дает вам количество пикселей по горизонтали и вертикали. PDImage возвращает это с использованием getWidth() и getHeight().

Это не совсем правильно, если вы хотите получить общий размер изображения в байтах, вам также нужно будет посмотреть на цветовое пространство, чтобы увидеть, как количество компонентов на пиксель (например, 3 для RGB, 4 для CMYK) и сколько битов на компонент в изображении. Но вы, вероятно, можете пропустить эти значения для той цели, на которую вы смотрите, и просто рассчитаться с шириной и высотой, чтобы получить приблизительное представление о том, хотите ли вы сохранить это или нет.

...