当前位置: 首页 > 知识库问答 >
问题:

如何使用Apache PDFBox将page no打印为PDF?

端木令
2023-03-14

我有一个PDF文件,我必须使用Java的Apache PDFBox库在PDF的每一页上打印页码。Pdf有一个包含动态内容的表格,我不知道我的内容需要在PDF上打印多少页,因为它包含一个包含动态数据的表格。

例如:-创建PDF时,文件可能有4或5页,在这种情况下,我必须在PDF页脚的每页上打印页码no。如下所示

假设内容将以PDF格式打印在4页上

第1页第1页,共4页

第2页第2页,共4页

在第3页第3页,共4页

第4页第4页,共4页

共有1个答案

王季萌
2023-03-14
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDMMType1Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.vandeseer.easytable.RepeatedHeaderTableDrawer;
import org.vandeseer.easytable.structure.Row;
import org.vandeseer.easytable.structure.Table;
import org.vandeseer.easytable.structure.cell.TextCell;

import java.awt.*;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.atomic.AtomicInteger;

//pdf with table and page no
public class SimplePDF {
    public static void main(String[] args) {
        try (PDDocument document = new PDDocument()) {
            final PDPage page = new PDPage(PDRectangle.A4);

            // create table with header and set default settings like each col width, border, font (family, size), padding etc.
            Table.TableBuilder table = Table.builder()
                    .addColumnsOfWidth(150F, 150F, 150F)
                    .borderWidth(1F)
                    .borderColor(Color.lightGray)
                    .padding(8F)
                    .font(PDType1Font.HELVETICA)
                    .fontSize(10)
                    .addRow(
                            // header column names
                            Row.builder()
                                    .font(PDMMType1Font.HELVETICA_BOLD)
                                    .add(TextCell.builder().text("Name").build())
                                    .add(TextCell.builder().text("Age").build())
                                    .add(TextCell.builder().text("Country").build())
                                    .build()
                    );

            //add multiple rows to table
            for (int i = 0; i < 100; i++) {
                table.addRow(
                        Row.builder()
                                .add(TextCell.builder().text("John").build())
                                .add(TextCell.builder().text("20").build())
                                .add(TextCell.builder().text("Any").build())
                                .build()
                );
            }

            //use RepeatedHeaderTableDrawer builder class to repeat header row in all page of pdf
            RepeatedHeaderTableDrawer repeatedHeaderTableDrawer = RepeatedHeaderTableDrawer.builder()
                    .startX(20f)
                    .startY(page.getMediaBox().getUpperRightY())
                    .numberOfRowsToRepeat(1) //specify the no of row wants to repeat on each page of pdf
                    .table(table.build())
                    .build();

            //draw the table on pdf document
            repeatedHeaderTableDrawer.draw(() -> document, () -> new PDPage(PDRectangle.A4), 30);

            //Print the page no on each page of pdf because know we know how many no of pages do this pdf has
            //because it print the table on each page based on the data now we can print the page no on each page of pdf
            //for e.g 'Page 1 of 4'    if we have 4 no of page in pdf then this will be the output on the first page of pdf

            int totalNoOfPages = document.getNumberOfPages();
            AtomicInteger pageCounter = new AtomicInteger(1);

            //iterate each page and print page no on each page at the footer of the pdf
            document.getPages().forEach(pdfPage -> {
                float bottomXAxis = pdfPage.getMediaBox().getLowerLeftX();
                float bottomYAxis = pdfPage.getMediaBox().getLowerLeftY();
                String currentPageNo = MessageFormat.format("Page {0} of {1}", pageCounter.getAndIncrement(), totalNoOfPages);
                try {
                    PDPageContentStream contentStream = new PDPageContentStream(document, pdfPage, PDPageContentStream.AppendMode.APPEND, true);
                    contentStream.beginText();
                    contentStream.setFont(PDMMType1Font.HELVETICA, 10);
                    contentStream.newLineAtOffset(bottomXAxis + 15, bottomYAxis + 5);
                    contentStream.showText(currentPageNo);
                    contentStream.endText();
                    contentStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            //save the pdf file
            document.save("example.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.println("PDF created");
        }
    }
}

上面的代码将生成一个pdf文件,其中包含在pdf的每一页上具有可重复标题行的表和在每一页上具有第no页的表。结果对您来说可能略有不同,但它对我有用。使用了2个库,一个是Apache PDFBox和EasyTable来使用ApachePDFBox创建表

库的依赖项包括:-

<dependency>
   <groupId>org.apache.pdfbox</groupId>
   <artifactId>pdfbox</artifactId>
   <version>2.0.22</version>
</dependency>
<dependency>
   <groupId>com.github.vandeseer</groupId>
   <artifactId>easytable</artifactId>
   <version>0.8.5</version>
</dependency>
 类似资料:
  • 问题内容: 我想使用PDFBox打印 由iText创建的 PDF文件 。我已经使用PDDocument类及其方法print()成功尝试了此操作。您可以在此处找到文档: http //pdfbox.apache.org/apidocs/。 (我正在使用此代码:) 方法print()很好用,但是 有一个问题:当我需要打印多个文件时,该方法要求我为每个文档选择打印机。 有什么办法只能设置一次打印机吗?

  • 我需要在cmd上打印这个字符。其UNICODE编码为U+26C0。我尝试了这个:system.out.print(“”);但在跑步中我得到了“?”角色谢谢。

  • 我有一个连接到CUPS的打印机,它支持双面打印,如何通过java例程将其设置为单面打印或双面打印? 我曾尝试使用它的库使用ASET添加和addViewer首选项没有任何运气。 有人能提供一些建议吗?

  • 我目前的工作是创建机械图纸,用于发送给客户和作为施工图。当我的绘图完成后,我导出一个. pdf文件,并将其发送给客户端。 我们的客户非常喜欢黑白画,所以我试着提供他们。但是我用来画画的软件效果不好。它只有一个选项“所有颜色都是黑色”,我的画上有一些白色的“隐藏线”。当然,这些显示使用所有颜色作为黑色选项。 我找到了一个解决方案,那就是使用pdf打印机。效果很好,效果也很好。 现在我想打印这个。pd

  • 问题内容: 我想更改网页上的某些内容。我也想隐藏一些东西。打印时,有没有办法用CSS做到这一点?我尤其希望能够隐藏一些DIV及其包含的所有DIV。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键: