2017-02-16 15 views
0

Мне нужно добавить динамический текст в pdf. Мне нужно проверить, что текст не переполняет поле границы, которое мне разрешено использовать для размещения текста.iText Обнаружение переполнения текста или копирования

  • Есть ли способ определить, происходит ли это?
  • Существуют ли какие-либо правила копирования, которые я могу использовать для обработки, когда это произойдет?

Благодаря

+0

Вы используете iText5 или iText7? Тег itext обычно относится к первому. Кроме того, java или .Net? Обе версии имеют некоторый способ моделирования размещения контента, но ответ зависит от версии: –

+0

* «Мне нужно добавить динамический текст в pdf» * - Как это сделать? Вы хотите заполнить текстовые поля ** AcroForm **? Или вы хотите добавить ** FreeText ** (** FreeTextTypeWriter **) аннотации? Или вы хотите добавить на страницу ** Содержание ** потоки? – mkl

+0

Определите «динамический текст». Это текст, который вам неизвестен до запуска вашей программы? Или это как сообщения mkl? –

ответ

2

iText5 находится в режиме обслуживания, и я рекомендую вам начать свой проект с помощью iText7. iText7 в настоящее время не предоставляет из коробки механизмы для копирования, но это можно сделать вручную с небольшим усилием, потому что механизм компоновки очень гибкий в iText7. Технически это можно сделать и в iText5, но я предоставлю ответ для iText7 для Java, и преобразование в C# не должно быть проблемой для вас.

Основная идея состоит в том, чтобы использовать концепцию Renderers и попытаться сопоставить свой абзац в данной области с разными размерами шрифтов, пока не найдете размер, который подходит для вас. Подход бинарного поиска идеально подходит здесь.

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); 
Document doc = new Document(pdfDoc); 

String text = "..."; 
Rectangle area = new Rectangle(100, 100, 200, 200); 
// Just draw a black box around to verify the result visually 
new PdfCanvas(pdfDoc.addNewPage()).rectangle(area).setStrokeColor(Color.BLACK).stroke(); 

Paragraph p = new Paragraph(text); 
IRenderer renderer = p.createRendererSubTree().setParent(doc.getRenderer()); 
LayoutArea layoutArea = new LayoutArea(1, area); 

// lFontSize means the font size which will be definitely small enough to fit all the text into the box. 
// rFontSize is the maximum bound for the font size you want to use. The only constraint is that it should be greater than lFontSize 
// Set rFontSize to smaller value if you don't want the font size to scale upwards 
float lFontSize = 0.0001f, rFontSize = 10000; 

// Binary search. Can be replaced with while (Math.abs(lFontSize - rFontSize) < eps). It is a matter of implementation/taste 
for (int i = 0; i < 100; i++) { 
    float mFontSize = (lFontSize + rFontSize)/2; 
    p.setFontSize(mFontSize); 
    LayoutResult result = renderer.layout(new LayoutContext(layoutArea)); 
    if (result.getStatus() == LayoutResult.FULL) { 
     lFontSize = mFontSize; 
    } else { 
     rFontSize = mFontSize; 
    } 
} 

// lFontSize is guaranteed to be small enough to fit all the text. Using it. 
float finalFontSize = lFontSize; 
System.out.println("Final font size: " + finalFontSize); 
p.setFontSize(finalFontSize); 
// We need to layout the final time with the final font size set. 
renderer.layout(new LayoutContext(layoutArea)); 
renderer.draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.getPage(1)))); 

doc.close(); 

Выход:

Final font size: 5.7393746 

Визуальный результат:

The output PDF looks like this

 Смежные вопросы

  • Нет связанных вопросов^_^