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

时间:2022-12-08 21:10:50

I am using Pdfbox to generate PDF files using Java. The problem is that when i add long text contents in the document, it is not displayed properly. Only a part of it is displayed. That too in a single line.

我正在使用Pdfbox使用Java生成PDF文件。问题是当我在文档中添加长文本内容时,它无法正确显示。仅显示其中的一部分。这也是一条线。

I want text to be in multiple lines.

我希望文本有多行。

My code is given below:

我的代码如下:

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();

My output:

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

5 个解决方案

#1


68  

Adding to the answer of Mark you might want to know where to split your long string. You can use the PDFont method getStringWidth for that.

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

Putting everything together you get something like this (with minor differences depending on the PDFBox version):

将所有内容放在一起就可以获得类似的内容(根据PDFBox版本的不同而略有不同):

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.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 test testBreakString for PDFBox 1.8.x)

(用于PDFBox 1.8.x的BreakLongString.java测试testBreakString)

PDFBox 2.0.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 test testBreakString for PDFBox 2.0.x)

(用于PDFBox 2.0.x的BreakLongString.java测试testBreakString)

The result

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

This looks as expected.

这看起来像预期的那样

Of course there are numerous improvements to make but this should show how to do it.

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

Adding unconditional line breaks

In a comment aleskv asked:

在评论中,aleskv问道:

could you add line breaks when there are \n in the string?

你可以在字符串中有\ n时添加换行符吗?

One can easily extend the solution to unconditionally break at newline characters by first splitting the string at '\n' characters and then iterating over the split result.

通过首先将字符串拆分为'\ n'字符,然后迭代拆分结果,可以轻松地扩展解决方案以无条件地中断换行符。

E.g. if instead of the long string from above

例如。如果不是从上面的长串

String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 

you want to process this even longer string with embedded new line characters

您希望使用嵌入的新行字符处理这个更长的字符串

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...";

you can simply replace

你可以简单地替换

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)
{
    [...]
}

in the solutions above by

在上面的解决方案中

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)
    {
        [...]
    }
}

(from BreakLongString.java test testBreakStringNL)

(来自BreakLongString.java测试testBreakStringNL)

The result:

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

#2


7  

I know it's a bit late, but i had a little problem with mkl's solution. If the last line would only contain one word, your algorithm writes it on the previous one.

我知道这有点晚了,但我对mkl的解决方案有点问题。如果最后一行只包含一个单词,则算法会将其写入前一行。

For Example: "Lorem ipsum dolor sit amet" is your text and it should add a line break after "sit".

例如:“Lorem ipsum dolor sit amet”是你的文字,它应该在“坐”后添加换行符。

Lorem ipsum dolor sit
amet

But it does this:

但它这样做:

Lorem ipsum dolor sit amet

I came up with my own solution i want to share with you.

我提出了自己想要与你分享的解决方案。

/**
 * @param text The text to write on the page.
 * @param x The position on the x-axis.
 * @param y The position on the y-axis.
 * @param allowedWidth The maximum allowed width of the whole text (e.g. the width of the page - a defined margin).
 * @param page The page for the text.
 * @param contentStream The content stream to set the text properties and write the text.
 * @param font The font used to write the text.
 * @param fontSize The font size used to write the text.
 * @param lineHeight The line height of the font (typically 1.2 * fontSize or 1.5 * fontSize).
 * @throws IOException
 */
private void drawMultiLineText(String text, int x, int y, int allowedWidth, PDPage page, PDPageContentStream contentStream, PDFont font, int fontSize, int lineHeight) throws IOException {

    List<String> lines = new ArrayList<String>();

    String myLine = "";

    // get all words from the text
    // keep in mind that words are separated by spaces -> "Lorem ipsum!!!!:)" -> words are "Lorem" and "ipsum!!!!:)"
    String[] words = text.split(" ");
    for(String word : words) {

        if(!myLine.isEmpty()) {
            myLine += " ";
        }

        // test the width of the current line + the current word
        int size = (int) (fontSize * font.getStringWidth(myLine + word) / 1000);
        if(size > allowedWidth) {
            // if the line would be too long with the current word, add the line without the current word
            lines.add(myLine);

            // and start a new line with the current word
            myLine = word;
        } else {
            // if the current line + the current word would fit, add the current word to the line
            myLine += word;
        }
    }
    // add the rest to lines
    lines.add(myLine);

    for(String line : lines) {
        contentStream.beginText();
        contentStream.setFont(font, fontSize);
        contentStream.moveTextPositionByAmount(x, y);
        contentStream.drawString(line);
        contentStream.endText();

        y -= lineHeight;
    }

}

#3


3  

Just draw the string in a position below, typically done within a loop:

只需在下面的位置绘制字符串,通常在循环内完成:

float textx = margin+cellMargin;
float texty = y-15;
for(int i = 0; i < content.length; i++){
    for(int j = 0 ; j < content[i].length; j++){
        String text = content[i][j];
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(textx,texty);
        contentStream.drawString(text);
        contentStream.endText();
        textx += colWidth;
    }
    texty-=rowHeight;
    textx = margin+cellMargin;
}

These are the important lines:

这些是重要的路线:

contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString(text);
contentStream.endText();

Just keep drawing new strings in new positions. For an example using a table, see here: http://fahdshariff.blogspot.ca/2010/10/creating-tables-with-pdfbox.html

只需继续在新的位置绘制新的字符串。有关使用表格的示例,请参见此处:http://fahdshariff.blogspot.ca/2010/10/creating-tables-with-pdfbox.html

#4


2  

contentStream.moveTextPositionByAmount(textx,texty) is key point.

contentStream.moveTextPositionByAmount(textx,texty)是关键点。

say for example if you are using a A4 size means 580,800 is width and height correspondling(approximately). so you have move your text based on the position of your document size.

例如,如果您使用A4尺寸意味着580,800的宽度和高度相对应(大约)。因此,您可以根据文档大小的位置移动文本。

PDFBox supports varies page format . so the height and width will vary for different page format

PDFBox支持不同的页面格式。因此,不同页面格式的高度和宽度会有所不同

#5


2  

///// FOR PDBOX 2.0.X
//  FOR ADDING DYNAMIC PAGE ACCORDING THE LENGTH OF THE CONTENT

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class Document_Creation {

   public static void main (String args[]) throws IOException {

       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.An essay is, generally, a piece of writing that gives the author's own argument — but the definition is vague, overlapping with those of an article, a pamphlet, and a short story. Essays have traditionally been sub-classified as formal and informal. Formal essays are characterized by serious purpose, dignity, logical organization, length,whereas the informal essay is characterized by the personal element (self-revelation, individual tastes and experiences, confidential manner), humor, graceful style, rambling structure, unconventionality or novelty of theme.Lastly, one of the most attractive features of cats as housepets is their ease of care. Cats do not have to be walked. They get plenty of exercise in the house as they play, and they do their business in the litter box. Cleaning a litter box is a quick, painless procedure. Cats also take care of their own grooming. Bathing a cat is almost never necessary because under ordinary circumstances cats clean themselves. Cats are more particular about personal cleanliness than people are. In addition, cats can be left home alone for a few hours without fear. Unlike some pets, most cats will not destroy the furnishings when left alone. They are content to go about their usual activities until their owners return."; 
           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);
           float currentY=startY;
           for (String line: lines)
           {
               currentY -=leading;

               if(currentY<=margin)
               {

                   contentStream.endText(); 
                   contentStream.close();
                   PDPage new_Page = new PDPage();
                   doc.addPage(new_Page);
                   contentStream = new PDPageContentStream(doc, new_Page);
                   contentStream.beginText();
                   contentStream.setFont(pdfFont, fontSize);
                   contentStream.newLineAtOffset(startX, startY);
                   currentY=startY;
               }
               contentStream.showText(line);
               contentStream.newLineAtOffset(0, -leading);
           }
           contentStream.endText(); 
           contentStream.close();

           doc.save("C:/Users/VINAYAK/Desktop/docccc/break-long-string.pdf");
       }
       finally
       {
           if (doc != null)
           {
               doc.close();
           }
       }

   }  
}

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

#1


68  

Adding to the answer of Mark you might want to know where to split your long string. You can use the PDFont method getStringWidth for that.

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

Putting everything together you get something like this (with minor differences depending on the PDFBox version):

将所有内容放在一起就可以获得类似的内容(根据PDFBox版本的不同而略有不同):

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.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 test testBreakString for PDFBox 1.8.x)

(用于PDFBox 1.8.x的BreakLongString.java测试testBreakString)

PDFBox 2.0.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 test testBreakString for PDFBox 2.0.x)

(用于PDFBox 2.0.x的BreakLongString.java测试testBreakString)

The result

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

This looks as expected.

这看起来像预期的那样

Of course there are numerous improvements to make but this should show how to do it.

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

Adding unconditional line breaks

In a comment aleskv asked:

在评论中,aleskv问道:

could you add line breaks when there are \n in the string?

你可以在字符串中有\ n时添加换行符吗?

One can easily extend the solution to unconditionally break at newline characters by first splitting the string at '\n' characters and then iterating over the split result.

通过首先将字符串拆分为'\ n'字符,然后迭代拆分结果,可以轻松地扩展解决方案以无条件地中断换行符。

E.g. if instead of the long string from above

例如。如果不是从上面的长串

String text = "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox"; 

you want to process this even longer string with embedded new line characters

您希望使用嵌入的新行字符处理这个更长的字符串

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...";

you can simply replace

你可以简单地替换

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)
{
    [...]
}

in the solutions above by

在上面的解决方案中

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)
    {
        [...]
    }
}

(from BreakLongString.java test testBreakStringNL)

(来自BreakLongString.java测试testBreakStringNL)

The result:

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

#2


7  

I know it's a bit late, but i had a little problem with mkl's solution. If the last line would only contain one word, your algorithm writes it on the previous one.

我知道这有点晚了,但我对mkl的解决方案有点问题。如果最后一行只包含一个单词,则算法会将其写入前一行。

For Example: "Lorem ipsum dolor sit amet" is your text and it should add a line break after "sit".

例如:“Lorem ipsum dolor sit amet”是你的文字,它应该在“坐”后添加换行符。

Lorem ipsum dolor sit
amet

But it does this:

但它这样做:

Lorem ipsum dolor sit amet

I came up with my own solution i want to share with you.

我提出了自己想要与你分享的解决方案。

/**
 * @param text The text to write on the page.
 * @param x The position on the x-axis.
 * @param y The position on the y-axis.
 * @param allowedWidth The maximum allowed width of the whole text (e.g. the width of the page - a defined margin).
 * @param page The page for the text.
 * @param contentStream The content stream to set the text properties and write the text.
 * @param font The font used to write the text.
 * @param fontSize The font size used to write the text.
 * @param lineHeight The line height of the font (typically 1.2 * fontSize or 1.5 * fontSize).
 * @throws IOException
 */
private void drawMultiLineText(String text, int x, int y, int allowedWidth, PDPage page, PDPageContentStream contentStream, PDFont font, int fontSize, int lineHeight) throws IOException {

    List<String> lines = new ArrayList<String>();

    String myLine = "";

    // get all words from the text
    // keep in mind that words are separated by spaces -> "Lorem ipsum!!!!:)" -> words are "Lorem" and "ipsum!!!!:)"
    String[] words = text.split(" ");
    for(String word : words) {

        if(!myLine.isEmpty()) {
            myLine += " ";
        }

        // test the width of the current line + the current word
        int size = (int) (fontSize * font.getStringWidth(myLine + word) / 1000);
        if(size > allowedWidth) {
            // if the line would be too long with the current word, add the line without the current word
            lines.add(myLine);

            // and start a new line with the current word
            myLine = word;
        } else {
            // if the current line + the current word would fit, add the current word to the line
            myLine += word;
        }
    }
    // add the rest to lines
    lines.add(myLine);

    for(String line : lines) {
        contentStream.beginText();
        contentStream.setFont(font, fontSize);
        contentStream.moveTextPositionByAmount(x, y);
        contentStream.drawString(line);
        contentStream.endText();

        y -= lineHeight;
    }

}

#3


3  

Just draw the string in a position below, typically done within a loop:

只需在下面的位置绘制字符串,通常在循环内完成:

float textx = margin+cellMargin;
float texty = y-15;
for(int i = 0; i < content.length; i++){
    for(int j = 0 ; j < content[i].length; j++){
        String text = content[i][j];
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(textx,texty);
        contentStream.drawString(text);
        contentStream.endText();
        textx += colWidth;
    }
    texty-=rowHeight;
    textx = margin+cellMargin;
}

These are the important lines:

这些是重要的路线:

contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString(text);
contentStream.endText();

Just keep drawing new strings in new positions. For an example using a table, see here: http://fahdshariff.blogspot.ca/2010/10/creating-tables-with-pdfbox.html

只需继续在新的位置绘制新的字符串。有关使用表格的示例,请参见此处:http://fahdshariff.blogspot.ca/2010/10/creating-tables-with-pdfbox.html

#4


2  

contentStream.moveTextPositionByAmount(textx,texty) is key point.

contentStream.moveTextPositionByAmount(textx,texty)是关键点。

say for example if you are using a A4 size means 580,800 is width and height correspondling(approximately). so you have move your text based on the position of your document size.

例如,如果您使用A4尺寸意味着580,800的宽度和高度相对应(大约)。因此,您可以根据文档大小的位置移动文本。

PDFBox supports varies page format . so the height and width will vary for different page format

PDFBox支持不同的页面格式。因此,不同页面格式的高度和宽度会有所不同

#5


2  

///// FOR PDBOX 2.0.X
//  FOR ADDING DYNAMIC PAGE ACCORDING THE LENGTH OF THE CONTENT

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class Document_Creation {

   public static void main (String args[]) throws IOException {

       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.An essay is, generally, a piece of writing that gives the author's own argument — but the definition is vague, overlapping with those of an article, a pamphlet, and a short story. Essays have traditionally been sub-classified as formal and informal. Formal essays are characterized by serious purpose, dignity, logical organization, length,whereas the informal essay is characterized by the personal element (self-revelation, individual tastes and experiences, confidential manner), humor, graceful style, rambling structure, unconventionality or novelty of theme.Lastly, one of the most attractive features of cats as housepets is their ease of care. Cats do not have to be walked. They get plenty of exercise in the house as they play, and they do their business in the litter box. Cleaning a litter box is a quick, painless procedure. Cats also take care of their own grooming. Bathing a cat is almost never necessary because under ordinary circumstances cats clean themselves. Cats are more particular about personal cleanliness than people are. In addition, cats can be left home alone for a few hours without fear. Unlike some pets, most cats will not destroy the furnishings when left alone. They are content to go about their usual activities until their owners return."; 
           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);
           float currentY=startY;
           for (String line: lines)
           {
               currentY -=leading;

               if(currentY<=margin)
               {

                   contentStream.endText(); 
                   contentStream.close();
                   PDPage new_Page = new PDPage();
                   doc.addPage(new_Page);
                   contentStream = new PDPageContentStream(doc, new_Page);
                   contentStream.beginText();
                   contentStream.setFont(pdfFont, fontSize);
                   contentStream.newLineAtOffset(startX, startY);
                   currentY=startY;
               }
               contentStream.showText(line);
               contentStream.newLineAtOffset(0, -leading);
           }
           contentStream.endText(); 
           contentStream.close();

           doc.save("C:/Users/VINAYAK/Desktop/docccc/break-long-string.pdf");
       }
       finally
       {
           if (doc != null)
           {
               doc.close();
           }
       }

   }  
}

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