PDFBox renderImage создает неправильные размеры изображения в указанном масштабе - PullRequest
0 голосов
/ 10 ноября 2019

Я использую очень полезный PDFBox для создания простого графического интерфейса для печати PDF.

Однако я заметил серьезную проблему с конкретным документом.

Когда я указываю конкретный масштабный коэффициент длярендеринг, ожидаемый размер выходного изображения отличается.

Что хуже? коэффициент масштабирования, используемый для результирующего изображения по горизонтальной оси, отличается от коэффициента масштабирования по вертикальной оси.

Вот код, который я использовал:

/**
 * @param pdfPath The path to the pdf document
 * @param page The pdf page number(is zero based)
 */
public BufferedImage loadPdfImage(String pdfPath, int page) {
    File file = new File(pdfPath);

    try (PDDocument doc = PDDocument.load(file)) {

        pageCount = doc.getNumberOfPages();
        PDPage pDPage = doc.getPage(page);

       float w = pDPage.getCropBox().getWidth();
       float h = pDPage.getCropBox().getHeight();

       System.out.println("Pdf opening: width: "+w+", height: "+h);


        PDFRenderer renderer = new PDFRenderer(doc);

        float dpiRatio =  1.5f;

        BufferedImage img = renderer.renderImage(page, dpiRatio);

 float dpiXRatio = img.getWidth() / w;
 float dpiYRatio = img.getHeight()/ h;


       System.out.println("dpiXRatio: "+dpiXRatio+", dpiYRatio: "+dpiYRatio);

        return img;
    } catch (IOException ex) {
        System.out.println( "invalid pdf found. Please check");
    }

    return null;
}

Приведенный выше код загружает большинство документов PDFчто я его примерил и преобразует данные страницы в них в объекты BufferedImage.

Однако для указанного документа, похоже, невозможно воспроизвести преобразованное изображение с предоставленным масштабным коэффициентом.

Что-то не так с моим кодом? или это известная ошибка?

Спасибо.

РЕДАКТИРОВАТЬ

Я использую PDFBOX v2.0.15

И страницуне имеет вращения.

1 Ответ

1 голос
/ 11 ноября 2019

Ошибка была моей;по большей части.

Я использовал MediaBox для вычисления масштабных коэффициентов, и, к сожалению, MediaBox и CropBox рассматриваемого PDF-файла не совпадали.

Например:

cropbox-rect: [8.50394,34.0157,586.496,807.984]
mediabox-rect: [0.0,0.0,595.0,842.0]

После внесения в них поправок масштабные коэффициенты лучше соответствовали по обеим осям, за исключением ошибок из-за того, что размеры изображения являются целыми числами.

Для меня это достаточно незначительнооднако, чтобы пренебречь.

При штамповке все, что мне нужно было сделать, - это внести необходимые исправления в коробку. Например, чтобы нарисовать изображение (штамп) на P(x,y), я бы сделал:

        x += cropBox.getLowerLeftX();
        y += cropBox.getLowerLeftY();

перед вызовом функции рисования изображения.

Все получилось отлично!

...