178 lines
4.3 KiB
C#
178 lines
4.3 KiB
C#
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();*/
|
||
}
|
||
}
|
||
}
|