Чтобы занимать меньше места, я беру все страницы в одном PDF-файле и складываю их вертикально в одно изображение JPG с помощью PDFBox.
BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, TYPE_INT_RGB);
int currentYPlacement = 0;
for (int i = 0; i < document.getPages().getCount(); i++) {
BufferedImage currentImage = pdfRenderer.renderImageWithDPI(i, 72, ImageType.RGB);
Graphics graphics = combinedImage.getGraphics();
graphics.drawImage(currentImage, 0, currentYPlacement, null);
currentYPlacement += currentImage.getHeight();
}
File outputfile = new File( "test.jpg");
ImageIO.write(combinedImage, "jpg", outputfile);
Однако я обнаружил, что размер файла JPG не всегда меньше размера PDF. Я по-прежнему хочу, чтобы изображения оставались читаемыми и имели исходные размеры PDF.
Я знаю, что нужно учитывать одну вещь: PDF очень маленький (< 50 КБ), а JPG такого размера может быть больше, но я не уверен, что еще нужно учитывать.
Вот мои выводы, обратите внимание на разницу между двумя одностраничными PDF-файлами. Почему второй одностраничный результат почти в 2 раза больше исходного PDF-файла? Какие факторы влияют на размер JPG?
Обновлять
Я создаю PDF-файл 8,5 x 11 в Microsoft Word со словами «Hello, World!» и выполнил преобразование. PDF-файл был размером 23 КБ, а файл JPG — 14 КБ после преобразования. Очень запутанно...
pdf не использует пиксели изображения как таковые, поэтому нет никакой связи, кроме того, что если вы возьмете JPG и добавите описание PDF вокруг него, он будет примерно на 1 КБ больше или на 4 КБ больше с метаданными.
Откройте блокнот и введите 1 экран текста. Сделайте снимок экрана, сохраните в формате JPEG. Обратите внимание, что растровое изображение занимает гораздо больше места, чем текст.
скажем, страница PDF имеет ширину 500 и высоту 800, что соответствует примерной цифре для принтеров, поскольку вы установили 72 dpi в качестве меры, поэтому пиксели JPG составляют 500 x 800 x 24 бита (назовем это x3 байтами), поэтому в пикселях страница теперь будет 1 200 000 МБ с сжатие и качество потерь, которые можно уменьшить, скажем, на 1/20, таким образом, цель составляет 60 КБ, поэтому в лучшем случае, уменьшив качество, вы можете снизиться до этого уровня, однако «Hello World!» поскольку .txt составляет всего 12 байт, добавьте немного или два для шрифта и размера страницы, и без встраивания шрифтов в формате PDF он будет больше, скажем, 1 КБ, но как изображение будет намного более 60 КБ.
@Tommy, который все равно будет слишком большим, так как больше одного байта, поскольку в качестве кода он составляет 3 байта, а в формате PDF требуется не менее 500. Таким образом, в 500 раз больше, чем пиксель отслеживания веб-ошибки составляет 0,8 КБ.
PDF-файл был размером 23 КБ, а файл JPG — 14 КБ после преобразования. это просто необходимость включить выбранный вами шрифт здесь в 3 строки - пустая %PDF-1.0
строка 2 длиннее 1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</MediaBox[0 0 3 3]>>endobj
поместите это в строку 3 trailer<</Root 1 0 R>>
Acrobat Reader будет настаивать на повторном сохранении путем редактирования, и новый файл будет больше (3666 байт). Больше запутался? (чем больше файл PDF, тем лучше)
Нет никакой связи между размером файла PDF (в килобайтах) и размером конвертированного изображения страницы (в килобайтах).
При преобразовании страницы PDF в изображение размер выходного изображения в пикселях вычисляется следующим образом:
sizeOfImageInPixels = sizeOfPDFPageInPoints * dpi / 72;
Если у вас есть PDF-файл со страницей, состоящей из одной буквы (612 * 792 точки), при преобразовании этой страницы в изображение с разрешением 72 dpi выходное изображение будет иметь размер 612 * 792 пикселей. Если изображение только RGB (24 бита на пиксель), то его размер будет
612 * 792 * 3 = 1454112 bytes.
Таким образом, независимо от размера файла PDF (это может быть небольшая пустая страница PDF в килобайтах или полная страница PDF в мегабайтах с полноцветными изображениями, текстом, векторной графикой и т. д.), когда он преобразуется в изображение с разрешением 72 dpi, размер выходного несжатого изображения всегда будет 1454112 байт.
Теперь, когда вы сжимаете эти 1454 112 байт, размер сжатого вывода будет варьироваться, так как полностью белая страница (всего 255 байт) сжимается намного лучше, чем цветная страница. Поскольку JPEG является сжатием с потерями, одно и то же несжатое изображение может быть сжато JPEG до разных размеров в зависимости от того, насколько агрессивно сжатие.
PDF-файлы часто содержат много нерастрового контента, например: текст и векторную графику. Эти вещи могут стать очень тяжелыми, когда вы их растрируете, и вам придется хранить всю эту информацию в данных пикселей.