int PageCount = Math.Ceiling(PageSize / books.Count());报错原因
时间: 2024-04-01 08:31:15 浏览: 12
出现错误的原因可能是变量类型不匹配。在上面的代码中,PageSize和books.Count()都是整数类型,而Math.Ceiling()方法返回的是双精度浮点数类型。因此,需要将结果转换为整数类型,可以使用强制类型转换或者Math.Round()方法来实现。下面是两种修改后的代码示例:
1. 使用强制类型转换:
int PageCount = (int)Math.Ceiling((double)PageSize / books.Count());
2. 使用Math.Round()方法:
int PageCount = (int)Math.Round((double)PageSize / books.Count(), MidpointRounding.AwayFromZero);
其中,MidpointRounding.AwayFromZero表示四舍五入时采用远离零的方向。这两种方法都可以将结果转换为整数类型,避免了类型不匹配的错误。
相关问题
为什么用这段代码给pdf文件添加的水印只有第一页有using (PdfReader reader = new PdfReader(path)) { int pageCount = reader.NumberOfPages; // 添加水印 PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create)); for (int i = 1; i <= pageCount; i++) { // 水印文本 string watermarkText = "LUDA LUDA LUDA LUDA LUDA"; // 水印字体 BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font font = new Font("Black", 80, FontStyle.Bold); //Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray)); // 水印位置 iTextSharp.text.Rectangle rect = reader.GetPageSize(i); float x = rect.Width / 2; float y = rect.Height / 2; // 添加水印 PdfContentByte over = stamper.GetOverContent(i); over.SaveState(); over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f }); over.BeginText(); over.SetFontAndSize(bf, font.Size); over.SetColorFill(BaseColor.GRAY); over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45); over.EndText(); over.RestoreState(); stamper.Close(); }
这是因为你在循环中每次都调用了 `PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));` 来创建一个新的 `PdfStamper`,这会导致每次都重新创建一份新的 PDF 文件,并且只添加了当前页的水印。
你应该将 `PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));` 放在循环外部,只创建一次,然后在循环内部通过 `stamper.GetOverContent(i)` 来获取当前页的 `PdfContentByte`,从而实现将水印添加到所有页。修改后的代码如下:
```
using (PdfReader reader = new PdfReader(path))
{
int pageCount = reader.NumberOfPages;
// 创建 PdfStamper
PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));
for (int i = 1; i <= pageCount; i++)
{
// 水印文本
string watermarkText = "LUDA LUDA LUDA LUDA LUDA";
// 水印字体
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
Font font = new Font("Black", 80, FontStyle.Bold);
// 水印位置
iTextSharp.text.Rectangle rect = reader.GetPageSize(i);
float x = rect.Width / 2;
float y = rect.Height / 2;
// 添加水印
PdfContentByte over = stamper.GetOverContent(i);
over.SaveState();
over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f });
over.BeginText();
over.SetFontAndSize(bf, font.Size);
over.SetColorFill(BaseColor.GRAY);
over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45);
over.EndText();
over.RestoreState();
}
// 关闭 PdfStamper
stamper.Close();
}
```
一下这段代码中 如何在最后将pdf文件用PdfiumViewer库中的pdfViewer1控件显示出来 private void Form1_Load(object sender, EventArgs e) { // 读取 PDF 文件 PdfReader reader = new PdfReader("your_pdf_file.pdf"); int pageCount = reader.NumberOfPages; // 添加水印 for (int i = 1; i <= pageCount; i++) { PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create)); // 水印文本 string watermarkText = "This is a watermark text"; // 水印字体 BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); Font font = new Font(bf, 32, Font.BOLD, new BaseColor(255, 0, 0, 128)); // 水印位置 Rectangle rect = reader.GetPageSize(i); float x = rect.Width / 2; float y = rect.Height / 2; // 添加水印 PdfContentByte over = stamper.GetOverContent(i); over.SaveState(); over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f }); over.BeginText(); over.SetFontAndSize(font.BaseFont, font.Size); over.SetColorFill(font.Color); over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45); over.EndText(); over.RestoreState(); stamper.Close(); } // 显示 PDF 文件 axAcroPDF1.src = "temp.pdf"; }
可以使用PdfiumViewer库中的pdfViewer1控件来显示pdf文件。首先,需要将生成的temp.pdf文件加载到pdfViewer1控件中,可以使用以下代码实现:
```
// 将生成的temp.pdf文件加载到pdfViewer1控件中
pdfViewer1.Document = PdfiumViewer.PdfDocument.Load("temp.pdf");
```
将上述代码添加到Form1_Load方法的最后即可。完整代码如下:
```
private void Form1_Load(object sender, EventArgs e)
{
// 读取 PDF 文件
PdfReader reader = new PdfReader("your_pdf_file.pdf");
int pageCount = reader.NumberOfPages;
// 添加水印
for (int i = 1; i <= pageCount; i++)
{
PdfStamper stamper = new PdfStamper(reader, new FileStream("temp.pdf", FileMode.Create));
// 水印文本
string watermarkText = "This is a watermark text";
// 水印字体
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
Font font = new Font(bf, 32, Font.BOLD, new BaseColor(255, 0, 0, 128));
// 水印位置
Rectangle rect = reader.GetPageSize(i);
float x = rect.Width / 2;
float y = rect.Height / 2;
// 添加水印
PdfContentByte over = stamper.GetOverContent(i);
over.SaveState();
over.SetGState(new PdfGState() { FillOpacity = 0.5f, StrokeOpacity = 0.5f });
over.BeginText();
over.SetFontAndSize(font.BaseFont, font.Size);
over.SetColorFill(font.Color);
over.ShowTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45);
over.EndText();
over.RestoreState();
stamper.Close();
}
// 将生成的temp.pdf文件加载到pdfViewer1控件中
pdfViewer1.Document = PdfiumViewer.PdfDocument.Load("temp.pdf");
}
```