iTextSharp - PDF - 调整文档大小以容纳大图像

时间:2012-01-03 14:44:43

标签: c# .net image pdf itext

我正在使用iTextSharp将大图像转换为PDF文档。

这样可行,但图像会出现裁剪,因为它们超出了生成文档的边界。

所以问题是 - 如何使文档与插入图像的大小相同?

我正在使用以下代码:

  Document doc = new Document(PageSize.LETTER.Rotate());
  try
  {
     PdfWriter.GetInstance(doc, new FileStream(saveFileDialog1.FileName,FileMode.Create));
     doc.Open();
     doc.Add(new Paragraph());
     iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imagePath);
     doc.Add(img);
   }
   catch
   {
      // add some code here incase you have an exception
   }
   finally
   {
      //Free the instance of the created doc as well
      doc.Close();
   }

2 个答案:

答案 0 :(得分:4)

iText和iTextSharp中的Document对象是一种抽象,可以自动处理各种间距,填充和边距。不幸的是,这也意味着当您致电doc.Add()时,它会考虑到文档的现有边距。 (另外,如果你碰巧添加任何其他内容,图像也将相对于此添加。)

一种解决方案就是删除边距:

doc.SetMargins(0, 0, 0, 0);

相反,将图像直接添加到调用PdfWriter得到的PdfWriter.GetInstance()对象更容易。您目前正在丢弃并且不存储该对象,但您可以轻松地将您的行更改为:

PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(saveFileDialog1.FileName,FileMode.Create));

然后,您可以访问DirectContent的{​​{1}}属性并调用其PdfWriter方法:

AddImage()

在此之前,您还必须通过调用以下方式绝对定位图像:

writer.DirectContent.AddImage(img);

以下是针对iTextSharp 5.1.1.0的完整工作的C#2010 WinForms应用,它显示了上面的img.SetAbsolutePosition(0, 0); 方法。它动态创建两个不同大小的图像,两个红色箭头横向和纵向延伸。你的代码显然只是使用标准的图像加载,因此可以省略很多,但我想提供一个完整的工作示例。有关详细信息,请参阅代码中的注释。

DirectContent

答案 1 :(得分:3)

尝试这样的方法来纠正您的问题

foreach (var image in images)
{
    iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Jpeg);

    if (pic.Height > pic.Width)
    {
        //Maximum height is 800 pixels.
        float percentage = 0.0f;
        percentage = 700 / pic.Height;
        pic.ScalePercent(percentage * 100);
    }
    else
    {
        //Maximum width is 600 pixels.
        float percentage = 0.0f;
        percentage = 540 / pic.Width;
        pic.ScalePercent(percentage * 100);
    }

    pic.Border = iTextSharp.text.Rectangle.BOX;
    pic.BorderColor = iTextSharp.text.BaseColor.BLACK;
    pic.BorderWidth = 3f;
    document.Add(pic);
    document.NewPage();
}