Spring Boot 为什么我不能用ITEXT pdf 7将PDF的页脚居中?

6vl6ewon  于 2023-10-16  发布在  Spring
关注(0)|答案(1)|浏览(114)

我试图建立一个PDF生成器,我必须添加2个不同的页脚的基础上,即时通讯生成的文件类型。其中一个只有一个文本,上面写着“This PDF is a sample”。另一个基本上是一个3列的表,有一个简短的描述和2个标志。
问题是,一旦我调用事件处理程序,表格和文本的样式都会被覆盖,而且我不能将两个页脚都置于表格的中心。
表格的问题比文本更多,因为它的宽度变小了,所以徽标和文本之间没有间距
我还注意到页脚的位置取决于我有多少页
例如,这是页脚在大多数情况下的样子(位置并不总是相同的,而且永远不会正确):

我试着给所有的物体设置水平方向
这是我的一个牢房,其他的都一样,除了内容不同

Image trustedImage = new Image(ImageDataFactory.create(pathLogo3));
        trustedImage.scaleToFit(100, 100);

        Cell trustedIdentity = new Cell().setBorder(new SolidBorder(whiteColor, 1f));
        trustedIdentity.add(trustedImage.setHorizontalAlignment(HorizontalAlignment.CENTER));
        table.addCell(trustedIdentity.setVerticalAlignment(VerticalAlignment.MIDDLE));

正如你所看到的,我设置了图像和单元格的水平对齐
这就是我调用事件pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new TableFooterEventHandler(creaTabellaFineDocumentoPlaceholder()));的方式
这是实际的TableFooterEventList类

import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.HorizontalAlignment;

public class TableFooterEventHandler implements IEventHandler {

    private Table table;
    public TableFooterEventHandler(Table table) {
        this.table=table;
    }

    @Override
    public void handleEvent(Event event) {

        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdfDoc = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);

        float tableHeight = table.getHeight() == null ? 30  :  table.getHeight().getValue();
        float tableWidth = table.getWidth() == null ? 30  :  table.getWidth().getValue();

        float x = (page.getPageSize().getWidth() - table.getWidth().getValue()) /2;

        new Canvas(canvas, new Rectangle(x, 20, table.getWidth().getValue(), 30))
                .add(table.setHorizontalAlignment(HorizontalAlignment.CENTER)).setHorizontalAlignment(HorizontalAlignment.CENTER)
                .close();
    }
}```

As you can see here I'm creating a `Canvas` containing a `Rectangle` containing the `Table`

I followed and example from ITEXT itself on this page (the first example) : [text](https://kb.itextpdf.com/home/it7kb/examples/page-events-for-headers-and-footers)
And except for the "style" of the footer it kinda works 

somebody know why it does't center the footer and it also overwrites the table settings, and how should I fix it?
kxeu7u2r

kxeu7u2r1#

解决方案

我创建的矩形是错误的。它和table一样大,所以所有的东西都在缩小。我把他的尺寸设置为文件的宽度和table的高度
就像这样:

new Canvas(canvas, new Rectangle(30, 40,documentWidth , tableHeight))
            .add(table).close();
}

现在它居中而不是扭曲

相关问题