如何使用iText在每个页面上添加总页码?如何使用iText在每个页面上添加总页码?
回答
- 将
PdfWriter
的输出处理为bytestream
,首先使用虚拟页数。 - 从
bytestream
创建一个PdfReader
,调用PdfReader.getNumberOfPages
以获取实际页数。 - 重新创建PDF输出,知道页数将是什么,相应地更改页脚。
这很麻烦,但没有简单的方法来知道没有双通道方法的页数。有关操作PDF的详细信息,请参见example code。
好像是首选方式。但是,计算出的'adjust'变量存在问题:它只计算一个字符:'helv.getWidthPoint(“0”,12)'。 :-( – trunkc 2009-04-17 11:06:50
示例链接已损坏 – understack 2011-01-03 18:58:03
示例不再可用 – Luixv 2011-07-27 14:02:34
这是我使用的代码。将页面写入输出不会增加很多开销。
outputStream = new ByteArrayOutputStream();
output = new DataOutputStream(outputStream);
document = new Document();
writer = PdfWriter.getInstance(document, output);
document.open();
contentByte = writer.getDirectContent();
....add stuff
document.close();
writer.close();
byte[] output = outputStream.toByteArray();
PdfReader reader = new PdfReader(output);
//reset the output
outputStream = new ByteArrayOutputStream();
output = new DataOutputStream(outputStream);
document = new Document();
writer = PdfWriter.getInstance(document, output);
document.open();
PdfStamper stamper = new PdfStamper(reader, outputStream);
//add the pages
for (int i = 1; i <= pageCount; i++)
{
contentByte = stamper.getOverContent(i);
addParagraph("Page " + i + " of " + pageCount, new Point(500, 30), boldTextFont); // my own paragraph font
}
stamper.close();
你的代码没有说明从哪里得到了pageCount from – user705142 2012-08-03 01:50:20
没有更多的搜索,这里是解决方案。如果他们删除此链接,我会将代码发布到我的网站并托管链接。
您可以创建一个PdfPageEventHelper
继承的类,然后重写论文的两个功能是这样的:
Imports System.Collections.Generic
Imports System.Text
Imports iTextSharp.text.pdf
Imports iTextSharp.text
Namespace PDF_EnteteEtPiedDePage
Public Class EnteteEtPiedDePage
Inherits PdfPageEventHelper
' This is the contentbyte object of the writer
Private cb As PdfContentByte
' we will put the final number of pages in a template
Private template As PdfTemplate
' this is the BaseFont we are going to use for the header/footer
Private bf As BaseFont = Nothing
' This keeps track of the creation time
Private PrintTime As DateTime = DateTime.Now
' we override the onOpenDocument method
Public Overrides Sub OnOpenDocument(writer As PdfWriter, document As Document)
Try
PrintTime = DateTime.Now
bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
cb = writer.DirectContent
template = cb.CreateTemplate(50, 50)
Catch de As DocumentException
Catch ioe As System.IO.IOException
End Try
End Sub
Public Overrides Sub OnStartPage(writer As PdfWriter, document As Document)
MyBase.OnStartPage(writer, document)
Dim pageSize As Rectangle = document.PageSize
End Sub
Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
MyBase.OnEndPage(writer, document)
Dim pageN As Integer = writer.PageNumber
Dim text As [String] = "Page " & pageN & " de "
Dim len As Single = bf.GetWidthPoint(text, 8)
Dim pageSize As Rectangle = document.PageSize
cb.SetRGBColorFill(100, 100, 100)
cb.BeginText()
cb.SetFontAndSize(bf, 8)
cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30))
cb.ShowText(text)
cb.EndText()
cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30))
cb.BeginText()
cb.SetFontAndSize(bf, 8)
cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "Imprimé le : " & PrintTime.ToShortDateString() & " à " & PrintTime.ToShortTimeString, pageSize.GetRight(40), pageSize.GetBottom(30), 0)
cb.EndText()
End Sub
Public Overrides Sub OnCloseDocument(writer As PdfWriter, document As Document)
MyBase.OnCloseDocument(writer, document)
template.BeginText()
template.SetFontAndSize(bf, 8)
template.SetTextMatrix(0, 0)
template.ShowText("" & Convert.ToString((writer.PageNumber - 1)))
template.EndText()
End Sub
End Class
End Namespace
你这样的pdfwriter PageEvent
的,只是设置的值,然后进行:
Dim PageEventHandler = New EnteteEtPiedDePage()
aPdfWriter.PageEvent = PageEventHandler
试试这个,因为我也受到这个,我也是新的图书馆,所以经过很多麻烦,我得到的结果只是尝试应用逻辑两次,因为我在评论中提到。
class PdfReportServlet extends HttpServlet
{
public static int total = 0;
public static int getTotal()
{
return total;
}
public static void setTotal(int total) {
PdfReportServlet .total = total;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String reportFor = request.getParameter("report");
if(!"".equals(reportFor))
{
if(reportFor.equals("pdf"))
{
/*
from here logic starts
*/
response.setContentType("application/pdf");
Document document = new Document(PageSize.LETTER.rotate());
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, bos);
PdfReport pdfReport = new PdfReport();
pdfWriter.setPageEvent(pdfReport);
document.open();
String id = request.getParameter("id");
DettagliFamigliaPDFReport.generatePDFReport(document,id);
document.close();
/*
* now again give new references to Document and PdfWriter classes.
*/
document = new Document(PageSize.LETTER.rotate());
pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
PDFReport.setTotalPages(getTotal());/*##PAGES_TOTAL here i set total Pages which i get from above logic */
PdfReport pdfReport = new PdfReport();
pdfWriter.setPageEvent(pdfReport);
document.open();
id = request.getParameter("id");
PDFReport.generatePDFReport(document,id);
document.close();
}
catch(DocumentException de){
de.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
Here below i write the class inherits the PdfPageEventHelper class and also having generatePDFReport() method.
*/
public class PDFReport extends PdfPageEventHelper
{
public static PdfTemplate template;
public static int totalPages=0;
public static int getTotalPages() {
return totalPages;
}
public static void setTotalPages(int totalPages) {
DettagliFamigliaPDFReport.totalPages = totalPages;
}
public static void generatePDFReport(Document document,String id)
{
// here your data to write on page of pdf.
}
@Override
public void onOpenDocument(PdfWriter writer, Document doc)
{
template = writer.getDirectContent().createTemplate(100, 100);
}
int totalPage = 0;
@Override
public void onCloseDocument(PdfWriter writer, Document doc)
{
totalPage = writer.getPageNumber() - 1;/* at the end this method calls and you will get total number of pages.*/
PdfReportServlet.setTotal(totalPage); /* while first time logic of servlet executes then i set the total pages to servlet's variable using this logic.
and second time servlet's logic is executing i passed totalPages to this class variable
where i marked ##PAGES_TOTAL */
}
@Override
public void onStartPage(PdfWriter writer, Document doc) {
// Here i write header logic when each time page starts.
}
@Override`enter code here`
public void onEndPage(PdfWriter writer, Document doc)
{
Rectangle rect = writer.getPageSize();
float width = rect.getWidth()/2;
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = new Date();
String footerOne = "This document is printed on date "+dateFormat.format(date)+" - Page. "+writer.getPageNumber()+" of "+getTotalPages();
Paragraph paraOne = new Paragraph(footerOne);
Font fontFooter = new Font();
fontFooter.setSize(8);
fontFooter.setColor(Color.gray);
paraOne.setFont(fontFooter);
Phrase footerPhraseOne = new Phrase(paraOne);
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_CENTER, footerPhraseOne,
width, 30, 0);
}
}
这是一个方便的功能! (基于米尔豪斯的做法)(此使用iText的版本4.1.6.0)
public static byte[] AddPageNumbers(byte[] pdf)
{
PdfReader reader = new PdfReader(pdf);
var Pages = reader.NumberOfPages;
MemoryStream ms = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, ms);
for (int i = 1; i <= Pages; i++)
{
PdfContentByte overContent;
Font Signature = FontFactory.GetFont("Calibiri", 9, iTextSharp.text.Font.NORMAL, Color.BLACK);
overContent = stamper.GetOverContent(i);
var helv = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
overContent.SaveState();
overContent.BeginText();
overContent.SetFontAndSize(helv, 10.0f);
overContent.SetTextMatrix(PageSize.LETTER.Width/2 - 20, PageSize.LETTER.Height - (PageSize.LETTER.Height - 20));
overContent.ShowText("Page " + (i) + " of " + Pages);
overContent.EndText();
overContent.RestoreState();
}
stamper.Close();
return ms.ToArray();
}
这是你的代码片段:
final PdfWriter writer = PdfWriter.getInstance(document, outputStream);
writer.setPageEvent(new PageStamper());
而编号代码:
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.tool.xml.*;
import com.itextpdf.tool.xml.css.*;
import java.io.IOException;
/**
* Adds page number to al the pages except the first.
*/
public class PageStamper extends PdfPageEventHelper {
private static final Logger logger = Logger.getLogger(PageStamper.class);
@Override
public void onEndPage(PdfWriter writer, Document document) {
final int currentPageNumber = writer.getCurrentPageNumber();
if (currentPageNumber == 1) {
return;
}
try {
final Rectangle pageSize = document.getPageSize();
final PdfContentByte directContent = writer.getDirectContent();
directContent.setColorFill(BaseColor.GRAY);
directContent.setFontAndSize(BaseFont.createFont(), 10);
directContent.setTextMatrix(pageSize.getRight(40), pageSize.getBottom(30));
directContent.showText(String.valueOf(currentPageNumber));
} catch (DocumentException | IOException e) {
logger.error("PDF generation error", e);
}
}
}
此代码在这里找到:http://blog.abelsky.com/2014/01/22/adding-page-number-to-itext-generated-pdf/。非常感谢,andy722
正如其他答案指出的那样,您首先需要创建pdf,然后查看您创建的pdf包含多少页,然后将页脚添加到每个页面。 完成此操作的理想类是PdfStamper,其目的是向现有的pdf /现有pdf页面添加其他元素。
这里是基于米尔豪斯的例子的详细的例子:
Font smallFont = FontFactory.getFont("Arial", 9, Font.NORMAL);
ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4, 70, 70, 40, 40);
PdfWriter pdfWriter = PdfWriter.getInstance(document, pdfOutputStream);
document.open();
//CREATE PDF HERE - ADD CONTENT TO DOCUMENT
document.close();
int pageCount = pdfWriter.getPageNumber()-1;
byte[] pdfAsBytes = pdfOutputStream.toByteArray();
//add footer
PdfReader reader = new PdfReader(pdfAsBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DataOutputStream output = new DataOutputStream(outputStream);
document = new Document();
document.open();
PdfStamper stamper = new PdfStamper(reader, output);
for (int i = 1; i <= pageCount; i++) {
ColumnText.showTextAligned(stamper.getOverContent(i),
Element.ALIGN_CENTER, new Phrase(i+"/" + pageCount, smallFont), 550, 30, 0);
}
stamper.close();
byte[] finalPdfAsBytes = outputStream.toByteArray();
这是Java(至少它的一部分)转换的拉马代码
public class test extends PdfPageEventHelper{
private int _pg = 0;
private BaseFont font;
@Override
public void onEndPage(PdfWriter writer, Document document) {
_pg++;
PdfContentByte cb = writer.getDirectContent();
cb.beginText();
try {
Rectangle pageSize = document.getPageSize();
cb.setFontAndSize(font, 8);
cb.setTextMatrix(pageSize.getLeft(40), pageSize.getBottom(15));
String s = "Page " + _pg + "/";
cb.showText(s);
cb.addTemplate(template, pageSize.getLeft(40) + font.getWidthPoint(s, 8), pageSize.getBottom(15));
} catch (Exception exc) {
logger.warn("got Exception : " + exc.getMessage());
}
cb.endText();
}
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
super.onOpenDocument(writer, document);
template = writer.getDirectContent().createTemplate(50, 50);
try {
font = BaseFont.createFont(BaseFont.COURIER, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
} catch (Exception exc) {
logger.warn("got Exception : " + exc.getMessage());
}
}
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
super.onCloseDocument(writer, document);
template.beginText();
try {
template.setFontAndSize(font, 8);
template.setTextMatrix(0f, 0f);
template.showText("" + (writer.getPageNumber() - 1));
} catch (Exception ex) {
logger.error(ex);
}
template.endText();
}
}
- 1. 如何使用iText在每个页面上添加页码?
- 2. 如何使用iText在文档的每个页面上添加Rectangle?
- 3. 如何使用wkhtmltopdf unpatched qt在每个页面上添加页眉和页脚?
- 4. 如何使用ITextRenderer在每个页面上添加页眉和页脚
- 5. 如何使用python-docx将页码添加到每个页面的页脚?
- 6. iText添加新页面
- 7. 使用Flying Saucer,如何在页脚的每个页面上生成页码和页面总数的pdf?
- 8. 在每个页面中添加paragraphe - 使用itext的Java中的PDF
- 9. 使用HTML中的ITextRenderer在每个页面上添加页眉或页脚
- 10. 在每个页面上总结Tablix
- 11. 打印PDF - 如何在每个页面上添加页边距和页边距?
- 12. dompdf:如何在除第一页以外的每个页面上添加页眉?
- 13. 在每个页面添加AJAX调用
- 14. 如何在每个页面添加JavaScript代码?
- 15. 如何添加将在每个页面上显示的信息
- 16. 如何在Sphinx文档的每个页面上添加目录?
- 17. 如何在其他多个页面上添加页面部分?
- 18. RazorGenerator在每个pdf页面上添加页脚
- 19. 如何使用itext在pdf中添加多个页眉和页脚
- 20. Itext - 如何使用acrofields克隆页面?
- 21. 添加PDFPTable到页面底部的iText
- 22. 使用iText在每个页面中进行数字签名
- 23. 如何在使用Wkhtmltopdf的PDF文件的每个页面上添加边框?
- 24. 添加页码并使用itext在流中创建景观A4
- 25. 如何为每个页面添加不同的页眉图像?
- 26. 如何添加总是出现在页面底部的页脚
- 27. IText如何调整页面上的pdf
- 28. 如何使用iText在pdf的最后一页添加图像?
- 29. 在每个页面的html输入中添加页面编号
- 30. TeX:在每个内容页面后添加空白页面
同意,这真的很难看,但它也是使用iText的唯一方法如果有人知道更好的Java PDF库(最好是免费的/ OSS),我很想知道它 – 2009-04-17 15:32:04
对于使用PDF阅读器,文档必须关闭,否则它的PDF标题不会例外,因此在每个页脚中使用它,文档需要打开才能写入每个页脚。 – 2017-11-07 07:12:02