Размещение изображения формата А4 в виде страницы внутри файла PDF с использованием pdfbox - PullRequest
2 голосов
/ 16 июня 2019

У меня есть файл jpg: 2480 x 3508 пикселей, который подходит для 4A. Мне нужно поместить этот файл в PDF.

PDDocument doc = new PDDocument();
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream certificate = getClass().getResourceAsStream("certificate.jpg");
BufferedImage bi = ImageIO.read(certificate);
PDPage page = new PDPage(PDRectangle.A4);//<<---- A4
doc.addPage(page);

PDImageXObject pdImageXObject = LosslessFactory.createFromImage(doc, bi);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, 
PDPageContentStream.AppendMode.APPEND, false);
contentStream.drawImage(pdImageXObject, 0, -10);
contentStream.close();
doc.save( "c://appfiles//PDF_image.pdf" );
doc.close();

Проблема в том, что сгенерированный файл полностью отключен и не соответствует размеру А4 в PDF.

Исходный файл: https://i.stack.imgur.com/a0ZHG.jpg
Сгенерированный файл: https://www.dropbox.com/s/ufo3246b6eoz3f5/PDF_image.pdf?dl=1

Я знаю, что могу играть с шириной и высотой, но затем качество печати падает, и я думаю, что PDRectangle.A4 был предназначен для предотвращения подобных манипуляций.

Как сделать так, чтобы 2480 x 3508 pixels соответствовал PDRectangle.A4 pdf странице?

Спасибо

1 Ответ

1 голос
/ 16 июня 2019

Размеры PDF указаны на 72 dpi,

System.out.println(PDRectangle.A4); // output is [0.0,0.0,595.27563,841.8898]

Ваше изображение имеет разрешение 300 точек на дюйм, поэтому вы должны масштабировать:

contentStream.drawImage(pdImageXObject, 0f, -10f, 
        pdImageXObject.getWidth() / 300f * 72, 
        pdImageXObject.getHeight() / 300f * 72);

Я также рекомендую использовать JPEGFactory.createFromStream(), это быстрее, меньше и использует поток jpeg напрямую. Ваш файл PDF результата составляет 580 КБ вместо 2555 КБ.

...