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