如何将带图像的段落添加到iTextSharp表格中的单元格?

时间:2014-09-22 17:33:51

标签: c# itextsharp

我正在创建一个解析器,将Word文档转换为PDF,并在此过程中进行一些专门的处理。我选择使它成为一个递归解析器,以匹配OpenXml的结构。

我遇到了处理图片的一些问题。给定OpenXml的结构,图像始终是段落内的绘图元素。如果段落直接在doc中,这样可以正常工作,基本上就是这样(对于这个例子来说,解析的递归):

using (var document = new Document(PageSize.A4))
{
    PdfWriter.GetInstance(document, new FileStream(path, FileMode.Create));
    document.Open();

    var paragraph = new Paragraph();

    var image = Image.GetInstance(@"C:\image1.jpg");

    paragraph.Add(image);
    document.Add(paragraph);

    document.Close();
}

此代码正确地将图像插入到文档中。当图像在表格内时会出现问题,这在我们正在处理的文档中很常见。 OpenXml结构最终会像这样结束:

DocumentBody =>表=> Cell =>段落=>绘制

因此,在iTextSharp术语中,映射到:

Document =>表=> Cell =>段落=>图像

将带有图像的段落直接添加到单元格会生成一个空的零高度表。如果我在段落中添加一个块,图像会出现但是会大幅调整大小(更小) - 我无法弄清楚调整大小的基础是什么:

using (var document = new Document(PageSize.A4))
{
    PdfWriter.GetInstance(document, new FileStream(path, FileMode.Create));
    document.Open();

    var paragraph = new Paragraph();

    var image = Image.GetInstance(@"C:\image1.jpg");

    paragraph.Add(new Chunk(image, 0, 0));

    var table = new PdfPTable(1);

    var cell = new PdfPCell { PaddingLeft = 5, PaddingTop = 5, PaddingBottom = 5, PaddingRight = 5 };

    cell.HorizontalAlignment = Element.ALIGN_CENTER;
    cell.AddElement(paragraph);

    table.AddCell(cell);

    document.Add(table);

    document.Close();
}

如果有人可以帮助我将这张图片放入单元格而不调整大小,那将是完美的。

更新 *

我已经确定图像本身没有原生调整大小 - 如果我从生成的pdf中提取图像并保存它,它会保留原始图像的尺寸。

4 个答案:

答案 0 :(得分:4)

尝试直接将Image添加到单元格,而不是先将其添加到Paragraph

var cell = new PdfPCell { PaddingLeft = 5, PaddingTop = 5, PaddingBottom = 5, PaddingRight = 5 };
cell.HorizontalAlignment = Element.ALIGN_CENTER;
cell.AddElement(paragraph);
cell.AddElement(image);

阅读你的例子,你也可以省略cell.AddElement(paragraph);行,因为你的段落似乎是空的。

请注意,使用addElement(image)会缩放图片以适应表格列宽度的100%(您通常不希望图片与其他列重叠)。您可以使用图片上的setWidthPercentage()方法更改此百分比。

答案 1 :(得分:3)

在您将代码添加到段落的代码中,将第四个参数添加到 Chunk

paragraph.Add(new Chunk(image, 0, 0, true));

固定前导,以便调整图像大小以适应。设置

changeLeading = true //fourth parameter

图像正常显示

答案 2 :(得分:0)

可以试试这个:

  iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);
        PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream("C://PDF//.pdf ", FileMode.Create));
        doc.Open();

        iTextSharp.text.Paragraph paragraph = new iTextSharp.text.Paragraph(//value);

        doc.Add(paragraph);
        doc.Close();

答案 3 :(得分:0)

我认为这种情况下的图像会添加到表格的背景中。 要在图像直接添加到表格时添加图像,您可以使用以下代码。

using (var document = new Document(PageSize.A4))
{
    PdfWriter.GetInstance(document, new FileStream(path, FileMode.Create));
    document.Open();

    var paragraph = new Paragraph();

    var image = Image.GetInstance(@"C:\image1.jpg");

    var table = new PdfPTable(1);

    var cell = new PdfPCell { PaddingLeft = 5, PaddingTop = 5, PaddingBottom = 5, PaddingRight = 5 };

    cell.HorizontalAlignment = Element.ALIGN_CENTER;
    cell.AddElement(paragraph);

    table.AddCell(cell);

  //image.ScaleToFit(JpgBg.Width, JpgBg.Height);
   image.ScaleAbsolute(table.Width, table.Height);
   image.Alignment = iTextSharp.text.Image.UNDERLYING;
   document.Add(image);

    document.Add(table);

    document.Close();
}