使用IEventHandler生成“Page X”部分似乎相当简单--我正在努力解决的是“Y”部分。我希望避免为了找出它有多少页而对整个文档生成两次,因为这将对性能产生重大影响!
我已经在iText5中找到了一个解决方案:Java中的PDF页码和iText,但是iText7是iText的完全重写,接口完全不同,到目前为止我还找不到任何类似的iText7示例。
您为iText5找到的答案引用了MovieCountries1示例。对于iText7,此示例被重写为清单0520MovieCountries1。它的关键代码:
protected PdfFont bold;
protected PdfFont italic;
protected PdfFont normal;
protected PdfFormXObject template;
public void manipulatePdf(String dest) throws IOException, SQLException {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc, new PageSize(PageSize.A4), true);
doc.setMargins(54, 36, 36, 36);
bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
italic = PdfFontFactory.createFont(FontConstants.HELVETICA_OBLIQUE);
normal = PdfFontFactory.createFont(FontConstants.HELVETICA);
template = new PdfFormXObject(new Rectangle(550, 803, 30, 30));
PdfCanvas canvas = new PdfCanvas(template, pdfDoc);
HeaderHandler headerHandler = new HeaderHandler();
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
... ADD CONTENT ...
canvas.beginText();
try {
canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 12);
} catch (IOException e) {
e.printStackTrace();
}
canvas.moveText(550, 803);
canvas.showText(Integer.toString(pdfDoc.getNumberOfPages()));
canvas.endText();
canvas.release();
doc.close();
}
public class HeaderHandler implements IEventHandler {
protected String country;
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfPage page = docEvent.getPage();
int pageNum = docEvent.getDocument().getPageNumber(page);
PdfCanvas canvas = new PdfCanvas(page);
canvas.beginText();
try {
canvas.setFontAndSize(PdfFontFactory.createFont(StandardFonts.HELVETICA), 12);
} catch (IOException e) {
e.printStackTrace();
}
canvas.moveText(34, 803);
canvas.showText(country);
canvas.moveText(450, 0);
canvas.showText(String.format("Page %d of", pageNum));
canvas.endText();
canvas.stroke();
canvas.addXObject(template, 0, 0);
canvas.release();
}
public void setHeader(String country) {
this.country = country;
}
}
你也会在那里找到许多其他样本的重写。
正如@Bruno在评论中所说,甚至有一个稍微不同的例子,它是真正为iText7创建的(与上面的例子相反,这个例子是iText5例子的端口)。
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
int pageNumber = pdf.getPageNumber(page);
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.newContentStreamBefore(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
Paragraph p = new Paragraph()
.add("Page ").add(String.valueOf(pageNumber)).add(" of");
canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);
pdfCanvas.addXObject(placeholder, x + space, y - descent);
pdfCanvas.release();
}
我在运行时用一个模板文件在itext7.pdfhtml中构建一个PDF。我想在生成的PDF中的每一页都添加一个页脚,该PDF有两页,但出于某种原因,页脚只出现在第二页。
我当前正试图添加一个链接到pdf文档的页脚页眉,但是库给出了以下错误System.IndexoutOfrangeException:“请求的页码0已超出范围。”当使用IText7库将链接添加到标头时。 我在IText7中找不到任何关于这个问题的在线代码示例,ITextSharp中的解决方案不再适用。 我的问题是我如何添加一个链接到一个外部网站到PDF的标题?当前的行为是库中的bug还是有意的? 包
在iTextSharp中,我们可以覆盖OnCloseDocument()事件,并将页面#of#total添加到文档的页脚。但是,PdfDocument不再具有此文档关闭事件。既然我们不能在添加新页面时确定总页数,那么在生成文档时如何确定总页数并将其放在页脚上呢? 我看到了一些关于蛮力方法的建议:生成PDF文档后,在刷新之前,使用PdfReader阅读它,在更新页脚之前获得总数。这是唯一的办法吗?有
我正在使用jasperreport-4.5.0生成报告。它正在正确地生成报告。但是如果我的数据库中有大量数据,那么报告vl会显示在不同的页面中。所以我的要求是,如果我的报告有12页,那么我想显示12页中的第1页,12页中的第2页,12页中的第3页……就像我的页眉带一样。我怎么能做到这一点,任何人都可以对此提出一个想法。
我试图创建一个带有页眉和页脚的PDF。页眉和页脚都是图像。由于我的pdf创建了随机数量的页面,我需要自动将其添加到每一页。我知道我需要使用某种eventhandler。不幸的是,我找不到vb.net语言中的任何示例,我只能找到java/C#示例,我真的不擅长阅读/转换这些语言vb.net.我还不是编程专家。 谁能给我指一下正确的方向吗。 Edit4:删除的随机内容不再需要回答我的问题。 下面这段代
我可以使用iText7和C#ASP. NET创建一个pdf文件 这个pdf文件共包含9页。 我试图在代码中添加总页数和一条虚线 但我有两个问题 页数(9页中的1页,9页中的2页,9页中的3页...)只显示在PDF文件中的第8页和第9页中 虚线没有显示在第一页... 任何帮助都将不胜感激。。。非常感谢。 下面是我的代码