PIbd-33_Dyakonov_R_R_COP_14/WinFormsLibrary1/PdfWithImages.cs
dyakonovr b4035d6b13 lab2
2024-09-29 21:12:45 +04:00

178 lines
4.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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