如何使用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