Java 如何使用iText在PDF文档中设置text@absolute position

Java 如何使用iText在PDF文档中设置text@absolute position,java,pdf,itext,Java,Pdf,Itext,我尝试使用示例,将文本放置在PDF文档中所需的(绝对)位置。请告诉我一些方向,谢谢 例如: 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_

我尝试使用示例,将文本放置在PDF文档中所需的(绝对)位置。请告诉我一些方向,谢谢

例如:

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

如果您使用iText,您可以通过5个步骤创建PDF文档”

  • 创建
    文档
    实例
  • 创建一个
    PdfWriter
    实例
  • 打开文档
  • 添加内容
  • 关闭文档
  • 在您的问题中,您不会创建
    PdfWriter
    实例(除非它是全局变量)。在您的注释中,您不会打开文档(您跳过了步骤3,此步骤在文档创建过程中是必不可少的)

    从注释中提取代码,并在适当的位置添加以下行:

    document.open();
    
    适当的位置在创建
    PdfWriter
    实例的那一行之后,以及开始使用
    writer
    实例之前

    更新

    在您的注释中,您现在正在共享一些包含逻辑错误的代码

    您的主要方法
    pdfGeneration()
    (可能)包含创建过程中的五个步骤:

  • 创建一个
    文档
    实例
  • 创建一个
    PdfWriter
    实例,将字节写入文件My First PDF Doc.PDF
  • 打开文档
  • 您调用一个方法
    setPara()
    ,该方法应该添加内容
  • 关闭文档(在代码中不可见)
  • 逻辑错误可以在
    setPara()
    方法中找到。在该方法中,重复这五个步骤。创建一个新的
    文档
    实例(无需执行此操作)然后创建一个new
    PdfWriter
    实例,创建一个new文件My First PDF Doc.PDF。这会引发一个异常,因为该文件已在使用中

    您应该这样更改
    setPara()

    public void setPara(PdfContentByte canvas, Phrase p, float x, float y) {
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, phrase, x, y, 0);
    }
    
    setPara(writer.getDirectContent(), new Phrase(text), x, y);
    
    您应该从主方法调用此方法,如下所示:

    public void setPara(PdfContentByte canvas, Phrase p, float x, float y) {
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, phrase, x, y, 0);
    }
    
    setPara(writer.getDirectContent(), new Phrase(text), x, y);
    
    当然:由于
    setPara()
    方法只不过是iText中已有的
    showTextAligned()
    方法的简化版本,因此您可能希望直接使用该方法。例如:在主方法中使用该方法,而不是引入
    setPara()
    方法:

    Phrase phrase = new Phrase("Some text", new Font());
    PdfContentByte canvas = writer.getDirectContent();
    ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, phrase, 20, 20, 0);
    

    好的,是的-您希望
    writer
    变量来自哪里?我想答案是希望已经有一个合适的writer可用…再次感谢@Bruno Lowagie,当我遵循您的步骤时,这次没有错误,但文件是。您能共享PDF而不是屏幕截图吗?您显示的错误消息非常复杂pical如果你忘记关闭文档。你关闭文档了吗?谢谢@Bruno Lowagie,PDF,我调用的实际代码中有一个严重的逻辑错误:你正在破坏你正在创建的文件!我将更新我的答案。你不需要编写自己的方法来完成此操作,
    showTextAligned()
    列text
    类中的方法可以满足您的需求(如我更新的答案所示)。