iText5 PDF内容在页脚上被覆盖

时间:2016-09-01 15:17:11

标签: java itext

我正在使用iText5和Java一起创建pdf并将文档创建为

document = new Document(new Rectangle(1150f, 1150f));

我的pdf内容在页脚上被覆盖(这是一张图片)。

页脚代码:

public void onEndPage(PdfWriter writer, Document document) {    
        document.newPage();
        try {           
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(String.format("Page %d", writer.getPageNumber())), (document.left() + document.right())/2,document.bottom()-18,0);            
            Image image = Image.getInstance(PdfHeaderFooter.class.getResource("/static/images/SampleFooter.png"));
            image.scaleAbsolute(1100f, 75f);// image width,height
            image.setAbsolutePosition(30, 40);
            document.add(image);                           
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        } catch (MalformedURLException e) { 
            logger.error(ExceptionUtils.getStackTrace(e));  
        } catch (IOException e) {
            logger.error(ExceptionUtils.getStackTrace(e));  
        }
    }

此外,一些搜索建议margin solution。设置保证金但我无法找到设置保证金或任何其他解决方案的确切位置。

请帮助,当内容离开pdf区域并且页脚图像上没有重叠时,我应该如何创建新页面。

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题。

newPage() 期间

onEndPage()

在页面更改期间调用事件回调onEndPage();因此,在该方法中调用document.newPage()可能是危险的,至少它是毫无意义的。

document.add

期间

onEndPage()

正如有关iText的文档和经常在stackoverflow的回答和评论中提到的那样,document.add期间不得使用onEndPage()

您可以绘制直接内容(PdfWriter.getDirectContent())或背景内容(PdfWriter.getDirectContentUnder())。

的坐标

您使用以下方式创建Document

document = new Document(new Rectangle(1150f, 1150f));

此构造函数应用36个单位的默认边距:

public Document(Rectangle pageSize) {
    this(pageSize, 36, 36, 36, 36);
}

因此,您的内容将被写入36< x< 1114和36< y< 1114。

现在您可以像这样添加图片

image.scaleAbsolute(1100f, 75f);// image width,height
image.setAbsolutePosition(30, 40);

图像位置是图像的 角。因此,您打算在30<矩形中绘制图像。 x< 1130和40< y< 115.

因此,图像显然会与内容的一部分重叠。要么将图像向下移动,要么使用具有足够大底边距的显式边距。