Rotacionar Páginas de PDF Usando C++
Este tópico descreve como atualizar ou alterar a orientação das páginas em um arquivo PDF existente programaticamente com C++.
Alterar Orientação da Página
Aspose.PDF para C++ permite alterar a orientação da página de paisagem para retrato e vice-versa. Para alterar a orientação da página, defina o MediaBox da página usando o seguinte trecho de código. Você também pode alterar a orientação da página definindo o ângulo de rotação usando o método Rotate().
void ChangePageOrientation() {
String _dataDir("C:\\Samples\\");
String inputFileName("ChangeOrientation.pdf");
String outputFileName("ChangeOrientation_out.pdf");
// Abrir documento
auto document = MakeObject<Document>(_dataDir + inputFileName);
for (auto page : document->get_Pages())
{
auto r = page->get_MediaBox();
double newHeight = r->get_Width();
double newWidth = r->get_Height();
double newLLX = r->get_LLX();
// Precisamos mover a página para cima para compensar a mudança de tamanho da página
// (a borda inferior da página é 0,0 e a informação geralmente é colocada a partir do
// topo da página. É por isso que movemos a borda inferior para cima na diferença entre
// a altura antiga e a nova.
double newLLY = r->get_LLY() + (r->get_Height() - newHeight);
page->set_MediaBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));
// Às vezes, também precisamos definir o CropBox (se foi definido no arquivo original)
page->set_CropBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));
// Definindo ângulo de rotação da página
page->set_Rotate(Rotation::on90);
}
// Salvar arquivo de saída
document->Save(_dataDir + outputFileName);
}
Ajustando o Conteúdo da Página para a Nova Orientação da Página
Por favor, note que ao usar o trecho de código acima, parte do conteúdo do documento pode ser cortado porque a altura da página é reduzida. Para evitar isso, aumente a largura proporcionalmente e mantenha a altura intacta. Exemplo de cálculos:
void FittingPageContentToNewPageOrientation()
{
String _dataDir("C:\\Samples\\");
String inputFileName("ChangeOrientation.pdf");
String outputFileName("ChangeOrientation_out.pdf");
// Abrir documento
auto document = MakeObject<Document>(_dataDir + inputFileName);
for (auto page : document->get_Pages())
{
auto r = page->get_MediaBox();
// Nova altura a mesma
double newHeight = r->get_Height();
// Nova largura é expandida proporcionalmente para tornar a orientação paisagem
// (assumimos que a orientação anterior é retrato)
double newWidth = r->get_Height() * r->get_Height() / r->get_Width();
// ...
}
}
Além da abordagem acima, considere usar o facade PdfPageEditor, que pode aplicar zoom ao conteúdo das páginas.
void ZoomPageContent()
{
String _dataDir("C:\\Samples\\");
String inputFileName("ZoomToPageContents.pdf");
String outputFileName("ZoomToPageContents_out.pdf");
// Abrir documento
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Obter a região retangular da primeira página do PDF
auto rect = document->get_Pages()->idx_get(1)->get_Rect();
// Instanciar instância de PdfPageEditor
auto ppe = MakeObject<Aspose::Pdf::Facades::PdfPageEditor>();
// Vincular PDF de origem
ppe->BindPdf(_dataDir + inputFileName);
// Definir coeficiente de zoom
ppe->set_Zoom ((float)(rect->get_Width() / rect->get_Height()));
// Atualizar tamanho da página
ppe->set_PageSize(MakeObject<PageSize>((float)rect->get_Height(), (float)rect->get_Width()));
// Salvar arquivo de saída
document->Save(_dataDir + outputFileName);
}