Добавление изображения в PDF с использованием C#

Добавление изображения в существующий PDF-файл

Каждая страница PDF содержит свойства Ресурсы и Содержимое. Ресурсы могут быть изображениями и формами, например, в то время как содержимое представлено набором операторов PDF. Каждый оператор имеет свое имя и аргумент. В этом примере используются операторы для добавления изображения в файл PDF.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Чтобы добавить изображение в существующий файл PDF:

  • Создайте объект Document и откройте входной PDF-документ.
  • Получите страницу, на которую вы хотите добавить изображение.
  • Добавьте изображение в коллекцию Ресурсов страницы.
  • Используйте операторы для размещения изображения на странице:
  • Используйте оператор GSave для сохранения текущего графического состояния.
  • Используйте оператор ConcatenateMatrix для указания местоположения изображения.
  • Используйте оператор Do для отрисовки изображения на странице.
  • Наконец, используйте оператор GRestore для сохранения обновленного графического состояния.
  • Сохраните файл. Следующий фрагмент кода показывает, как добавить изображение в документ PDF.
// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к директории документов.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();

// Открыть документ
Document pdfDocument = new Document(dataDir+ "AddImage.pdf");

// Установить координаты
int lowerLeftX = 100;
int lowerLeftY = 100;
int upperRightX = 200;
int upperRightY = 200;

// Получить страницу, куда нужно добавить изображение
Page page = pdfDocument.Pages[1];
// Загрузить изображение в поток
FileStream imageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open);
// Добавить изображение в коллекцию изображений ресурсов страницы
page.Resources.Images.Add(imageStream);
// Использование оператора GSave: этот оператор сохраняет текущее графическое состояние
page.Contents.Add(new Aspose.Pdf.Operators.GSave());
// Создать объекты Rectangle и Matrix
Aspose.Pdf.Rectangle rectangle = new Aspose.Pdf.Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
Matrix matrix = new Matrix(new double[] { rectangle.URX - rectangle.LLX, 0, 0, rectangle.URY - rectangle.LLY, rectangle.LLX, rectangle.LLY });
// Использование оператора ConcatenateMatrix (конкатенация матрицы): определяет, как должно быть размещено изображение
page.Contents.Add(new Aspose.Pdf.Operators.ConcatenateMatrix(matrix));
XImage ximage = page.Resources.Images[page.Resources.Images.Count];
// Использование оператора Do: этот оператор рисует изображение
page.Contents.Add(new Aspose.Pdf.Operators.Do(ximage.Name));
// Использование оператора GRestore: этот оператор восстанавливает графическое состояние
page.Contents.Add(new Aspose.Pdf.Operators.GRestore());
dataDir = dataDir + "AddImage_out.pdf";
// Сохранить обновленный документ
pdfDocument.Save(dataDir);
  • добавлена перегрузка метода Replace в класс XImageCollection: public void Replace(int index, Stream stream, int quality)
  • добавлена перегрузка метода Add в класс XImageCollection: public void Add(Stream stream, int quality)

Добавление изображения в существующий PDF файл (Facades)

Существует также альтернативный, более простой способ добавить изображение в PDF файл. Существует также альтернативный, более простой способ добавить изображение в файл PDF.

string imageFileName = Path.Combine(_dataDir, "Images", "Sample-01.jpg");
string outputPdfFileName = Path.Combine(_dataDir, "Example-add-image-mender.pdf");
Document document = new Document();
Page page = document.Pages.Add();
page.SetPageSize(PageSize.A3.Height, PageSize.A3.Width);
page = document.Pages.Add();
Aspose.Pdf.Facades.PdfFileMend mender = new Aspose.Pdf.Facades.PdfFileMend(document);
mender.AddImage(imageFileName, 1, 0, 0, (float)page.CropBox.Width, (float)page.CropBox.Height);
document.Save(outputPdfFileName);

Размещение изображения на странице с сохранением (контролем) пропорций

Если мы не знаем размеры изображения, существует большая вероятность получения искаженного изображения на странице. Следующий пример показывает один из способов избежать этого.

public static void AddingImageAndPreserveAspectRatioIntoPDF()
{
    var bitmap = System.Drawing.Image.FromFile(_dataDir + "3410492.jpg");

    int width;
    int height;

    width = bitmap.Width;
    height = bitmap.Height;

    var document = new Aspose.Pdf.Document();

    var page = document.Pages.Add();

    int scaledWidth = 400;
    int scaledHeight = scaledWidth * height / width;

    page.AddImage(_dataDir + "3410492.jpg", new Aspose.Pdf.Rectangle(10, 10, scaledWidth, scaledHeight));
    document.Save(_dataDir + "sample_image.pdf");
}

Определите, является ли изображение в PDF цветным или черно-белым

Различные типы сжатия могут быть применены к изображениям для уменьшения их размера. Тип применяемого сжатия зависит от цветового пространства исходного изображения, то есть если изображение цветное (RGB), то следует применить сжатие JPEG2000, а если оно черно-белое, то следует использовать сжатие JBIG2/JBIG2000. Поэтому определение типа каждого изображения и использование соответствующего типа сжатия позволит создать оптимальный результат.

Файл PDF может содержать элементы Текста, Изображения, Графики, Вложения, Аннотации и т.д., и если исходный файл PDF содержит изображения, мы можем определить цветовое пространство изображения и применить соответствующее сжатие для уменьшения размера файла PDF. Следующий фрагмент кода показывает шаги для определения, является ли изображение в PDF цветным или черно-белым.

// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к директории документов.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();

// Счетчик для изображений в оттенках серого
int grayscaled = 0;
// Счетчик для RGB изображений
int rgd = 0;

using (Document document = new Document(dataDir + "ExtractImages.pdf"))
{
    foreach (Page page in document.Pages)
    {
        Console.WriteLine("--------------------------------");
        ImagePlacementAbsorber abs = new ImagePlacementAbsorber();
        page.Accept(abs);
        // Получаем количество изображений на конкретной странице
        Console.WriteLine("Всего изображений = {0} на странице номер {1}", abs.ImagePlacements.Count, page.Number);
        // Document.Pages[29].Accept(abs);
        int image_counter = 1;
        foreach (ImagePlacement ia in abs.ImagePlacements)
        {
            ColorType colorType = ia.Image.GetColorType();
            switch (colorType)
            {
                case ColorType.Grayscale:
                    ++grayscaled;
                    Console.WriteLine("Изображение {0} в оттенках серого...", image_counter);
                    break;
                case ColorType.Rgb:
                    ++rgd;
                    Console.WriteLine("Изображение {0} в RGB...", image_counter);
                    break;
            }
            image_counter += 1;
        }
    }
}

Контроль качества изображения

Возможно контролировать качество изображения, которое добавляется в файл PDF. Используйте перегруженный метод Replace в классе XImageCollection.

Следующий фрагмент кода демонстрирует, как конвертировать все изображения документа в JPEG, используя 80% качества для сжатия.

Aspose.PDF.Document pdfDocument = new Aspose.PDF.Document(inFile);
foreach (Aspose.PDF.Page page in pdfDocument.Pages)
{
    int idx = 1;
    foreach (Aspose.PDF.XImage image in page.Resources.Images)
    {
        using (MemoryStream imageStream = new MemoryStream())
        {
            image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            page.Resources.Images.Replace(idx, imageStream, 80);
            idx = idx + 1;
        }
    }
}

// pdfDocument.OptimizeResources();

pdfDocument.Save(outFile);