Trabalhando com Operadores usando C++
Introdução aos Operadores de PDF e Seu Uso
Um operador é uma palavra-chave do PDF que especifica alguma ação que deve ser realizada, como desenhar uma forma gráfica na página. Uma palavra-chave de operador é distinguida de um objeto nomeado pela ausência de um caractere solidus inicial (2Fh). Operadores são significativos apenas dentro do fluxo de conteúdo.
Um fluxo de conteúdo é um objeto de fluxo PDF cujos dados consistem em instruções que descrevem os elementos gráficos a serem desenhados em uma página. Mais detalhes sobre operadores de PDF podem ser encontrados na especificação do PDF.
Detalhes da Implementação
Este tópico explica como usar operadores com Aspose.PDF. O exemplo selecionado adiciona uma imagem em um arquivo PDF para ilustrar o conceito. Para adicionar uma imagem em um arquivo PDF, são necessários diferentes operadores. Este exemplo usa GSave, ConcatenateMatrix, Do, e GRestore.
- O operador GSave salva o estado gráfico atual do PDF.
- O operador ConcatenateMatrix (concatenar matriz) é usado para definir como uma imagem deve ser posicionada na página do PDF.
- O operador Do desenha a imagem na página.
- O operador GRestore restaura o estado gráfico.
Para adicionar uma imagem em um arquivo PDF:
- Crie um objeto Document e abra o documento PDF de entrada.
- Obter a página específica à qual a imagem será adicionada.
- Adicione a imagem na coleção de Recursos da página.
- Use os operadores para posicionar a imagem na página:
- Primeiro, use o operador GSave para salvar o estado gráfico atual.
- Em seguida, use o operador ConcatenateMatrix para especificar onde a imagem deve 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.
O trecho de código a seguir mostra como usar operadores PDF.
void ExampleUsingOperators()
{
// Abrir documento
String _dataDir("C:\\Samples\\");
// Abrir documento
auto document = MakeObject<Document>(_dataDir + u"PDFOperators.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
auto page = document->get_Pages()->idx_get(1);
// Carregar imagem no stream
auto imageStream = System::IO::File::OpenRead(_dataDir + u"PDFOperators.jpg");
// Adicionar imagem à coleção de Imagens dos Recursos da Página
page->get_Resources()->get_Images()->Add(imageStream);
// Usando o operador GSave: este operador salva o estado gráfico atual
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Criar objetos Rectangle e Matrix
auto rectangle = MakeObject<Rectangle>(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
auto matrix = MakeObject<Matrix>(
new double[] {
rectangle->get_URX() - rectangle->get_LLX(), 0, 0,
rectangle->get_URY() - rectangle->get_LLY(),
rectangle->get_LLX(), rectangle->get_LLY() });
// Usando o operador ConcatenateMatrix (concatenar matriz): define como a imagem deve ser colocada
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::ConcatenateMatrix>(matrix));
auto ximage = page->get_Resources()->get_Images()->idx_get(page->get_Resources()->get_Images()->get_Count());
// Usando o operador Do: este operador desenha a imagem
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::Do>(ximage->get_Name()));
// Usando o operador GRestore: este operador restaura o estado gráfico
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
// Salvar documento atualizado
document->Save(_dataDir + u"PDFOperators_out.pdf");
}
Draw XForm on Page using Operators
Este tópico demonstra como usar os operadores GSave/GRestore, o operador ContatenateMatrix para posicionar um xForm e o operador Do para desenhar um xForm em uma página.
O código abaixo envolve o conteúdo existente de um arquivo PDF com o par de operadores GSave/GRestore. Esta abordagem ajuda a obter o estado gráfico inicial no final do conteúdo existente. Sem esta abordagem, transformações indesejáveis podem permanecer no final da cadeia de operadores existente.
void DrawXFormOnPageUsingOperators() {
// Abrir documento
String _dataDir("C:\\Samples\\");
String imageFile(_dataDir + u"aspose-logo.jpg");
String inFile(_dataDir + u"DrawXFormOnPage.pdf");
String outFile(_dataDir + u"blank-sample2_out.pdf");
auto document = MakeObject<Document>(inFile);
auto pageContents = document->get_Pages()->idx_get(1)->get_Contents();
// O exemplo demonstra
// Uso dos operadores GSave/GRestore
// Uso do operador ContatenateMatrix para posicionar o xForm
// Uso do operador Do para desenhar o xForm na página
// Envolver o conteúdo existente com o par de operadores GSave/GRestore
// isso é para obter o estado gráfico inicial no final do conteúdo existente
// caso contrário, podem permanecer algumas transformações indesejáveis no final da cadeia de operadores existente
pageContents->Insert(1, MakeObject<Aspose::Pdf::Operators::GSave>());
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
// Adicionar operador de estado gráfico de salvamento para limpar adequadamente o estado gráfico após novos comandos
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Criar xForm
auto form = XForm::CreateNewForm(document->get_Pages()->idx_get(1), document);
document->get_Pages()->idx_get(1)->get_Resources()->get_Forms()->Add(form);
form->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Definir largura e altura da imagem
form->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::ConcatenateMatrix>(200, 0, 0, 200, 0, 0));
// Carregar imagem no fluxo
auto imageStream = System::IO::File::OpenRead(imageFile);
// Adicionar imagem à coleção de Imagens dos Recursos do XForm
form->get_Resources()->get_Images()->Add(imageStream);
auto ximage = form->get_Resources()->get_Images()->idx_get(form->get_Resources()->get_Images()->get_Count());
// Usando o operador Do: este operador desenha a imagem
form->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::Do>(ximage->get_Name()));
form->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
// ----------------------------------------------------
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Colocar formulário nas coordenadas x=100 y=500
pageContents->Add(MakeObject<Aspose::Pdf::Operators::ConcatenateMatrix>(1, 0, 0, 1, 100, 500));
// Desenhar formulário com o operador Do
pageContents->Add(MakeObject<Aspose::Pdf::Operators::Do>(form->get_Name()));
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Colocar formulário nas coordenadas x=100 y=300
pageContents->Add(MakeObject<Aspose::Pdf::Operators::ConcatenateMatrix>(1, 0, 0, 1, 100, 300));
// Desenhar formulário com o operador Do
pageContents->Add(MakeObject<Aspose::Pdf::Operators::Do>(form->get_Name()));
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
// Restaurar estado gráfico com GRestore após o GSave
pageContents->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
document->Save(outFile);
}
Remover Objetos Gráficos usando Classes de Operadores
As classes de operadores oferecem ótimos recursos para manipulação de PDF. Quando um arquivo PDF contém gráficos que não podem ser removidos usando o método DeleteImage da classe PdfContentEditor, as classes de operadores podem ser usadas para removê-los.
O snippet de código a seguir mostra como remover gráficos. Observe que se o arquivo PDF contiver rótulos de texto para os gráficos, eles podem permanecer no arquivo PDF, usando essa abordagem. Portanto, procure os operadores gráficos para um método alternativo para excluir tais imagens.
void RemoveGraphicsObjects() {
// Abrir documento
String _dataDir("C:\\Samples\\");
// Abrir documento
auto document = MakeObject<Document>(_dataDir + u"RemoveGraphicsObjects.pdf");
auto page = document->get_Pages()->idx_get(2);
auto oc = page->get_Contents();
// Operadores de pintura de caminho usados
auto operators = MakeArray<System::SmartPtr<Operator>>({
MakeObject<Aspose::Pdf::Operators::Stroke>(),
MakeObject<Aspose::Pdf::Operators::ClosePathStroke>(),
MakeObject<Aspose::Pdf::Operators::Fill>()
});
oc->Delete(operators);
document->Save(_dataDir + u"No_Graphics_out.pdf");
}