程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

PDFBox 没有将我想要的信息写入页面

发布于2021-08-03 08:36     阅读(318)     评论(0)     点赞(17)     收藏(3)


我正在寻找至少一个小时的代码,但我找不到错误。我正在使用 PDFBox 创建 PDF(PDFBox HelloWorld Example)。要了解 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”。以下页面有“hello world 2 - 2”到“hello world 5 - 5”。我不明白为什么我会收到两页“hello world 1 - 1”。我希望有人可以向我解释我哪里出错了。


解决方案


在 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);
        }
    }
}


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/254445/d99486c81da3a1477365/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)