Поворот страниц PDF с использованием C++
В этой теме описано, как программно обновить или изменить ориентацию страниц в существующем PDF-файле с помощью C++.
Изменение ориентации страницы
Aspose.PDF for C++ позволяет изменить ориентацию страницы с альбомной на портретную и наоборот. Чтобы изменить ориентацию страницы, установите MediaBox страницы, используя следующий фрагмент кода. Вы также можете изменить ориентацию страницы, установив угол поворота с помощью метода Rotate().
void ChangePageOrientation() {
String _dataDir("C:\\Samples\\");
String inputFileName("ChangeOrientation.pdf");
String outputFileName("ChangeOrientation_out.pdf");
// Открыть документ
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();
// Мы должны переместить страницу вверх, чтобы компенсировать изменение размера страницы
// (нижний край страницы 0,0 и информация обычно размещается сверху страницы.
// Поэтому мы перемещаем нижний край вверх на разницу между старой и новой высотой.
double newLLY = r->get_LLY() + (r->get_Height() - newHeight);
page->set_MediaBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));
// Иногда нужно также установить CropBox (если он был установлен в исходном файле)
page->set_CropBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));
// Установка угла поворота страницы
page->set_Rotate(Rotation::on90);
}
// Сохранить выходной файл
document->Save(_dataDir + outputFileName);
}
Подгонка содержимого страницы к новой ориентации страницы
Пожалуйста, обратите внимание, что при использовании приведенного выше фрагмента кода, часть содержимого документа может быть обрезана, поскольку высота страницы уменьшена. Чтобы избежать этого, увеличьте ширину пропорционально и оставьте высоту без изменений. Пример расчетов:
void FittingPageContentToNewPageOrientation()
{
String _dataDir("C:\\Samples\\");
String inputFileName("ChangeOrientation.pdf");
String outputFileName("ChangeOrientation_out.pdf");
// Открыть документ
auto document = MakeObject<Document>(_dataDir + inputFileName);
for (auto page : document->get_Pages())
{
auto r = page->get_MediaBox();
// Новая высота та же
double newHeight = r->get_Height();
// Новая ширина увеличивается пропорционально, чтобы сделать ориентацию альбомной
// (мы предполагаем, что предыдущая ориентация - портретная)
double newWidth = r->get_Height() * r->get_Height() / r->get_Width();
// ...
}
}
Кроме вышеуказанного подхода, рассмотрите возможность использования фасада PdfPageEditor, который может применять масштабирование к содержимому страницы.
void ZoomPageContent()
{
String _dataDir("C:\\Samples\\");
String inputFileName("ZoomToPageContents.pdf");
String outputFileName("ZoomToPageContents_out.pdf");
// Открыть документ
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Получить прямоугольную область первой страницы PDF
auto rect = document->get_Pages()->idx_get(1)->get_Rect();
// Создать экземпляр PdfPageEditor
auto ppe = MakeObject<Aspose::Pdf::Facades::PdfPageEditor>();
// Привязать исходный PDF
ppe->BindPdf(_dataDir + inputFileName);
// Установить коэффициент увеличения
ppe->set_Zoom ((float)(rect->get_Width() / rect->get_Height()));
// Обновить размер страницы
ppe->set_PageSize(MakeObject<PageSize>((float)rect->get_Height(), (float)rect->get_Width()));
// Сохранить выходной файл
document->Save(_dataDir + outputFileName);
}