我有以下代码在流中生成pdf。这很好但我现在有以下要求。
1)制作页面格局:查看其他示例,他们将属性添加到文档对象。但我正在做这个内流。那我该如何添加这个属性呢?
2)添加页码。我需要将项目放入网格中,以便每页有x行数。在页脚的页脚处有一个页码。如何用Itext sharp实现这种功能。
public static void Create(ICollection<Part> parts, string path)
{
PdfReader reader = new PdfReader(path);
var pageWidth = 500;
byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, ms))
{
PdfContentByte cb = stamper.GetOverContent(1);
//Flush the PdfStamper's buffer
stamper.Close();
//Get the raw bytes of the PDF
bytes = ms.ToArray();
var now = String.Format("{0:d-M-yyyy}", DateTime.Now);
var pdfName = string.Format("{0}_factory_worksheet", now).Replace("%", "").Replace(" ", "_");
var context = HttpContext.Current;
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("content-disposition", "attachment;filename=" + pdfName);
context.Response.Buffer = true;
context.Response.Clear();
context.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
context.Response.OutputStream.Flush();
context.Response.End();
}
}
}
答案 0 :(得分:1)
我真的不知道你如何处理它C#但逻辑流程将是这样的:
使用 PdfDictionary 将阅读器中的内容旋转到90度。假设您的pdf包含多个页面,
PdfReader reader = new PdfReader(path);
for(int pgCnt = 1; pgCnt&lt; = reader.getNumberOfPages(); pgCnt ++){
//实现轮换的逻辑&amp;添加页码
} 强>
要获得当前旋转(假设您正在使用纵向模式并尝试在横向模式下转换它),请使用
int rttnPg = reader.getPageRotation(pgCnt);
该页面的PdfDictionary
pgDctnry = reader.getPageN(i); (我将该变量命名为pgDctnry)
现在旋转90度使用
pgDctnry.put(PdfName.ROTATE,new PdfNumber(rttnPg + 90));
现在使用PdfStamper绑定它,就像你现在正在做的那样。现在要添加页码了解当前页面的内容(这里我命名为pgCntntBt)
pgCntntBt =压模.getOverContent(pgCnt);
rctPgSz = rdrPgr.getPageSizeWithRotation(pgCnt);
pgCntntBt.beginText();
bfUsed = // Base用于显示文本的字体。也设置字体大小
pgCntntBt.setFontAndSize(bfUsed,8.2f);
txtPg = String.format(pgTxt +“%d /%d”,pgCnt,totPgCnt);
pgCntntBt.showTextAligned(2,txtPg,// Put Width,// Put Height,// Rotation);
pgCntntBt.endText(); 强>
实际上我不明白这是什么意思:“我需要将项目放入网格中,以便每页有x行。页面页脚有一个页码” 。现在关闭压模以在输出流中冲洗它。