Apache PDFBox:如何指定我输出的文本的位置

时间:2017-10-24 10:37:13

标签: java pdfbox

所以基本上我已经在特定位置生成pdf时创建了一个文本。

但现在我的问题是,如何处理位于不同位置的文本

预期生成的PDF:

Expected Generated PDF

      contentStream.setLeading(15);     
      contentStream.newLineAtOffset(175, 670);

      String text = "Text 1";
      String text1 = "Text 2";
      String text2 = "Text 3";
      String text3 = "Text 4";
      String text4 = "Text 5";

      contentStream.showText(text);  
      contentStream.newLine();
      contentStream.showText(text1);      
      contentStream.newLine();
      contentStream.showText(text2);      
      contentStream.newLine();
      contentStream.showText(text3);      
      contentStream.newLine();
      contentStream.showText(text4);  
      contentStream.newLine();
      contentStream.showText(text5);      

1 个答案:

答案 0 :(得分:3)

在您的代码中,您已经选择了第一行开头的位置,如下所示:

contentStream.newLineAtOffset(175, 670);

关于你的问题

  

如何处理位于不同位置的文本

因此:您只需再次使用newLineAtOffset

您必须注意,newLineAtOffset(x, y) 将新行开头设置为绝对坐标x, y,而是< em> 这些值 上一行开始的坐标,因此方法名称中的AtOffset

上一行开始坐标在文本对象(0, 0)的开头重置为contentStream.beginText()时,文本对象中的第一个newLineAtOffset 出现以使用绝对坐标。

因此,如果您更喜欢使用绝对坐标,则每次需要以不同于contentStream.newLine()的方式移动线条时,都可以启动新的文本对象。

如果你对相对坐标没问题,你不需要经常启动新的文本对象,而是使用newLineAtOffset中从行开始到行开始的偏移,例如:

try (PDDocument document = new PDDocument()) {
    PDPage page = new PDPage();
    document.addPage(page);

    PDFont font = PDType1Font.HELVETICA;

    String text = "Text 1";
    String text1 = "Text 2";
    String text2 = "Text 3";
    String text3 = "Text 4";
    String text4 = "Text 5";
    String text5 = "Text 6";

    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
        contentStream.beginText();

        contentStream.newLineAtOffset(175, 670);
        contentStream.setFont(font, 12);
        contentStream.setLeading(15);
        contentStream.showText(text);
        contentStream.newLine();
        contentStream.showText(text1);      

        contentStream.newLineAtOffset(225, 10);
        contentStream.setFont(font, 15);
        contentStream.showText(text2);      

        contentStream.newLineAtOffset(-390, -175);
        contentStream.setFont(font, 13.5f);
        contentStream.setLeading(17);
        contentStream.showText(text3);
        contentStream.newLine();
        contentStream.showText(text5);      

        contentStream.newLineAtOffset(300, 13.5f);
        contentStream.showText(text4);      

        contentStream.endText();

        contentStream.moveTo(0, 520);
        contentStream.lineTo(612, 520);
        contentStream.stroke();
    }

    document.save(TARGET_FILE);
}

ArrangeText test testArrangeTextForTeamotea

导致

Screenshot

反过来接近你的形象。 (我没有计算图像中的像素,所以这只是近似值。)