【问题标题】:How do you add a paragraph with an image to a cell in a table in iTextSharp?如何将带有图像的段落添加到 iTextSharp 表格中的单元格中?
【发布时间】:2014-09-22 17:33:51
【问题描述】:

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

我在处理图像时遇到了一些问题。鉴于 OpenXml 的结构,图像始终是段落内的绘图元素。如果段落直接在文档中,这可以正常工作,基本上就像这样(本示例中的递归解开):

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 => 表格 => 单元格 => 段落 => 绘图

所以在 iTextSharp 术语中,它映射到:

文档 => 表格 => 单元格 => 段落 => 图像

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

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 中提取图像并保存它,它会保留原始图像的尺寸。

【问题讨论】:

    标签: c# itextsharp


    【解决方案1】:

    尝试直接将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() 方法来更改此百分比。

    【讨论】:

    • 是的,这可以解决问题 - 但我需要将它添加到段落中,因为这就是结构在 OpenXml 中递归的方式。如果我找不到其他选择,我想我将不得不对结构进行后处理并删除段落,但肯定有一些方法可以解决这种行为......这就是我正在寻找的。跨度>
    • 您使用的是哪个版本的 iText?刚才我们不是在 XML Writer 的上下文中解决了这个问题吗?如果您使用的是最新版本,我们可能会遇到回归问题。
    • iTextSharp 的 5.5.1.0 - 我很高兴听到升级将修复它。
    • 好的,那么这不是我们遇到的同一个问题。 XML Worker 可能会遇到类似的问题,即 标记被包裹在
      标记内...
    • 我实际上并没有使用Xml Worker...上面的示例代码会产生问题,如果它确实是一个问题,而不仅仅是我使用它错误。
    【解决方案2】:

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

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

    前导是固定的,因此图像会调整大小以适合。设置

    changeLeading = true //fourth parameter
    

    图片正常显示

    【讨论】:

      【解决方案3】:

      可以试试这个:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签