在pdf文档中没有顺序添加图像itextsharp(元素顺序错误)

时间:2014-03-26 14:29:53

标签: itextsharp itext

我正在与iTextSharp(5.4.5)合作几周。 本周,我遇到了一些奇怪的事情,它涉及到文档中元素的顺序。

我正在撰写包含主题和图片(图表)的pdf报告。

文档的格式如下:

NR。主题标题1

主题1的CHART IMAGE(来自bytearray)

NR。主题2主题标题

主题2的图表图片......

下面的

代码示例。我知道代码不完全正确,但它只是指出问题。 让我们假设循环运行10次,所以我希望10个主题标题都直接跟随图像。

我注意到,如果到达页面结束并且应添加新的图像,则图像将移动到下一页,下一个主题标题将打印在上一页上。

所以在纸面上我们有:

第1页:

主题1 image topic 1

主题2 图像主题2

主题3 话题4

第2页:

图片主题3 图像主题4

主题5 图像主题5

...

因此,纸上元素的顺序与我用于通过Document.add方法将元素放入文档的顺序不同。

这真的很奇怪。任何人都有任何想法?

int currentQuestionNr = 0;
foreach (Topic currentTOPIC in Topics)
{
    currentQuestionNr++;

    //compose question (via table so all questions (with nr prefix) are aligned the same)
    PdfPTable questionTable = new PdfPTable(2);
    questionTable.WidthPercentage = 100;
    questionTable.SetWidths(new int[] { 4, 96 });

    PdfPCell QuestionNrCell = new PdfPCell();
    QuestionNrCell.BorderWidth = 0;
    QuestionNrCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
    QuestionNrCell.VerticalAlignment = PdfPCell.ALIGN_TOP;
    QuestionNrCell.AddElement(new Paragraph(String.Format("{0}. ", currentQuestionNr), PdfUtility.font_10_bold));

    PdfPCell QuestionPhraseCell = new PdfPCell();
    QuestionPhraseCell.BorderWidth = 0;
    QuestionPhraseCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
    QuestionPhraseCell.VerticalAlignment = PdfPCell.ALIGN_TOP;
    QuestionPhraseCell.AddElement(new Paragraph(currentTOPIC.Title, PdfUtility.font_10_bold));

    questionTable.addCell(QuestionNrCell);
    questionTable.addCell(QuestionPhraseCell);

    //add topic to document
    Document.add(questionTable)

    //compose image
    Image itextImage = GetImageForTopic(currentTOPIC); //let's assume this function returns an image!
    Paragraph chartParagraph = new Paragraph();
    chartParagraph.IndentationLeft = indentionForQuestionInfo;
    chartParagraph.Add(itextImage);

    //add image to document
    Document.Add(chartParagraph);
}

2 个答案:

答案 0 :(得分:6)

如果您有一个PdfWriter实例(例如writer),则需要强制iText使用严格的图像序列,如下所示:

writer.setStrictImageSequence(true);

否则,iText会推迟添加图片,直到页面上有足够的空间来添加图片。

答案 1 :(得分:0)

那是相当不直观......我得到了同样的行为。那么为什么不在每次迭代时向表中添加另一行:

  for (int i = 1; i < 5; ++i) {
    PdfPTable questionTable = new PdfPTable(2) {
// try and keep topic & chart together on same page for each iteration    
      KeepTogether = true, 
      WidthPercentage = 100
    };
    questionTable.SetWidths(new int[] { 4, 96 });
// _defaultCell(): 
// sets BorderWidth/HorizontalAlignment/VerticalAlignment
// same as your example    
    PdfPCell QuestionNrCell = _defaultCell();
    QuestionNrCell.AddElement(new Paragraph(string.Format("{0}. ", i)));
    PdfPCell QuestionPhraseCell = _defaultCell();
    QuestionPhraseCell.AddElement(new Paragraph(string.Format("{0}", s)));

    Image itextImage = Image.GetInstance(imagePath);
// second parameter used so image is NOT scaled
    PdfPCell imageCell = new PdfPCell(itextImage, false) {
      Border = Rectangle.NO_BORDER,
      Colspan = 2, PaddingLeft = indentionForQuestionInfo
    };
    questionTable.AddCell(QuestionNrCell);
    questionTable.AddCell(QuestionPhraseCell);
    questionTable.AddCell(imageCell);
    document.Add(questionTable);
  }