iText绝对定位文本

24
在iText中,我有一个chunk/phrase/paragraph(我不介意哪种),我想将其放置在页面的其他位置,例如在300 x 200处。我该如何做到这一点?
5个回答

26

最终我编写了自己的方法来完成它。

private void PlaceChunck(String text, int x, int y) {
        PdfContentByte cb = writer.DirectContent;
        BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        cb.SaveState();
        cb.BeginText();
        cb.MoveText(x, y);
        cb.SetFontAndSize(bf, 12);
        cb.ShowText(text);
        cb.EndText();
        cb.RestoreState();
    }

1
你好。它支持换行符吗? - KarolDepka
6
我不会给这个回答点踩,但我不喜欢它。问题是:如何定位一个块、短语、段落。正确的答案是:使用ColumnText。你可以使用showTextAligned()方法(仅对短语对象有效),或者如果需要支持换行和/或其他对象,则可以使用ColumnText实例和go()方法。 - Bruno Lowagie
2
@BrunoLowagie - 那么给一个完整的答案怎么样?解释正确方法会很有帮助。 - Jason Kleban
1
完整的答案可以在文档中找到。例如,书籍http://itextpdf.com/book和示例http://tinyurl.com/itextsharpIIA2C03。我目前正在撰写一本(免费的)电子书。一天只有24小时,你不应该期望人们在SO上写他们的书。 - Bruno Lowagie
6
@BrunoLowagie,感谢您的书,但我完全不喜欢您的方法。如果您有更好的解决方案,可以在SO上发布它;如果您不喜欢这个问题,可以将其投票下降。 你两件事都没做。此外,这可能不是最佳方法,但我没有时间读一本完整的书,而这个答案为我提供了一个可行的解决方案来创建我的示例。一天只有24小时,你不应该期望人们在工作的同时读书。 - Gabber
显示剩余2条评论

21

这是一个带有正确大小写和try/catch块的版本:

  private static void absText(String text, int x, int y) {
    try {
      PdfContentByte cb = writer.getDirectContent();
      BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
      cb.saveState();
      cb.beginText();
      cb.moveText(x, y);
      cb.setFontAndSize(bf, 12);
      cb.showText(text);
      cb.endText();
      cb.restoreState();
    } catch (DocumentException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

如果我使用了以下代码:writer.getDirectContent(),并创建了一个新的文档Document document = new Document();和字体Font times = null;,以及PdfWriter writer;,则会出现错误。我想要实现的是,创建一个新的文档,并且可以进行编辑操作。 - Sunil Chaudhary

3

我做了类似的事情,也许可以帮助其他人:

ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(left,bottom,right,top);
ct.setText(new Phrase("String"));
ct.go();

什么是p?你能解释一下吗? - Anand Savjani
抱歉,应该是 ct - JstnPwll

0

希望这能帮到你!以下是我的代码...

 Document document = new Document(PageSize.A4);
 PdfWriter writer = PdfWriter.getInstance(document, output);
 document.open();

 FixText("Add Your Text",400,700,writer,14);
 document.close();

添加功能:

  private static void FixText(String text, int x, int y,PdfWriter writer,int size) {
    try {
        PdfContentByte cb = writer.getDirectContent();
        BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        cb.saveState();
        cb.beginText();
        cb.moveText(x, y);
        cb.setFontAndSize(bf, size);
        cb.showText(text);
        cb.endText();
        cb.restoreState();
    } catch (DocumentException | IOException e) {
        e.printStackTrace();
    }
}

0
在我的情况下,只有这个解决方案才有效。
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(FILE));

添加方法

private void addTextData(Document document, String text) {
        PdfContentByte cb = pdfWriter.getDirectContent();
        cb.beginText();
        try {
            BaseFont f_cn = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.setFontAndSize(f_cn, 40);

            float requiredX = 50;
            float requiredY = 50;
            Paint paint = new Paint();
            paint.setTextSize(40);
            Typeface typeface=Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
            paint.setTypeface(typeface);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.FILL);

            Rect result = new Rect();
            paint.getTextBounds(text, 0, text.length(), result);
            Log.i("Text dimensions", "Width: "+result.width()+"-Height: "+result.height());
            float calculatedY = document.getPageSize().getHeight() - result.height() - requiredY;
            cb.setTextMatrix(requiredX, calculatedY);
            cb.showText(text);
            cb.endText();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

这肯定会对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接