我正在创建一个解析器,将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中提取图像并保存它,它会保留原始图像的尺寸。
答案 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();
}