我正在开发一个项目,作为语句的一部分,我需要附加任意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
);
示例:
问题:
答案 0 :(得分:1)
您正在添加内容,但是您将其添加到错误的位置。见PageSize of PDF always the same between landscape and portrait with itextpdf
假设您正在使用纵向方向处理A4页面。该页面由842个用户单位测量595。 595是宽度; 842是高度。
现在让我们切换到横向。这可以通过两种不同的方式完成:
用于定义横向方向的方式会对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();
}