【问题标题】:Create pdf file from ArrayList<String> using pdfbox in JAVA在 JAVA 中使用 pdfbox 从 ArrayList<String> 创建 pdf 文件
【发布时间】:2013-07-04 14:23:22
【问题描述】:

我需要帮助才能从 ArrayList 字符串创建 PDF 文件。
我试图解决这个问题很长时间但我没有成功,有人可以帮助我吗?

我不知道在这里还能写什么我认为标题说明了一切。那么有没有人有同样的问题或知道如何创建 PDF 文件?

parsedText 是我从另一个 PDF 文件中提取的整个文本。

代码:

    String[] splitText = parsedText.split("\\."); 
    newList = new ArrayList<String>(Arrays.asList(splitText));


    PDDocument doc = null;
    PDPage page = null;
    try{
        doc = new PDDocument();
        page = new PDPage();

        doc.addPage(page);
        PDFont font = PDType1Font.HELVETICA;
        PDPageContentStream content = new PDPageContentStream(doc,page);

        content.beginText();
        content.setFont(font, 12);
        content.moveTextPositionByAmount(100, 700);
        String text = "";
        for(int i=0; i<newList.size();i++)
        {
            if(sentence.isEmpty()) continue;
            content.drawString(newList.get(i) + "\n");

        }

        content.endText();
        content.close();
        doc.save("nameoffile.pdf");
        doc.close();
        System.out.print("Pages" + pdDoc.getNumberOfPages());

    }catch(Exception e){
        System.out.println(e);
    }

【问题讨论】:

  • pdfbox.apache.org/cookbook/documentcreation.html 究竟是什么不工作,你有什么尝试?
  • 我没有成功。怎么会这样?愿意向我们展示您失败的尝试吗?
  • arraylist 中的每个索引都是一个句子,当我尝试在 pdf 文件中写入 arraylist 时,它会在 arraylist 中写入一行。它不会像普通文本那样中断并以新行开头。
  • 你必须定位文本。查看我第一条评论中的链接。注意第二个示例中的contentStream.moveTextPositionByAmount( 100, 700 ); 行。
  • 我确实有那行代码,我会尝试编辑问题并添加代码。正如你所看到的,我是 SOF 的新手,很抱歉我的帖子很糟糕。

标签: java pdf pdfbox


【解决方案1】:

你需要:

for(int i=0; i<newList.size();i++)
{
    if(sentence.isEmpty()) continue;
    content.drawString(newList.get(i));
    content.moveTextPositionByAmount(0, LINE_HEIGHT);
}  

更新每一行的文本位置。可以把它想象成绘制到图形上下文。

如果你想要 "" 的空行 - 条目然后删除循环中的第一行。

【讨论】:

  • 谢谢你,这让我更近了一步!我会努力改善我现在的结果
【解决方案2】:

这是一个老问题和答案,我正在通过修改您的代码来提出一个新答案,因为 Apache PdfBox API 中的多种方法已被弃用。

首先你不需要newList = new ArrayList&lt;String&gt;(Arrays.asList(splitText));这一行,因为你可以直接在String[]上工作。

您的代码中的第二个问题是您正在使用\n 创建一个新行并且在创建 pdf 的情况下不起作用。您的所有句子都将打印在一行中。您必须明确地将文本指针定位到下一行。

我已将硬编码内容放入 String[] splitText 。我的线宽为 20 点。

附上生成的pdf文件的图片。

public static void createPdf() {
    String[] splitText = new String[] { "Line 1", "Line 2", "", "Line 3 " };
    try (PDDocument doc = new PDDocument();) {
        PDPage page = new PDPage();
        doc.addPage(page);
        PDFont font = PDType1Font.HELVETICA;
        PDPageContentStream content = new PDPageContentStream(doc, page);
        content.setFont(font, 12);
        int lines = 1;
        for (String sentence : splitText) {
        if (sentence.isEmpty()) {
            continue;
        }
        content.beginText();
        content.newLineAtOffset(100, 700 - 20f * lines);
        content.showText(sentence);
        content.endText();
        ++lines;
        }
        content.close();
        doc.save("nameoffile.pdf");
        System.out.print("Pages" + doc.getNumberOfPages());
    } catch (Exception e) {
        System.out.println(e);
    }
    }

【讨论】:

  • 虽然您的代码可能是正确的,但与公认的答案相比,它有一个(非常小的)弱点:您在每一行都使用beginTextendText,而不是相对地这样做。所以你的 PDF 会更长。
  • @TilmanHausherr:感谢您的指出。我对这个 API 很陌生,我在编写非弃用代码时有点吃力,因为大多数帖子都使用弃用的代码,所以我想提出这个答案。我会尝试修改代码,但您也可以随意这样做。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多