Я недавно начал работать над этим проектом, где мне нужно преобразовать файл PDF в файл (ы) JPEG2000 - 1 файл jp2 на страницу -.
Цель состояла в том, чтобы заменить предыдущий метод конвертации PDF в jpeg, который у нас был, чтобы уменьшить размер выходного файла (ов).
Основываясь на коде, который я нашел в Интернете, я применил приведенный ниже метод конвертации pdftojpeg2000 и изменил значение параметра setEncodingRate и сравнил результаты.
Мне удалось получить меньшие выходные файлы jpeg2000, но качество очень низкое по сравнению с Jpeg, особенно для цветного текста или изображений.
Вот как выглядит мой оригинальный файл pdf:

Когда я устанавливаю setEncodingRate на 0,8, это выглядит так:

Мой размер выходного файла составляет 850Ko, что даже больше, чем у Jpeg (около 600Ko), и более низкое качество.
При 0,1 setEncodingRate размер файла значительно мал, 111 Ko, но в основном не читается.

Итак, в основном я пытаюсь получить меньшие выходные файлы (<600 КБ) с лучшим качеством, и мне интересно, возможно ли это с форматом Jpeg2000. </p>
public class ImageConverter {
public void compressor(String inputFile, String outputFile) throws IOException {
J2KImageWriteParam iwp = new J2KImageWriteParam();
PDDocument document = PDDocument.load(new File (inputFile), MemoryUsageSetting.setupMixed(10485760L));
PDFRenderer pdfRenderer = new PDFRenderer(document);
int nbPages = document.getNumberOfPages();
int pageCounter = 0;
BufferedImage image;
for (PDPage page : document.getPages()) {
if (page.hasContents()) {
image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);
if (image == null)
{
System.out.println("If no registered ImageReader claims to be able to read the resulting stream");
}
Iterator writers = ImageIO.getImageWritersByFormatName("JPEG2000");
String name = null;
ImageWriter writer = null;
while (name != "com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriter") {
writer = (ImageWriter) writers.next();
name = writer.getClass().getName();
System.out.println(name);
}
File f = new File(outputFile+"_"+pageCounter+".jp2");
long s = System.currentTimeMillis();
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
writer.setOutput(ios);
J2KImageWriteParam param = (J2KImageWriteParam) writer.getDefaultWriteParam();
IIOImage ioimage = new IIOImage(image, null, null);
param.setSOP(true);
param.setWriteCodeStreamOnly(true);
param.setProgressionType("layer");
param.setLossless(true);
param.setCompressionMode(J2KImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("JPEG2000");
param.setCompressionQuality(0.01f);
param.setEncodingRate(1.01);
param.setFilter(J2KImageWriteParam.FILTER_53 );
writer.write(null, ioimage, param);
System.out.println(System.currentTimeMillis() - s);
writer.dispose();
ios.flush();
ios.close();
image.flush();
pageCounter++;
}
}
}
public static void main(String[] args) {
String input = "E:/IMGTEST/mail-DOC0002.pdf";
String output = "E:/IMGTEST/mail-DOC0002/docamail-DOC0002-";
ImageConverter imgcv = new ImageConverter();
try {
imgcv.compressor(input, output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}