2016-01-23 136 views
0

我想生成多个PDF为一个PDF,这是我用iTextSharp的实现,但同时产生他们几件事,我碰到,这是指如下:为什么使用iTextsharp生成pdf时会显示这些边界?

  • 我越来越可见单元格边框只我插入的图像下。
  • 底部图像占用一个空格,将图像弹出到另一个页面,并具有额外的可见边框。
  • 另外该段没有与中心对齐。
  • 除此之外,我还需要文本(段落)来自视图(此代码在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; 
} 
+0

什么版本的iTextSharp的您使用的是? –

+0

嗨Amedee,我正在使用版本5.5.8 – Chandan

回答

1

你说的是表默认细胞不应该有一个边界:

table.DefaultCell.Border = Rectangle.NO_BORDER; 

这意味着,创建PdfPCell情况下隐含不会得到一个边境。例如:如果你这样做:

table.AddCell("Implicit cell creation"); 

然后,该单元格将不会获得边框。

不过:你正在创建一个细胞明确

PdfPCell imgTopCell = new PdfPCell(imageTopURL); 

在这种情况下,从未使用过DefaultCellimgTopCell有边界是非常正常的。如果你不想要一个边框imgTopCell,您需要定义的imgTopCellBorder这样的:

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))); 

当你传递一个PhraseAddCell()方法,你是

  1. 使用文本模式(电池的性能胜过它的元素的性质)和
  2. 您正在要求iTextSharp创建PdfPCell

在这种情况下,iTextSharp将查看DefaultCell并使用该单元格的属性创建新单元格。如果要将新单元格的内容居中,则需要在DefaultCell的级别上定义此内容。所有这一切都在我的答案是解释以下问题:

+0

你好布鲁诺,我读了关于右对齐的PDF文本,并根据变化,但我仍然没有把文本到中心。我编辑了代码:iTextSharp.text.Image imageT = iTextSharp.text.Image.GetInstance(Server.MapPath(ImgTopPath)); PdfPCell imgTopCell = new PdfPCell(imageT); imgTopCell.Border = Rectangle.NO_BORDER; imgTopCell.Border = 0; table.AddCell(imgTopCell); (新的段落(data.EmpName,new Font(Font.FontFamily.COURIER,32f,Font.BOLD))); table.AddCell – Chandan

+0

@Chandan我已经更新了我的答案。您不应该使用评论来发布代码。正如您所看到的,阅读注释字段中的代码非常困难。 –

+0

Hello Bruno,我已经完成了pdf生成,它在本地服务器上工作正常,但是当我试图在服务器上运行smae代码(测试服务器的KInd,用于在部署代码之前测试)时,它会弹出一个错误:**邮件程序异常:无法找到文件'F:\ IIS_Sites \ Stackatest.xyz.com \ Documents \ Certificates **,我尝试了几个建议但从未得到结果,那么你能再次帮忙吗? – Chandan