当前位置: 首页 > 知识库问答 >
问题:

如何使用Apache pdfbox在PDF中生成多行

段干浩荡
2023-03-14

我正在使用Pdfbox使用Java生成PDF文件。问题是,当我在文档中添加长文本内容时,它没有正确显示。只显示它的一部分。这也是单行的。

我希望文本在多行。

下面给出了我的代码:

PDPageContentStream pdfContent=new PDPageContentStream(pdfDocument, pdfPage, true, true);

pdfContent.beginText();
pdfContent.setFont(pdfFont, 11);
pdfContent.moveTextPositionByAmount(30,750);            
pdfContent.drawString("I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox");
pdfContent.endText();

我的输出:

共有1个答案

江正德
2023-03-14

添加到Mark的答案中,您可能想知道在哪里拆分长字符串。您可以使用pdfont方法getStringWidth

将所有内容放在一起,您会得到如下内容(根据PDFBox版本的不同有一些小的差异):

PDDocument doc = null;
try
{
    doc = new PDDocument();
    PDPage page = new PDPage();
    doc.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(doc, page);

    PDFont pdfFont = PDType1Font.HELVETICA;
    float fontSize = 25;
    float leading = 1.5f * fontSize;

    PDRectangle mediabox = page.findMediaBox();
    float margin = 72;
    float width = mediabox.getWidth() - 2*margin;
    float startX = mediabox.getLowerLeftX() + margin;
    float startY = mediabox.getUpperRightY() - margin;

    String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 
    List<String> lines = new ArrayList<String>();
    int lastSpace = -1;
    while (text.length() > 0)
    {
        int spaceIndex = text.indexOf(' ', lastSpace + 1);
        if (spaceIndex < 0)
            spaceIndex = text.length();
        String subString = text.substring(0, spaceIndex);
        float size = fontSize * pdfFont.getStringWidth(subString) / 1000;
        System.out.printf("'%s' - %f of %f\n", subString, size, width);
        if (size > width)
        {
            if (lastSpace < 0)
                lastSpace = spaceIndex;
            subString = text.substring(0, lastSpace);
            lines.add(subString);
            text = text.substring(lastSpace).trim();
            System.out.printf("'%s' is line\n", subString);
            lastSpace = -1;
        }
        else if (spaceIndex == text.length())
        {
            lines.add(text);
            System.out.printf("'%s' is line\n", text);
            text = "";
        }
        else
        {
            lastSpace = spaceIndex;
        }
    }
        
    contentStream.beginText();
    contentStream.setFont(pdfFont, fontSize);
    contentStream.moveTextPositionByAmount(startX, startY);            
    for (String line: lines)
    {
        contentStream.drawString(line);
        contentStream.moveTextPositionByAmount(0, -leading);
    }
    contentStream.endText(); 
    contentStream.close();

    doc.save("break-long-string.pdf");
}
finally
{
    if (doc != null)
    {
        doc.close();
    }
}

(breaklongstring.java testtestbreakstringfor PDFBox 1.8.x)

PDDocument doc = null;
try
{
    doc = new PDDocument();
    PDPage page = new PDPage();
    doc.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(doc, page);

    PDFont pdfFont = PDType1Font.HELVETICA;
    float fontSize = 25;
    float leading = 1.5f * fontSize;

    PDRectangle mediabox = page.getMediaBox();
    float margin = 72;
    float width = mediabox.getWidth() - 2*margin;
    float startX = mediabox.getLowerLeftX() + margin;
    float startY = mediabox.getUpperRightY() - margin;

    String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 
    List<String> lines = new ArrayList<String>();
    int lastSpace = -1;
    while (text.length() > 0)
    {
        int spaceIndex = text.indexOf(' ', lastSpace + 1);
        if (spaceIndex < 0)
            spaceIndex = text.length();
        String subString = text.substring(0, spaceIndex);
        float size = fontSize * pdfFont.getStringWidth(subString) / 1000;
        System.out.printf("'%s' - %f of %f\n", subString, size, width);
        if (size > width)
        {
            if (lastSpace < 0)
                lastSpace = spaceIndex;
            subString = text.substring(0, lastSpace);
            lines.add(subString);
            text = text.substring(lastSpace).trim();
            System.out.printf("'%s' is line\n", subString);
            lastSpace = -1;
        }
        else if (spaceIndex == text.length())
        {
            lines.add(text);
            System.out.printf("'%s' is line\n", text);
            text = "";
        }
        else
        {
            lastSpace = spaceIndex;
        }
    }

    contentStream.beginText();
    contentStream.setFont(pdfFont, fontSize);
    contentStream.newLineAtOffset(startX, startY);
    for (String line: lines)
    {
        contentStream.showText(line);
        contentStream.newLineAtOffset(0, -leading);
    }
    contentStream.endText(); 
    contentStream.close();

    doc.save(new File(RESULT_FOLDER, "break-long-string.pdf"));
}
finally
{
    if (doc != null)
    {
        doc.close();
    }
}

(breaklongstring.java testtestbreakstringfor PDFBox 2.0.x)

这看起来不出所料。

当然,还有许多改进要做,但这应该说明如何做到这一点。

String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 
String textNL = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox.\nFurthermore, I have added some newline characters to the string at which lines also shall be broken.\nIt should work alright like this...";

您可以简单地替换

String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 
List<String> lines = new ArrayList<String>();
int lastSpace = -1;
while (text.length() > 0)
{
    [...]
}

在上面的解决方案中

String textNL = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox.\nFurthermore, I have added some newline characters to the string at which lines also shall be broken.\nIt should work alright like this..."; 
List<String> lines = new ArrayList<String>();
for (String text : textNL.split("\n"))
{
    int lastSpace = -1;
    while (text.length() > 0)
    {
        [...]
    }
}

(来自breaklongstring.java testtestbreakstringnl)

 类似资料:
  • 在我的项目中,我需要在Apache pdfbox api的帮助下生成发票。到目前为止,我可以在生成的pdf中插入图像、文本,但在生成表格时发现困难。我甚至找不到一个示例模板。如果有人有,请提供链接。 注意:我不必使用iText 提前感谢

  • 有没有一个包生成PDF(与样式)从网页与拉维勒。我尝试使用barryvdh/laravel-dompdf,但是PDF没有样式化。Laravel有没有更好的解决方案

  • 我有一个问题,生成一个分层的pdf页面使用PDFbox。我在这里看到过几篇关于这个主题的文章,但它们都集中在将页面从另一个pdf导入到目标文档中。 我创建了一个类MapImage,它包含纸张大小(以像素为单位)和一个我想要添加到单个pdf页面的BufferedImages列表。 不幸的是,生成的PDF已损坏。我试图创建一个页面,只有一个图像(没有图层),但不幸的是,我不知道如何做到这一点。 有人遇

  • 我试图用这个库创建一个pdf,实现最简单的de docs示例 使用url并直接从模板中呈现,如下所示 这是模板文件的 html 但是当我尝试访问url时,错误是这样的 /pdf/“NoneType”对象处的AttributeError没有属性“endswith” 我如何能修理它 这是回溯 回溯:get_response139.response=response中的文件“/usr/local/lib

  • 我知道如何生成单个超文本标记语言页面。我想知道如何从多个超文本标记语言页面生成的pdf生成单个pdf页面。 例如,有和另一个文件我可以生成单独的pdf文件和分别来自html。我可以将它们写入文件系统,然后像iTextConcatenate示例中那样连接它们。 我只是想知道我是否可以在不将它们写入文件系统的情况下动态地组合此操作。我无法识别丢失的链接

  • 如何通过< code>ItextSharp合并多个pdf文件(运行时生成),然后打印它们。 我找到了下面的链接,但考虑到存储的pdf文件不是我的情况,该方法需要pdf名称。 我有多个报告,我将通过以下方法将它们转换为< code>pdf文件: 现在我想将所有生成的文件()合并到一个pdf文件中以打印它

  • 我使用django wkhtmltopdf在我的webapp中生成pdf,使用djang o集成服务器可以正常工作,但当我使用IIS 7.5或8时,会出现以下错误:WindowsError[error 6]句柄无效 环境:

  • 问题内容: 我有一个PHP应用程序,需要用查询结果生成PDF。被发现的最简单的方法是使用DOMPDF为我生成PDF。因此,做了一个为我生成HTML的函数,然后将其传递给DOMPDF。在开发和测试环境中,一切都很好,但是在生产环境中,我在内存使用方面存在一些问题。 因此,我想知道我的策略是最好的还是有更好更好的方法来做到这一点。 你会怎么做? 问题答案: 我曾经做过一个生成PDF的PHP项目。我使用