Автоматическое масштабирование изображений с помощью iTextSharp - PullRequest
2 голосов
/ 14 февраля 2012

Я генерирую PDF-файлы из моего приложения на C # 4.0 с помощью iTextSharp API.Я передам HTML-строку, которая будет содержать Rich Text и изображения.Размер моего файла PDF - A4 с полями по умолчанию.Заметил, что когда у меня большое по размеру изображение (например, высота = "701px" width = "935px"), изображение не приходит в PDF.Похоже, мне нужно уменьшить размер изображения, которое должно соответствовать размеру PDF A4.Я проверил это, вставив изображение в текстовый документ формата A4, MS Word автоматически уменьшает изображение на 36%, т. Е. MS Word берет только 64% ​​исходного размера изображения и устанавливает абсолютную высоту и ширину.

* 1002Может ли кто-нибудь помочь имитировать подобное поведение в C #?

Дайте мне знать, как автоматически установить высоту и ширину изображения для размещения в файле PDF формата A4.

1 Ответ

7 голосов
/ 14 февраля 2012

Это верно, iTextSharp не будет автоматически подбирать изображения слишком большого размера для документа.Так что это просто вопрос:

  • Расчет доступной ширины и высоты документа с полями слева / справа и сверху / снизу.
  • Получение ширины и высоты изображения.
  • Сравнение ширины и высоты документа с шириной и высотой изображения.
  • Масштабирование изображения при необходимости.

Вот один из способов, см. Встроенные комментарии:

// change this to any page size you want    
Rectangle defaultPageSize = PageSize.A4;   
using (Document document = new Document(defaultPageSize)) {
  PdfWriter.GetInstance(document, STREAM);
  document.Open();
// if you don't account for the left/right margins, the image will
// run off the current page
  float width = defaultPageSize.Width
    - document.RightMargin
    - document.LeftMargin
  ;
  float height = defaultPageSize.Height
    - document.TopMargin
    - document.BottomMargin
  ;
  foreach (string path in imagePaths) {
    Image image = Image.GetInstance(path);
    float h = image.ScaledHeight;
    float w = image.ScaledWidth;
    float scalePercent;
// scale percentage is dependent on whether the image is 
// 'portrait' or 'landscape'        
    if (h > w) {
// only scale image if it's height is __greater__ than
// the document's height, accounting for margins
      if (h > height) {
        scalePercent = height / h;
        image.ScaleAbsolute(w * scalePercent, h * scalePercent);
      }
    }
    else {
// same for image width        
      if (w > width) {
        scalePercent = width / w;
        image.ScaleAbsolute(w * scalePercent, h * scalePercent);
      }
    }
    document.Add(image);
  }
}

Единственное, на что стоит обратить внимание, это то, что imagePaths выше - это string[], так что вы можете проверить, что происходит при добавлении коллекции изображений, которые должны быть большими, чтобы уместиться на странице.

Другой способпоместить изображение в один столбец, одну ячейку PdfPTable :

PdfPTable table = new PdfPTable(1);
table.WidthPercentage = 100;
foreach (string path in imagePaths) {
  Image image = Image.GetInstance(path);
  PdfPCell cell = new PdfPCell(image, true);
  cell.Border = Rectangle.NO_BORDER;
  table.AddCell(cell);
}
document.Add(table);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...