PDFBox не пишет сообщение, которое я хочу, на странице - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь найти хотя бы час в своем коде, но не могу найти ошибку.Я использую PDFBox для создания PDF-файлов ( PDFBox HelloWorld Пример ).Чтобы узнать, как работает PDFBox, я просто хотел создать несколько страниц с «hello world» и номером страницы, например «hello world 1», «hello world 2» и так далее.Как видите, я создал цикл for для создания шести страниц.

private void drawPDF(PDDocument doc, File file) throws IOException {
    for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
        PDPage page = new PDPage(PDRectangle.A4);
        doc.addPage(page);
        PDFont font = PDType1Font.HELVETICA_BOLD;
        String message = "hello world " + (pageIndex + 1);
        float stringHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() * FONT_SIZE;
        PDRectangle pageSize = page.getMediaBox();
        try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
            contents.beginText();
            contents.setFont(font, FONT_SIZE);
            contents.setTextMatrix(Matrix.getTranslateInstance(0, pageSize.getHeight() - stringHeight / 1000f));
            contents.showText(message);
            System.out.println(message + " - " + doc.getNumberOfPages());
            contents.endText();
        }
    }
    doc.save(file);
}

В моей консоли я получаю следующий вывод (первое число - pageIndex, второе число - doc.getNumberOfPages ()):

hello world 1 - 1
hello world 2 - 2
hello world 3 - 3
hello world 4 - 4
hello world 5 - 5
hello world 6 - 6

Это моя функция загрузки для просмотраpdf.

private final ObservableList<Image> pdfFilePages = FXCollections.observableArrayList();


private void loadFile(File file) throws FileNotFoundException, IOException {
    if (file != null) {
        ByteBuffer buffer = null;
        try (RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel()) {
            buffer = ByteBuffer.allocate((int) channel.size());
            channel.read(buffer);
            buffer.flip();

            PDFFile pdfFile = new PDFFile(buffer);
            List<Image> pages = new ArrayList<>();
            for (int i = 0; i < pdfFile.getNumPages(); i++) {
                PDFPage page = pdfFile.getPage(i, true);
                System.out.println("page: " + i + " - " + pdfFile.getNumPages());
                java.awt.geom.Rectangle2D bbox = page.getBBox();
                java.awt.geom.Rectangle2D rect = new Rectangle(0, 0, (int) bbox.getWidth(), (int) bbox.getHeight());
                BufferedImage buffImage = new BufferedImage((int) (bbox.getWidth() * 2d),
                        (int) (bbox.getHeight() * 2d), BufferedImage.TYPE_INT_RGB);
                java.awt.Image awtImage = page.getImage((int) (bbox.getWidth() * 2.0),
                        (int) (bbox.getHeight() * 2.0), rect, null, true, true);
                java.awt.Graphics2D bufImageGraphics = buffImage.createGraphics();
                bufImageGraphics.drawImage(awtImage, 0, 0, null);

                Image image = SwingFXUtils.toFXImage(buffImage, null);
                pages.add(image);
            }
            pdfFilePages.addAll(pages);
        }
    }
}

Это то, что я получаю в своей консоли:

page: 0 - 6
page: 1 - 6
page: 2 - 6
page: 3 - 6
page: 4 - 6
page: 5 - 6

Когда я загружаю pdf-файл для отображения содержимого в моем приложении, я получаю "hello world 1 - 1«для первой и второй страницы.На следующих страницах есть "привет мир 2 - 2", чтобы "привет мир 5 - 5".Я не понимаю, почему я получаю две страницы "Привет мир 1 - 1".Я надеюсь, что кто-то может объяснить мне, где я допустил ошибку.

1 Ответ

0 голосов
/ 13 ноября 2018

С помощью mkl я нашел ошибку в своем коде. Цикл for должен начинаться с 1 и выполняться до тех пор, пока индекс не станет равным pdfFile.getNumPages (). Метод getPage () возвращает первую страницу, когда индекс равен 0. Поскольку индекс равен 1 во второй итерации, первая страница будет передана дважды. Последняя страница не будет пройдена, поскольку цикл завершен. Это кажется правильным подходом.

private void loadFile(File file) throws FileNotFoundException, IOException {
    if (file != null) {
        ByteBuffer buffer = null;
        try (RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel()) {
            buffer = ByteBuffer.allocate((int) channel.size());
            channel.read(buffer);
            buffer.flip();

            PDFFile pdfFile = new PDFFile(buffer);
            List<Image> pages = new ArrayList<>();
            for (int i = 1; i <= pdfFile.getNumPages(); i++) {
                PDFPage page = pdfFile.getPage(i, true);
                System.out.println("page: " + i + " - " + pdfFile.getNumPages());
                java.awt.geom.Rectangle2D bbox = page.getBBox();
                java.awt.geom.Rectangle2D rect = new Rectangle(0, 0, (int) bbox.getWidth(), (int) bbox.getHeight());
                BufferedImage buffImage = new BufferedImage((int) (bbox.getWidth() * 2d),
                        (int) (bbox.getHeight() * 2d), BufferedImage.TYPE_INT_RGB);
                java.awt.Image awtImage = page.getImage((int) (bbox.getWidth() * 2.0),
                        (int) (bbox.getHeight() * 2.0), rect, null, true, true);
                java.awt.Graphics2D bufImageGraphics = buffImage.createGraphics();
                bufImageGraphics.drawImage(awtImage, 0, 0, null);

                Image image = SwingFXUtils.toFXImage(buffImage, null);
                pages.add(image);
            }
            pdfFilePages.addAll(pages);
        }
    }
}
...