Потеря разрешения изображения при преобразовании PDF в изображение и обратно в PDF в Java (PDFBox)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Потеря разрешения изображения при преобразовании PDF в изображение и обратно в PDF в Java (PDFBox)

Сообщение Anonymous »

Для меня была написана Java-программа, которая брала одностраничный PDF-файл высотой 36 дюймов и шириной 48 дюймов и «разрезала» его на три отдельные страницы: 12x36, 24x36 и 12x36, которые я затем распечатывал.< /p>
Предпосылка для контекста: я продаю шаблоны Canva для научных ярмарок, выпускных фотоколлажей и т. д., которые крепятся на картон размером 36 x 48 дюймов. Шаблоны в Canva имеют размер 36 x 48 и экспортируются в формате «PDF Print» того же размера. Как только я получаю PDF-файл, я запускаю его через программное обеспечение, поскольку целью программного обеспечения было создание трех отдельных страниц. до нужного размера, а не один большой отпечаток, который будет сложно приклеить к тройному сгибу и который будет слишком большим при транспортировке.
Программа конвертирует PDF в JPG, выполняет действие «нарезки». , затем преобразует его обратно в PDF для печати. ​​Проблема, с которой я столкнулся, заключается в том, что во время этого процесса разрешение значительно снижается.
Я ни в коем случае не программист, но мне удалось открыть программу в Затмение и исследование логики. Я провел небольшое исследование и увидел, что инструменты PDFBox могут устанавливать разрешение JPG во время преобразования из PDF, что я и сделал, используя некоторый код AI, однако это не помогло разрешению.
Мой сын сказал конвертировать в PNG без потерь, и снова я попросил ИИ написать мне код, который тоже, похоже, не работал.
В моей программе есть 4 .java файлы. Файл с кодом преобразования, который я пытаюсь отредактировать, называется .separate.
Два вопроса:
Чтобы скомпилировать это для тестирования, нужны ли мне все 4 файла открыть в Eclipse, когда я экспортирую и создаю работоспособный файл JAR?
Есть ли в коде что-то очевидное, что неправильно? Опять же, я не программист, но стараюсь.
Заранее спасибо за любые предложения.
Вот код для PNG опция в .separate:

Код: Выделить всё

package abc;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.PDFRenderer;

public class Separate {
private File file;
private static PDDocument pdf;
private float lefta;
private float leftb;
private float centrea;
private float centreb;
private float righta;
private float rightb;
private int height;

public Separate(File f, float[] nums) {
file = f;
lefta = nums[0];
leftb = nums[1];
centrea = nums[2];
centreb = nums[3];
righta = nums[4];
rightb = nums[5];
}

public PDDocument Divide_pdf() throws IOException {
pdf = Loader.loadPDF(file);

BufferedImage image = convertto_png(pdf);

height = image.getHeight();
List images = operate(image);

PDDocument proc_document = convertto_pdf(images);
pdf.close();
return proc_document;
}

public BufferedImage convertto_png(PDDocument doc) throws IOException {
PDFRenderer renderer = new PDFRenderer(doc);

// Set DPI (e.g., 600 DPI) for high-resolution rendering
int dpi = 600;
BufferedImage img = renderer.renderImageWithDPI(0, dpi);
return img;
}

public List operate(BufferedImage image) throws IOException {
lefta = lefta * 72;
leftb = leftb * 72;
centrea = centrea * 72;
centreb = centreb * 72;
righta = righta * 72;
rightb = rightb * 72;
BufferedImage img1 = image.getSubimage(((int) lefta), 0, ((int) (leftb - lefta)), image.getHeight());
BufferedImage img2 = image.getSubimage(((int) centrea), 0, (((int) centreb) - ((int) centrea)), image.getHeight());
BufferedImage img3 = image.getSubimage(((int) righta), 0, (((int) rightb) - ((int) righta) - 1), image.getHeight());
List images = new ArrayList();
images.add(img1);
images.add(img2);
images.add(img3);
return images;
}

public PDDocument convertto_pdf(List files) throws IOException {
List images = new ArrayList();
for (BufferedImage image : files) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();

// Save as PNG with high quality
ImageWriter pngWriter = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam pngWriteParam = pngWriter.getDefaultWriteParam();

ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
pngWriter.setOutput(ios);
pngWriter.write(null, new javax.imageio.IIOImage(image, null, null), pngWriteParam);
byte[] bytes = baos.toByteArray();
images.add(bytes);
}
PDDocument document = new PDDocument();
List
  rectangles = new ArrayList();
PDRectangle rec = new PDRectangle(0, 0, ((int) leftb), height);
PDRectangle rec1 = new PDRectangle(0, 0, (((int) centreb) - ((int) centrea)), height);
PDRectangle rec2 = new PDRectangle(0, 0, (((int) rightb) - ((int) righta) - 1), height);
rectangles.add(rec);
rectangles.add(rec1);
rectangles.add(rec2);
int i = 0;
for (byte[] f : images) {
PDPage page = new PDPage();
page.setMediaBox(rectangles.get(i));
document.addPage(page);
PDImageXObject img = PDImageXObject.createFromByteArray(document, f, "output");
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(img, 0, 0);
contentStream.close();
i++;
}
return document;
}
}
Изображение
< img alt="Пример после страницы 1" src="https://i.sstatic.net/vhknLCo7.jpg" />
Изображение
Изображение


Подробнее здесь: https://stackoverflow.com/questions/793 ... in-java-pd
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»