Добавить холст между строкой в ​​itext 7 без перекрытия страниц - PullRequest
1 голос
/ 17 марта 2019

Можно ли добавить холст вместе с addParagraph в документ? у меня длинный текст (1000 страниц).

Мне нужно добавить холст между текстом в определенных местах (графика, фигуры и т. Д.).

Например, если в тексте есть слово "graph_add"

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PageSize ps = PageSize.A4;;
Document doc = new Document(pdfDoc, ps);
BufferedReader br = new BufferedReader(new FileReader("bigfileWithText.txt"));
while ((line = br.readLine()) != null) {
if("graph_add".equals(line))
//Add canvas in document in this place!!doc.add(Canvas)
doc.add(new Paragraph(line)
}
doc.close();

это пример файла: bigfileWithText.txt

эта статья https://itextpdf.com/ru/resources/books/itext-7-building-blocks/chapter-2-adding-content-canvas-or-document не подходит, здесь мне нужно создать на отдельной странице. Я в определенный момент после текста добавляю фигуру (Canvas) и затем снова добавляю текст. Примерно так: example image

1 Ответ

0 голосов
/ 01 апреля 2019

Что добавить

Прежде всего, вы не можете просто добавить Canvas к чему-либо, потому что Canvas просто является помощником для добавления контента непосредственно в указанный PdfCanvas, мост между различными уровнями API, ср. его JavaDoc:

/**
 * This class is used for adding content directly onto a specified {@link PdfCanvas}.
 * {@link Canvas} does not know the concept of a page, so it can't reflow to a 'next' {@link Canvas}.
 *
 * This class effectively acts as a bridge between the high-level <em>layout</em>
 * API and the low-level <em>kernel</em> API.
 */
public class Canvas extends RootElement<Canvas>

По аналогичной причине вы не можете добавить PdfCanvas, потому что он также просто является помощником для добавления контента непосредственно в поток контента страницы или формы XObject:

/**
 * PdfCanvas class represents an algorithm for writing data into content stream.
 * To write into page content, create PdfCanvas from a page instance.
 * To write into form XObject, create PdfCanvas from a form XObject instance.
 * Make sure to call PdfCanvas.release() after you finished writing to the canvas.
 * It will save some memory.
 */
public class PdfCanvas implements Serializable

Что вы можете добавить к чему-либо, так это форму XObject после ее оборачивания в Image.

Таким образом, вы должны сначала создать форму XObject, затем PdfCanvas, затем Canvas и заполнить Canvas вашим контентом:

PdfFormXObject pdfFormXObject = new PdfFormXObject(XOBJECT_SIZE);
PdfCanvas pdfCanvas = new PdfCanvas(pdfFormXObject, pdfDoc);
try (Canvas canvas = new Canvas(pdfCanvas, pdfDoc, pdfFormXObject.getBBox().toRectangle())) {
    ADD CONTENT TO canvas AS REQUIRED FOR THE USE CASE IN QUESTION
}

Затем вы можете обернуть форму XObject в Image и добавить ее в документ:

doc.add(new Image(pdfFormXObject));

Пример

Я использовал ваш пример текста и графического изображения (хранится как «Graph.png»):

String text = "Until recently, increasing dividend yields grabbed the headlines. However, increasing\n" + 
        "yields were actually more a reflection of the market capitalisation challenge than of the\n" + 
        "fortunes of mining shareholders. The yields mask a complete u-turn from boom-time\n" + 
        "dividend policies. More companies have now announced clear percentages of profit\n" + 
        "distribution policies. The big story today is the abandonment of progressive dividends\n" + 
        "by the majors, confirming that no miner was immune from a sustained commodity\n" + 
        "cycle downturn, however diversified their portfolio. \n" +
        "\ngraph_add\n\n" +
        "Shareholders were not fully rewarded for the high commodity prices and huge\n" + 
        "profits experienced in the boom, as management ploughed cash and profits into\n" + 
        "bigger and more marginal assets. During those times, production was the main\n" + 
        "game and shareholders were rewarded through soaring stock prices. However,\n" + 
        "this investment proposition relied on prices remaining high. ";

final Image img;
try (InputStream imageResource = getClass().getResourceAsStream("Graph.png")) {
    ImageData data = ImageDataFactory.create(StreamUtil.inputStreamToArray(imageResource));
    img = new Image(data);
}

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PageSize ps = PageSize.A4;;
Document doc = new Document(pdfDoc, ps);

Rectangle effectivePageSize = doc.getPageEffectiveArea(ps);
img.scaleToFit(effectivePageSize.getWidth(), effectivePageSize.getHeight());
PdfFormXObject pdfFormXObject = new PdfFormXObject(new Rectangle(img.getImageScaledWidth(), img.getImageScaledHeight()));
PdfCanvas pdfCanvas = new PdfCanvas(pdfFormXObject, pdfDoc);
try (Canvas canvas = new Canvas(pdfCanvas, pdfDoc, pdfFormXObject.getBBox().toRectangle())) {
    canvas.add(img);
}

BufferedReader br = new BufferedReader(new StringReader(text));
String line;
while ((line = br.readLine()) != null) {
    if("graph_add".equals(line)) {
        doc.add(new Image(pdfFormXObject));
    } else {
        doc.add(new Paragraph(line));
    }
}
doc.close();

( AddCanvasToDocument test testAddCanvasForRuslan)

Результат:

screen shot


В качестве отступления: если добавить к Canvas только один битовый массив, как в этом примере, очевидно, можно добавить Image img непосредственно к Document doc вместо использования формы XObject ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...