PIbd-33_Dyakonov_R_R_COP_14/WinFormsLibrary1/PdfWithImages.cs

178 lines
4.3 KiB
C#
Raw Permalink Normal View History

2024-09-29 21:12:45 +04:00
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WinFormsLibrary1.Configs.Image;
namespace WinFormsLibrary1
{
public partial class PdfWithImages : Component
{
private Document _document = null;
private Section _section = null;
private List<byte[]> _images = null;
private Document Document
{
get
{
if (_document == null)
{
_document = new Document();
}
return _document;
}
}
private Section Section
{
get
{
if (_section == null)
{
_section = Document.AddSection();
}
return _section;
}
}
private List<byte[]> Images
{
get
{
if (_images == null)
{
_images = new List<byte[]>();
}
return _images;
}
}
public PdfWithImages()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
InitializeComponent();
}
public PdfWithImages(IContainer container)
{
container.Add(this);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
InitializeComponent();
}
public void CreatePdf(PdfWithImageConfig config)
{
config.CheckFields();
CreateHeader(config.Header);
foreach (var image in config.Images)
{
CreateImage(image);
}
SavePdf(config.FilePath);
}
public void CreateHeader(string header)
{
var paragraph = Section.AddParagraph(header);
paragraph.Format.Font.Name = "Arial";
paragraph.Format.Font.Bold = true;
paragraph.Format.Font.Size = 20;
paragraph.Format.SpaceAfter = 10;
}
public void SavePdf(string filepath)
{
if (string.IsNullOrWhiteSpace(filepath))
{
throw new ArgumentNullException("Имя файла не задано");
}
if (_document == null || _section == null)
{
throw new ArgumentNullException("Документ не сформирован, сохранять нечего");
}
var pdfRenderer = new PdfDocumentRenderer(true)
{
Document = _document,
};
pdfRenderer.RenderDocument();
pdfRenderer.Save(filepath);
}
public void CreateImage(byte[] image)
{
if (image == null || image.Length == 0)
{
throw new ArgumentNullException("Картинка не загружена");
}
Images.Add(image);
var imageFileName = Path.GetTempFileName();
File.WriteAllBytes(imageFileName, image);
var img = Section.AddImage(imageFileName);
img.Width = Unit.FromCentimeter(15); // Можно настроить ширину изображения
img.LockAspectRatio = true;
Section.AddParagraph();
/*if (image == null || image.Length == 0)
{
throw new ArgumentNullException("Картинка не загружена");
}
Images.Add(image);
// Создаём временный файл
var imageFileName = Path.GetTempFileName();
File.WriteAllBytes(imageFileName, image);
// Открываем изображение и проверяем его ориентацию
using (var img = System.Drawing.Image.FromFile(imageFileName))
{
// Проверяем ориентацию и вращаем, если необходимо
if (Array.IndexOf(img.PropertyIdList, 274) > -1)
{
var orientation = (int)img.GetPropertyItem(274).Value[0];
switch (orientation)
{
case 3: // Переворот на 180 градусов
img.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
case 6: // Поворот на 90 градусов вправо
img.RotateFlip(RotateFlipType.Rotate90FlipNone);
break;
case 8: // Поворот на 90 градусов влево
img.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
}
}
// Сохраняем отредактированное изображение
img.Save(imageFileName);
}
// Вставляем изображение в PDF
var pdfImage = Section.AddImage(imageFileName);
pdfImage.Width = Unit.FromCentimeter(15); // Можно настроить ширину изображения
pdfImage.LockAspectRatio = true;
// Добавляем пустую строку после изображения
Section.AddParagraph();*/
}
}
}