4

Я использую Apache POI XWPF для создания и обработки документов MS Word. Но я не нашел в документации, как изменить ориентацию страницы.Как установить ориентацию страницы для документа Word?

Видимо этот путь должен сделать это:

XWPFDocument doc = new XWPFDocument(); 

CTDocument1 document = doc.getDocument(); 
CTBody body = document.getBody(); 

if (!body.isSetSectPr()) { 
    body.addNewSectPr(); 
} 
CTSectPr section = body.getSectPr(); 

if(!section.isSetPgSz()) { 
    section.addNewPgSz(); 
} 
CTPageSz pageSize = section.getPgSz(); 

pageSize.setOrient(STPageOrientation.LANDSCAPE); 

Но этот метод не работает должным образом. Я могу настроить ориентацию страницы на альбомную, и когда я прочитаю ориентацию страницы в коде, я получаю пейзаж. Отлично. Но если я открою сохраненный документ, у меня есть портретный формат. Этот параметр не работает. В чем может быть проблема?

В качестве обходного пути я вынужден начать работу с чистого документа, созданного вручную в альбомном или портретном формате. Но я хочу создавать документы программно с нуля в нужной ориентации.

Например, POI HSSF and XSSF имеют функциональность для переключения между пейзажным и портретным режимами. Это setLandscape() метод org.apache.poi.ss.usermodel.PrintSetup интерфейс.

Но как насчет XWPF или HWPF?

+0

Вы попробуйте прочитать [Apache POI FAQ о том, что делать, когда Класс CTsomething отсутствует в java-методе poi-ooxml-схем] (http://poi.apache.org/faq.html#faq-N10025)? – Gagravarr

+0

@Gagravarr Спасибо за ваше замечание. Но это не решает мою проблему. Я добавил правильные версии всех необходимых банок. И я не получаю никаких исключений, все компилируется и запускается. Но тема по-прежнему актуальна. ** Как правильно изменить ориентацию документа? ** Приведенный выше код не работает должным образом. Я установил ориентацию страницы в альбомном порядке, но я продолжаю видеть портретный формат при открытии документа. – kapand

+0

Если вы установили документ в «Пейзаж» в слове, сохраните его как .docx, затем распакуйте полученный файл (.docx - это zip из xml-файлов), где действительно устанавливается ориентация? – Gagravarr

ответ

10

Вы были очень на правильном пути. Настройка ориентации на пейзаж описывает общую ориентацию бумаги, но по-прежнему будет нуждаться в размере размера. У вашего объекта CTPageSz этого еще нет.

Это означает, что в дополнение к вашему вызову setOrient вам необходимо установить setW и setH. Эти вызовы берут BigIntegers, которые являются представителями 1/20 Point. Для ландшафтного типа ПИСЬМА бумаги, следовательно, вы будете просто:

pageSize.setW(BigInteger.valueOf(15840)); 
pageSize.setH(BigInteger.valueOf(12240)); 

Для слов, чтобы признать это, как ландшафтные, ширину должна быть больше, чем высота. Вы по-прежнему хотите сохранить вызов setOrient, если хотите, чтобы он правильно себя вел при печати.

Вот некоторые общие размеры бумаги в точках из https://www.gnu.org/software/gv/manual/html_node/Paper-Keywords-and-paper-size-in-points.html вы должны принять эти и умножить их на двадцать, чтобы использовать в указанном выше способе вызывает

Letter  612x792 
LetterSmall 612x792 
Tabloid  792x1224 
Ledger  1224x792 
Legal  612x1008 
Statement 396x612 
Executive 540x720 
A0   2384x3371 
A1   1685x2384 
A2   1190x1684 
A3   842x1190 
A4   595x842 
A4Small  595x842 
A5   420x595 
B4   729x1032 
B5   516x729 
Folio  612x936 
Quarto  610x780 
10x14  720x1008 
Смежные вопросы