我有一个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页
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。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键: