使用ColumnText添加PDF右上角的文本适用于Portrait,而不适用于Landscape

时间:2016-12-27 08:53:56

标签: java pdf itext

我正在开发一个项目,作为语句的一部分,我需要附加任意PDF文件。这些PDF文件需要在PDF文件的右上角标有标题和页码。这是一项法律要求,因为这些附件的标题和声明中的总页数是指这些附件。

我(天真地)将一些似乎正在处理PDF文件的代码整合在一起,其中包含纵向页面(至少我测试过的PDF文件)。但是,当我在横向页面上使用此代码时,标题和编号不可见。

代码:

PdfContentByte canvas = pdfStamper.getOverContent( pageNr );

Phrase phrase = new Phrase( sb.toString( ), new Font( FontFamily.HELVETICA, 9f ) ); // sb holds title + page numbering
float width = ColumnText.getWidth( phrase );

ColumnText.showTextAligned ( // draw text top-right
    canvas,
    Element.ALIGN_LEFT,
    phrase,
    canvas.getPdfDocument( ).right( ) - width, //x
    canvas.getPdfDocument( ).top( ) + 9, //y
    0 //rotation
);

示例:

  • 看似合作的人像:

enter image description here

  • 不适用的景观:

enter image description here

问题:

  • 我哪里出错了?
  • 是否可以编写这样一段代码,使其适用于所有可能的页面方向?
  • 如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

您正在添加内容,但是您将其添加到错误的位置。见PageSize of PDF always the same between landscape and portrait with itextpdf

假设您正在使用纵向方向处理A4页面。该页面由842个用户单位测量595。 595是宽度; 842是高度。

现在让我们切换到横向。这可以通过两种不同的方式完成:

  1. 定义宽度595,高度842,旋转90度。
  2. 定义宽度为842,高度为595。
  3. 用于定义横向方向的方式会对right()top()方法的值产生影响。我非常确定您要将标题添加到横向页面,但是您要在页面的可见区域之外添加

答案 1 :(得分:0)

对于那些感兴趣的人,我最终做到如下。这适用于纵向和横向方向。这使用PdfReader.getPageSizeWithRotation方法来获取正确的页面大小。

private String pageText(int pageNr, int pageTotal) {
    return ""; // generate string to display top-right of PDF here
}

private void addDocumentObjects(int pageNr, PdfReader pdfReader, PdfStamper pdfStamper) {
    final float pageMargin = 25f;
    final float textSize = 9f;
    final float lineMargin = 5f;

    Phrase phrase = new Phrase (
        pageText(pageNr, pdfReader.getNumberOfPages()),
        new Font(FontFamily.HELVETICA, textSize)
    );
    final float phraseWidth = ColumnText.getWidth(phrase);

    PdfContentByte canvas = pdfStamper.getOverContent(pageNr);
    com.itextpdf.text.Rectangle pageRectangle = pdfReader.getPageSizeWithRotation(pageNr);

    // draw white background rectangle before adding text + line
    canvas.setColorFill(BaseColor.WHITE);
    canvas.rectangle (
        pageRectangle.getRight(pageMargin) - phraseWidth, //x
        pageRectangle.getTop(pageMargin), //y
        phraseWidth, // width
        textSize + lineMargin //height
    );
    canvas.fill();

    // draw text top right
    canvas.setColorFill(BaseColor.BLACK);
    ColumnText.showTextAligned (
        canvas, //canvas
        Element.ALIGN_LEFT, //alignment
        phrase, //phrase
        pageRectangle.getRight(pageMargin) - phraseWidth, //x 
        pageRectangle.getTop(pageMargin), //y
        0 //rotation
    );

    // draw line under text
    canvas.setColorStroke(BaseColor.BLACK);
    canvas.setLineWidth(1);
    canvas.moveTo (
        pageRectangle.getRight(pageMargin) - phraseWidth, //x
        pageRectangle.getTop(pageMargin) - lineMargin //y
    );
    canvas.lineTo (
        pageRectangle.getRight(pageMargin), //x
        pageRectangle.getTop(pageMargin) - lineMargin //y
    );
    canvas.stroke();
}