How to fit a String inside a rectangle?

2020-01-24 16:48发布

问题:

I'm trying to add some strings, images and tables into my pdf file (there have to be several pages) but when i try to use ColumnText (I use this because I want to place strings at absolute positions), I encounter a problem. When the column height is not sufficient to add the content of the strings, the content is incomplete. How can I avoid that content gets lost?

Here's the related code :

try {
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    String imageUrl = "/Users/nofear/workspace/deneme23/pics/a4-ust.png";
    String imageUrlAlt = "pics/a4-alt.png";
    Image imageust = null;
    Image imageAlt = null;
    try {
        imageust = Image.getInstance(imageUrl);
        imageAlt = Image.getInstance(imageUrlAlt);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("HEIGHT"
        + (document.getPageSize().getHeight() - imageust.getHeight()));
    imageust.setAbsolutePosition(0f,
        document.getPageSize().getHeight() - imageust.getHeight()-10);
    imageAlt.setAbsolutePosition( 0f, 10f);
    document.add(imageust);
    document.add(imageAlt);
    // now draw a line below the headline
    cb.setLineWidth(1f); 
    cb.moveTo(0, 200);
    cb.lineTo(200, 200);
    cb.stroke();
    // first define a standard font for our text
    Font helvetica8BoldBlue = FontFactory.getFont(FontFactory.HELVETICA,16);
    // create a column object
    ColumnText ct = new ColumnText(cb);
    // define the text to print in the column
    Phrase myText = new Phrase("Very Very Long String!!!" , helvetica8BoldBlue);
    ct.setSimpleColumn(myText, 60, 750,
        /* width*/document.getPageSize().getWidth() - 40, 100,
        20, Element.ALIGN_LEFT);
    ct.go();
} catch (Exception e) {
} finally {
    document.close();
}

回答1:

There are three options:

  1. Either you provide a bigger rectangle, so that the content fits inside,
  2. or you reduce the content (e.g. smaller font, less text),...
  3. Keep the size of the rectangle, keep the font size, etc... but add the content that doesn't fit on the next page.

How do you know if the content doesn't fit?

You can add the content in simulation mode first, and test if all the content was 'consumed':

int status = ct.go(true);
boolean fits = !ColumnText.hasMoreText(status);

Based on the value of fits, you can decide to change the size of the rectangle or the content. There's an example that shows how to do this: http://itextpdf.com/examples/iia.php?id=163

If you can distribute the content over different pages, you don't need simulation mode, you just need to insert a document.newPage();

ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(rect);
int status = ct.go();
while (ColumnText.hasMoreText(status)) {
    document.newPage();
    ct.setSimpleColumn(rect);
    status = ct.go();
}

In this example rect contains the coordinates of the rectangle.



标签: itext