Как продолжить альбомную ориентацию для конкретного тега div при преобразовании HTML в PDF в Itext 7?

<div isLandscape=false style="page-break-after:always">
<p class="title">
this is the first title in the portrait mode
</p>
<div>
this is the content following the first title in portrait mode
</div>
</div>
<div isLandscape=true style="page-break-after:always">
<p class="title">
this is the first title in the Landscape mode
</p>
<div style="page-break-after:always">
this is the content following the first title in Landscape mode
</div>
<p>
This content which is on the next page should be rendered on a landscape 
page and all the content in this parent div should continue to be in the 
landscape page.
</p>
</div>
<div isLandscape=false style="page-break-after:always">
<p class="title">
this content should be rendered on the portrait page and continue to be on a 
portrait page till the end of the parent div tag.
</p>
</div>

Я хочу, чтобы первое содержимое div было на книжной странице A4, а следующее - на альбомной странице A4 в альбомной ориентации. Это должно происходить не по повороту, а путем фактической установки размера страницы.

1 ответ

Решение

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

Ниже я сделал быстрый пример, который меняет ориентацию каждые X страниц:

public void createPdfFromHtml(String htmlSource, String pdfDest, String resoureLoc) throws IOException, InterruptedException {
    File pdf = new File(pdfDest);
    pdf.getParentFile().mkdirs();

    //convertToElements takes the string containing the HTML as input
    byte[] bytes = StreamUtil.inputStreamToArray(new FileInputStream(htmlSource));
    String html = new String(bytes);


    PdfWriter writer = new PdfWriter(pdfDest);
    PdfDocument pdfDoc = new PdfDocument(writer);

    Document doc = new Document(pdfDoc,pageSize);


    // Create the page size modifying event handler
    PageSize pageSize = PageSize.A4;
    pageSize = pageSize.rotate();//Start in landscape
    int differentPageSizeInterval = 5;
    PageSizeModifier pageSizeModifier = new PageSizeModifier(doc, differentPageSizeInterval, pageSize);
    //Register it to the pdfDocument and set it to trigger at the start of a page
    pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE,pageSizeModifier);
    ConverterProperties converterProperties = new ConverterProperties();
    converterProperties.setBaseUri(resoureLoc);
    //Convert the html to elements
    try {
        //parse and return the top level elements of the <body>
        List<IElement> elements = HtmlConverter.convertToElements(html, converterProperties);
        for (IElement ele : elements) {
            //Add the elements to the layout document
            doc.add((BlockElement) ele);
        }
        doc.close();
    } catch (PdfException e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

protected class PageSizeModifier implements IEventHandler {

    Document doc;
    int interval;
    int counter;
    PageSize pageSize;

    public PageSizeModifier(Document doc, int interval,PageSize pageSize) {
        this.doc = doc; //A reference to the layout document must be kept so we can change the margins on the fly
        this.interval = interval;
        this.counter = 1;
        this.pageSize = pageSize;//Start out in landscape
    }
    @Override
    public void handleEvent(Event event) {
        if(counter == interval){
            //Rotate
            pageSize = pageSize.rotate();
            //For the rendering framework, change the default page size
            doc.getPdfDocument().setDefaultPageSize(pageSize);

            //because the page was already created, we need to update the various boxes determining the pagesize
            //By default, only the trim and mediabox will be present
            ((PdfDocumentEvent) event).getPage().setMediaBox(pageSize);
            ((PdfDocumentEvent) event).getPage().setTrimBox(pageSize);

            //Reset the counter
            counter = 1;

        }else{
            counter++;
        }

    }
Другие вопросы по тегам