Trabalhando com Artefatos em C++
Como obter Marca d’Água em PDF?
O que é um artefato em PDF?
De acordo com a referência PDF / UA ISO, o conteúdo que não é importante ou não aparece no fundo não carrega informações relevantes, deve ser marcado como um artefato para que tecnologias assistivas possam ignorá-lo. Se os artefatos não puderem ser identificados no programa para criar, isso deve ser feito manualmente usando Aspose.PDF para C++.
A classe Artifact contém as seguintes propriedades:
- Artifact.Type – obtém o tipo de artefato (suporta valores da enumeração Artifact.ArtifactType onde os valores incluem Background, Layout, Page, Pagination e Undefined).
- Artifact.Subtype – obtém o subtipo do artefato (suporta os valores da enumeração Artifact.ArtifactSubtype, onde os valores incluem Background, Footer, Header, Undefined, Watermark).
- Artifact.Contents – Obtém uma coleção de operadores internos do artefato. Seu tipo suportado é System.Collections.ICollection.
- Artifact.Form – Obtém o XForm de um artefato (se XForm for usado). Marcas d’água, artefatos de cabeçalho e rodapé contêm XForm que mostra todo o conteúdo do artefato.
- Artifact.Image – Obtém a imagem de um artefato (se uma imagem estiver presente, caso contrário, nulo).
- Artifact.Text – Obtém o texto de um artefato.
- Artifact.Rectangle – Obtém a posição de um artefato na página.
- Artifact.Rotation – Obtém a rotação de um artefato (em graus, valor positivo indica rotação no sentido anti-horário).
- Artifact.Opacity – Obtém a opacidade de um artefato. Valores possíveis estão na faixa de 0…1, onde 1 é completamente opaco.
Para um exemplo de trabalho com artefatos em um arquivo PDF, vamos pegar uma marca d’água.
Uma marca d’água criada com suporte para o Adobe Acrobat é referida como um artefato (conforme descrito em 14.8.2.2 Present Content and PDF Specification Artifacts). Para trabalhar com artefatos, Aspose.PDF contém 2 classes: Artifact e ArtifactCollection.
Para obter todos os artefatos em uma página específica, a classe Page possui a propriedade Artifacts. Este tópico mostra como trabalhar com o artefato de Marca d’água em arquivos PDF.
O trecho de código a seguir mostra como obter cada marca d’água na primeira página de um arquivo PDF com C++:
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;
void Artifacts::SetWatermark() {
String _dataDir("C:\\Samples\\");
auto document = MakeObject<Document>(_dataDir + u"sample.pdf");
auto artifact = MakeObject<WatermarkArtifact>();
String text(u"WATERMARK");
artifact->set_Text(text);
artifact->get_TextState()->set_ForegroundColor(Color::get_Blue());
artifact->get_TextState()->set_FontSize(72);
artifact->set_ArtifactHorizontalAlignment(HorizontalAlignment::Center);
artifact->set_ArtifactVerticalAlignment(VerticalAlignment::Center);
artifact->set_Rotation(45);
artifact->set_Opacity(0.5);
artifact->set_IsBackground(true);
document->get_Pages()->idx_get(1)->get_Artifacts()->Add(artifact);
document->Save(_dataDir + u"watermark.pdf");
}
Imagens de fundo podem ser usadas para adicionar marcas d’água ou designs exclusivos a documentos PDF. O Aspose.PDF para C++ usa a classe BackgroundArtifact para adicionar uma imagem de fundo ao objeto da página.
O próximo trecho de código mostra como adicionar uma imagem de fundo às páginas do PDF com o objeto BackgroundArtifact:
void Artifacts::SetBackground() {
String _dataDir("C:\\Samples\\");
// Abrir documento
auto pdfDocument = MakeObject<Document>();
// Adicionar um MakeObject<page ao objeto do documento
auto page = pdfDocument->get_Pages()->Add();
// Criar objeto Background Artifact
auto background = MakeObject<BackgroundArtifact>();
// Especificar a imagem para o objeto backgroundartifact
background->set_BackgroundImage(System::IO::File::OpenRead(_dataDir + u"background.png"));
// Adicionar BackgroundArtifact à coleção de artefatos da página
page->get_Artifacts()->Add(background);
// Salvar PDF modificado
pdfDocument->Save(_dataDir + u"ImageAsBackground_out.pdf");
}
Exemplos de Programação: Obtendo Marcas d’Água
O trecho de código a seguir mostra como obter cada marca d’água na primeira página de um arquivo PDF.
void Artifacts::GettingWatermarks() {
String _dataDir("C:\\Samples\\");
// Abrir documento
auto pdfDocument = MakeObject<Document>(_dataDir + u"watermark_new.pdf");
// Iterar e obter subtipo, texto e localização do artefato
for (auto artifact : pdfDocument->get_Pages()->idx_get(1)->get_Artifacts())
{
Console::WriteLine(u"{0} {1} {2}", artifact->get_Subtype(),
artifact->get_Text(), artifact->get_Rectangle());
}
}
Exemplos de Programação: Contando Artefatos de um Tipo Particular
Para calcular o total de artefatos de um tipo específico (por exemplo, o número total de marcas d’água), use o seguinte código:
void Artifacts::CountingArtifacts() {
String _dataDir("C:\\Samples\\");
// Abrir documento
auto pdfDocument = MakeObject<Document>(_dataDir + u"watermark_new.pdf");
int count = 0;
for (auto artifact : pdfDocument->get_Pages()->idx_get(1)->get_Artifacts())
{
// Se o tipo do artefato é marca d'água, aumentar o contador
if (artifact->get_Subtype() == Artifact::ArtifactSubtype::Watermark) count++;
}
Console::WriteLine(u"A página contém {0} marcas d'água", count);
}