Adicionar Imagem ao PDF usando C#
Adicionar Imagem em um Arquivo PDF Existente
Cada página de um PDF contém propriedades de Recursos e Conteúdos. Recursos podem ser imagens e formulários, por exemplo, enquanto o conteúdo é representado por um conjunto de operadores PDF. Cada operador tem seu nome e argumento. Este exemplo usa operadores para adicionar uma imagem a um arquivo PDF.
O seguinte trecho de código também funciona com a biblioteca Aspose.PDF.Drawing.
Para adicionar uma imagem a um arquivo PDF existente:
- Crie um objeto Document e abra o documento PDF de entrada.
- Obtenha a página na qual você deseja adicionar uma imagem.
- Adicione a imagem à coleção de Recursos da página.
- Use operadores para posicionar a imagem na página:
- Use o operador GSave para salvar o estado gráfico atual.
- Use o operador ConcatenateMatrix para especificar onde a imagem será colocada.
- Use o operador Do para desenhar a imagem na página.
- Finalmente, use o operador GRestore para salvar o estado gráfico atualizado.
- Salve o arquivo. O seguinte trecho de código mostra como adicionar a imagem em um documento PDF.
// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Abrir documento
Document pdfDocument = new Document(dataDir+ "AddImage.pdf");
// Definir coordenadas
int lowerLeftX = 100;
int lowerLeftY = 100;
int upperRightX = 200;
int upperRightY = 200;
// Obter a página onde a imagem precisa ser adicionada
Page page = pdfDocument.Pages[1];
// Carregar imagem em stream
FileStream imageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open);
// Adicionar imagem à coleção de Imagens dos Recursos da Página
page.Resources.Images.Add(imageStream);
// Usando o operador GSave: este operador salva o estado gráfico atual
page.Contents.Add(new Aspose.Pdf.Operators.GSave());
// Criar objetos Retângulo e Matriz
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 });
// Usando o operador ConcatenateMatrix (concatenar matriz): define como a imagem deve ser colocada
page.Contents.Add(new Aspose.Pdf.Operators.ConcatenateMatrix(matrix));
XImage ximage = page.Resources.Images[page.Resources.Images.Count];
// Usando o operador Do: este operador desenha a imagem
page.Contents.Add(new Aspose.Pdf.Operators.Do(ximage.Name));
// Usando o operador GRestore: este operador restaura o estado gráfico
page.Contents.Add(new Aspose.Pdf.Operators.GRestore());
dataDir = dataDir + "AddImage_out.pdf";
// Salvar documento atualizado
pdfDocument.Save(dataDir);
- a sobrecarga do método Replace foi adicionada na classe XImageCollection: public void Replace(int index, Stream stream, int quality)
- a sobrecarga do método Add foi adicionada na classe XImageCollection: public void Add(Stream stream, int quality)
Adicionar Imagem em um Arquivo PDF Existente (Facades)
Existe também uma alternativa, maneira mais fácil de adicionar uma Imagem a um arquivo PDF. Existe também uma alternativa mais fácil para adicionar uma Imagem a um arquivo 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);
Colocar imagem na página e preservar (controlar) a proporção
Se não conhecemos as dimensões da imagem, há sempre a chance de obter uma imagem distorcida na página. O exemplo a seguir mostra uma das maneiras de evitar isso.
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");
}
Identificar se a imagem dentro do PDF é Colorida ou Preto e Branco
Diferentes tipos de compressão podem ser aplicados às imagens para reduzir seu tamanho. O tipo de compressão aplicada depende do espaço de cor da imagem original, ou seja, se a imagem for Colorida (RGB), então a compressão JPEG2000 deve ser aplicada, e se for Preto e Branco, então deve-se aplicar a compressão JBIG2/JBIG2000. Portanto, identificar cada tipo de imagem e usar um tipo apropriado de compressão criará uma saída melhor/otimizada.
Um arquivo PDF pode conter elementos como Texto, Imagem, Gráfico, Anexo, Anotação etc, e se o arquivo PDF original contiver imagens, podemos determinar o espaço de cor da imagem e aplicar a compressão apropriada para reduzir o tamanho do arquivo PDF. O seguinte trecho de código mostra os passos para Identificar se a imagem dentro do PDF é Colorida ou Preto e Branco.
// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Contador para imagens em escala de cinza
int grayscaled = 0;
// Contador para imagens 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);
// Obter a contagem de imagens em uma página específica
Console.WriteLine("Total de Imagens = {0} na página número {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("Imagem {0} é Escala de Cinza...", image_counter);
break;
case ColorType.Rgb:
++rgd;
Console.WriteLine("Imagem {0} é RGB...", image_counter);
break;
}
image_counter += 1;
}
}
}
Controlar a Qualidade da Imagem
É possível controlar a qualidade de uma imagem que está sendo adicionada a um arquivo PDF. Use o método Replace sobrecarregado na classe XImageCollection.
O seguinte trecho de código demonstra como converter todas as imagens do documento em JPEGs que usam 80% de qualidade para compressão.
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);