使用iTextsharp生成pdf时为什么会显示这些边框?

时间:2016-01-23 12:23:05

标签: asp.net-mvc itextsharp

我正在尝试将单个pdf生成多个pdf,这是我通过使用itextSharp实现的,但是在生成它们时我遇到的一些事情,如下所示:

  • 我在插入的图像下面看到了可见的单元格边框。
  • 底部图像占据一个空间,将图像轻弹到另一页,并带有额外的可见边框。
  • 该段落也没有与中心对齐。
  • 除了这些之外,我还需要文本(在段落中)来自视图(此代码在MVC中进行)。

如何解决这些错误?以下是我的代码:

public byte[] GetPDF(string pHTML)
    {
        byte[] bPDF = null;
        MemoryStream ms = new MemoryStream();
        TextReader txtReader = new StringReader(pHTML);
        //Rectangle pagesize = new Rectangle(864.0f, 1152.0f);
        Document doc = new Document(PageSize.NOTE);
        string path = Server.MapPath("PDFs");
        PdfWriter oPdfWriter = PdfWriter.GetInstance(doc, ms);
        HTMLWorker htmlWorker = new HTMLWorker(doc);
        doc.Open();

            for (int i = 1; i <= 5; i++)
            {

                doc.NewPage();
                PdfPTable table= new PdfPTable(1);
                table.TotalWidth = 500f;
                table.LockedWidth = true;
                table.HorizontalAlignment = 0;
                table.DefaultCell.Border = Rectangle.NO_BORDER;

                Image imageTopURL = Image.GetInstance("Top.PNG");
                       PdfPCell imgTopCell = new PdfPCell(imageTopURL);
                Paragraph p = new Paragraph("XYZ", new Font(Font.FontFamily.COURIER, 32f, Font.UNDERLINE));
                p.Alignment = Element.ALIGN_CENTER;
                table.AddCell(imgTopCell);
                table.AddCell(p);
                Image imageMidURL = Image.GetInstance("Mid.PNG");                    
                PdfPCell imgMidCell = new PdfPCell(imageMidURL);
                Paragraph p1 = new Paragraph("ABC", new Font(Font.FontFamily.HELVETICA, 29f, Font.ITALIC));
                p1.Alignment = Element.ALIGN_CENTER;
                table.AddCell(imgMidCell);
                imgMidCell.Border = 0;                 
                table.AddCell(p1);
                Image imageBotURL = Image.GetInstance("Bottom.PNG");
                PdfPCell imgBotCell = new PdfPCell(imageBotURL);
                table.AddCell(imgBotCell);
                imageTopURL.ScaleAbsolute(505f, 270f);
                imageMidURL.ScaleAbsolute(590f, 100f);
                imageBotURL.ScaleAbsolute(505f, 170f);
                 doc.Open();
                doc.Add(table);
                  htmlWorker.StartDocument();
                htmlWorker.Parse(txtReader);
                htmlWorker.EndDocument();
            }
              htmlWorker.Close();
               doc.Close();
        doc.Close();
        bPDF = ms.ToArray();
        return bPDF; 
}

1 个答案:

答案 0 :(得分:1)

您告诉该表默认单元格不应该有边框:

table.DefaultCell.Border = Rectangle.NO_BORDER;

这意味着隐式创建的PdfPCell个实例将不会获得边框。例如:如果你这样做:

table.AddCell("Implicit cell creation");

那个单元格不会有边框。

但是:您正在创建一个 的单元格:

PdfPCell imgTopCell = new PdfPCell(imageTopURL);

在这种情况下,永远不会使用DefaultCellimgTopCell有边框是很正常的。如果您不想要imgTopCell的边框,则需要定义Border imgTopCell,如下所示:

imgTopCell.Border = Rectangle.NO_BORDER;

关于对齐:似乎您没有阅读文本模式复合模式之间的区别。请阅读文档,例如:

您正在制作一些新手错误,这些错误都可以通过阅读文档来解决。你在一篇文章中有太多问题。如果我的答案没有解决你的每一个问题,请创建新的问题。我在你的帖子中至少看到了两个问题(你的问题实际上应该以“太宽泛”为理由而被关闭。)

<强>更新

在评论中,您添加了以下代码段:

table.AddCell(new Paragraph(data.EmpName, new Font(Font.FontFamily.COURIER, 32f, Font.BOLD)));

您希望将此文字居中。

首先,让我解释一下您使用AddCell()方法并以Paragraph作为参数。这并不合理,因为Paragraph将被视为Phrase。你也可以写:

table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER ;
table.AddCell(new Phrase(data.EmpName, new Font(Font.FontFamily.COURIER, 32f, Font.BOLD)));

当您将Phrase传递给AddCell()方法时,您

  1. 使用文本模式(单元格的属性优先于其元素的属性),
  2. 您要求iTextSharp创建PdfPCell
  3. 在这种情况下,iTextSharp将查看DefaultCell并使用该单元格的属性来创建新单元格。如果要将新单元格的内容居中,则需要在DefaultCell级别定义此内容。所有这些都在我对以下问题的回答中进行了解释: