Search in sources :

Example 1 with PdfTextArray

use of com.itextpdf.kernel.pdf.PdfTextArray in project i7j-pdfsweep by itext.

the class PdfCleanUpProcessor method cleanText.

private void cleanText(String operator, List<PdfObject> operands) {
    List<TextRenderInfo> textChunks = null;
    PdfArray cleanedText = null;
    if ("TJ".equals(operator)) {
        PdfArray originalTJ = (PdfArray) operands.get(0);
        if (originalTJ.isEmpty()) {
            // we can safely ignore it
            return;
        }
        // text chunk index in original TJ
        int i = 0;
        PdfTextArray newTJ = new PdfTextArray();
        for (PdfObject e : originalTJ) {
            if (e.isString()) {
                if (null == textChunks) {
                    textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
                }
                PdfArray filteredText = filter.filterText(textChunks.get(i++)).getFilterResult();
                newTJ.addAll(filteredText);
            } else {
                newTJ.add(e);
            }
        }
        cleanedText = newTJ;
    } else {
        // if operator is Tj or ' or "
        textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
        PdfCleanUpFilter.FilterResult<PdfArray> filterResult = filter.filterText(textChunks.get(0));
        if (filterResult.isModified()) {
            cleanedText = filterResult.getFilterResult();
        }
    }
    // if text wasn't modified cleanedText is null
    if (cleanedText == null || cleanedText.size() != 1 || !cleanedText.get(0).isNumber()) {
        if (null == textChunks) {
            textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
        }
        // all text chunks even in case of TJ have the same graphics state
        TextRenderInfo text = textChunks.get(0);
        writeNotAppliedGsParamsForText(text);
        beginTextObjectAndOpenNotWrittenTags();
        writeNotAppliedTextStateParams(text);
        textPositioning.writePositionedText(operator, operands, cleanedText, getCanvas());
    } else {
        // cleaned text is tj array with single number - it means that the whole text chunk was removed
        CanvasGraphicsState gs = getCanvas().getGraphicsState();
        // process new lines if necessary
        if ("'".equals(operator) || "\"".equals(operator)) {
            List<PdfObject> newLineList = new ArrayList<>();
            newLineList.add(new PdfLiteral("T*"));
            textPositioning.appendPositioningOperator("T*", newLineList);
        }
        textPositioning.appendTjArrayWithSingleNumber(cleanedText, gs.getFontSize(), gs.getHorizontalScaling());
    }
}
Also used : CanvasGraphicsState(com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState) PdfLiteral(com.itextpdf.kernel.pdf.PdfLiteral) PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfTextArray(com.itextpdf.kernel.pdf.PdfTextArray) TextRenderInfo(com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo) PdfObject(com.itextpdf.kernel.pdf.PdfObject) ArrayList(java.util.ArrayList) Point(com.itextpdf.kernel.geom.Point)

Example 2 with PdfTextArray

use of com.itextpdf.kernel.pdf.PdfTextArray in project i7j-pdfsweep by itext.

the class TextPositioning method writeText.

private void writeText(String operator, List<PdfObject> operands, PdfArray cleanedText, PdfCanvas canvas) {
    CanvasGraphicsState canvasGs = canvas.getGraphicsState();
    boolean newLineShowText = "'".equals(operator) || "\"".equals(operator);
    if (newLineShowText) {
        if (canvasGs.getLeading() != currLeading) {
            canvas.setLeading(currLeading);
        }
        // after new line operator, removed text shift doesn't matter
        removedTextShift = null;
    }
    PdfTextArray tjShiftArray = null;
    if (removedTextShift != null) {
        float tjShift = (float) removedTextShift * 1000 / (canvasGs.getFontSize() * canvasGs.getHorizontalScaling() / 100);
        tjShiftArray = new PdfTextArray();
        tjShiftArray.add(new PdfNumber(tjShift));
    }
    if (cleanedText != null) {
        if (newLineShowText) {
            // char spacing and word spacing are set via writeNotAppliedTextStateParams() method
            canvas.newlineText();
        }
        if (removedTextShift != null) {
            tjShiftArray.addAll(cleanedText);
            cleanedText = tjShiftArray;
        }
        canvas.showText(cleanedText);
    } else {
        if (removedTextShift != null) {
            canvas.showText(tjShiftArray);
        }
        PdfCleanUpProcessor.writeOperands(canvas, operands);
    }
}
Also used : CanvasGraphicsState(com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState) PdfTextArray(com.itextpdf.kernel.pdf.PdfTextArray) PdfNumber(com.itextpdf.kernel.pdf.PdfNumber)

Aggregations

PdfTextArray (com.itextpdf.kernel.pdf.PdfTextArray)2 CanvasGraphicsState (com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState)2 Point (com.itextpdf.kernel.geom.Point)1 PdfArray (com.itextpdf.kernel.pdf.PdfArray)1 PdfLiteral (com.itextpdf.kernel.pdf.PdfLiteral)1 PdfNumber (com.itextpdf.kernel.pdf.PdfNumber)1 PdfObject (com.itextpdf.kernel.pdf.PdfObject)1 TextRenderInfo (com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo)1 ArrayList (java.util.ArrayList)1