📄 columntext.java
字号:
compositeColumn.minY = minY;
compositeColumn.maxY = maxY;
boolean keepCandidate = (para.getKeepTogether() && createHere && !firstPass);
status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
updateFilledWidth(compositeColumn.filledWidth);
if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
compositeColumn = null;
yLine = lastY;
return NO_MORE_COLUMN;
}
if (simulate || !keepCandidate)
break;
if (keep == 0) {
compositeColumn = null;
yLine = lastY;
}
}
firstPass = false;
yLine = compositeColumn.yLine;
linesWritten += compositeColumn.linesWritten;
descender = compositeColumn.descender;
if ((status & NO_MORE_TEXT) != 0) {
compositeColumn = null;
compositeElements.removeFirst();
yLine -= para.spacingAfter();
}
if ((status & NO_MORE_COLUMN) != 0) {
return NO_MORE_COLUMN;
}
}
else if (element.type() == Element.LIST) {
com.lowagie.text.List list = (com.lowagie.text.List)element;
ArrayList items = list.getItems();
ListItem item = null;
float listIndentation = list.getIndentationLeft();
int count = 0;
Stack stack = new Stack();
for (int k = 0; k < items.size(); ++k) {
Object obj = items.get(k);
if (obj instanceof ListItem) {
if (count == listIdx) {
item = (ListItem)obj;
break;
}
else ++count;
}
else if (obj instanceof com.lowagie.text.List) {
stack.push(new Object[]{list, new Integer(k), new Float(listIndentation)});
list = (com.lowagie.text.List)obj;
items = list.getItems();
listIndentation += list.getIndentationLeft();
k = -1;
continue;
}
if (k == items.size() - 1) {
if (!stack.isEmpty()) {
Object objs[] = (Object[])stack.pop();
list = (com.lowagie.text.List)objs[0];
items = list.getItems();
k = ((Integer)objs[1]).intValue();
listIndentation = ((Float)objs[2]).floatValue();
}
}
}
int status = 0;
for (int keep = 0; keep < 2; ++keep) {
float lastY = yLine;
boolean createHere = false;
if (compositeColumn == null) {
if (item == null) {
listIdx = 0;
compositeElements.removeFirst();
continue main_loop;
}
compositeColumn = new ColumnText(canvas);
compositeColumn.setUseAscender(firstPass ? useAscender : false);
compositeColumn.setAlignment(item.getAlignment());
compositeColumn.setIndent(item.getIndentationLeft() + listIndentation + item.getFirstLineIndent());
compositeColumn.setExtraParagraphSpace(item.getExtraParagraphSpace());
compositeColumn.setFollowingIndent(compositeColumn.getIndent());
compositeColumn.setRightIndent(item.getIndentationRight() + list.getIndentationRight());
compositeColumn.setLeading(item.getLeading(), item.getMultipliedLeading());
compositeColumn.setRunDirection(runDirection);
compositeColumn.setArabicOptions(arabicOptions);
compositeColumn.setSpaceCharRatio(spaceCharRatio);
compositeColumn.addText(item);
if (!firstPass) {
yLine -= item.spacingBefore();
}
createHere = true;
}
compositeColumn.leftX = leftX;
compositeColumn.rightX = rightX;
compositeColumn.yLine = yLine;
compositeColumn.rectangularWidth = rectangularWidth;
compositeColumn.rectangularMode = rectangularMode;
compositeColumn.minY = minY;
compositeColumn.maxY = maxY;
boolean keepCandidate = (item.getKeepTogether() && createHere && !firstPass);
status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
updateFilledWidth(compositeColumn.filledWidth);
if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
compositeColumn = null;
yLine = lastY;
return NO_MORE_COLUMN;
}
if (simulate || !keepCandidate)
break;
if (keep == 0) {
compositeColumn = null;
yLine = lastY;
}
}
firstPass = false;
yLine = compositeColumn.yLine;
linesWritten += compositeColumn.linesWritten;
descender = compositeColumn.descender;
if (!Float.isNaN(compositeColumn.firstLineY) && !compositeColumn.firstLineYDone) {
if (!simulate)
showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(item.getListSymbol()), compositeColumn.leftX + listIndentation, compositeColumn.firstLineY, 0);
compositeColumn.firstLineYDone = true;
}
if ((status & NO_MORE_TEXT) != 0) {
compositeColumn = null;
++listIdx;
yLine -= item.spacingAfter();
}
if ((status & NO_MORE_COLUMN) != 0) {
return NO_MORE_COLUMN;
}
}
else if (element.type() == Element.PTABLE) {
if (yLine < minY || yLine > maxY)
return NO_MORE_COLUMN;
PdfPTable table = (PdfPTable)element;
if (table.size() <= table.getHeaderRows()) {
compositeElements.removeFirst();
continue;
}
float yTemp = yLine;
float yLineWrite = yLine;
if (!firstPass && listIdx == 0) {
yTemp -= table.spacingBefore();
yLineWrite = yTemp;
}
currentLeading = 0;
if (yTemp < minY || yTemp > maxY)
return NO_MORE_COLUMN;
float x1 = leftX;
float tableWidth;
if (table.isLockedWidth()) {
tableWidth = table.getTotalWidth();
updateFilledWidth(tableWidth);
}
else {
tableWidth = rectangularWidth * table.getWidthPercentage() / 100f;
table.setTotalWidth(tableWidth);
}
int k;
boolean skipHeader = (!firstPass && table.isSkipFirstHeader() && listIdx <= table.getHeaderRows());
if (!skipHeader) {
yTemp -= table.getHeaderHeight();
if (yTemp < minY || yTemp > maxY) {
if (firstPass) {
compositeElements.removeFirst();
continue;
}
return NO_MORE_COLUMN;
}
}
if (listIdx < table.getHeaderRows())
listIdx = table.getHeaderRows();
for (k = listIdx; k < table.size(); ++k) {
float rowHeight = table.getRowHeight(k);
if (yTemp - rowHeight < minY)
break;
yTemp -= rowHeight;
}
if (k < table.size()) {
if (table.isSplitRows() && (!table.isSplitLate() || (k == listIdx && firstPass))) {
if (!splittedRow) {
splittedRow = true;
table = new PdfPTable(table);
compositeElements.set(0, table);
ArrayList rows = table.getRows();
for (int i = table.getHeaderRows(); i < listIdx; ++i)
rows.set(i, null);
}
float h = yTemp - minY;
PdfPRow newRow = table.getRow(k).splitRow(h);
if (newRow == null) {
if (k == listIdx)
return NO_MORE_COLUMN;
}
else {
yTemp = minY;
table.getRows().add(++k, newRow);
}
}
else if (!table.isSplitRows() && k == listIdx && firstPass) {
compositeElements.removeFirst();
splittedRow = false;
continue;
}
else if (k == listIdx && !firstPass && (!table.isSplitRows() || table.isSplitLate())) {
return NO_MORE_COLUMN;
}
}
firstPass = false;
if (!simulate) {
switch (table.getHorizontalAlignment()) {
case Element.ALIGN_LEFT:
break;
case Element.ALIGN_RIGHT:
x1 += rectangularWidth - tableWidth;
break;
default:
x1 += (rectangularWidth - tableWidth) / 2f;
}
int realHeaderRows = table.getHeaderRows();
int footerRows = table.getFooterRows();
if (footerRows > realHeaderRows)
footerRows = realHeaderRows;
realHeaderRows -= footerRows;
PdfPTable nt = PdfPTable.shallowCopy(table);
ArrayList rows = table.getRows();
ArrayList sub = nt.getRows();
if (!skipHeader) {
for (int j = 0; j < realHeaderRows; ++j)
sub.add(rows.get(j));
}
else
nt.setHeaderRows(footerRows);
for (int j = listIdx; j < k; ++j)
sub.add(rows.get(j));
for (int j = 0; j < footerRows; ++j)
sub.add(rows.get(j + realHeaderRows));
float rowHeight = 0;
if (table.isExtendLastRow()) {
PdfPRow last = (PdfPRow)sub.get(sub.size() - 1 - footerRows);
rowHeight = last.getMaxHeights();
last.setMaxHeights(yTemp - minY + rowHeight);
yTemp = minY;
}
if (canvases != null)
nt.writeSelectedRows(0, -1, x1, yLineWrite, canvases);
else
nt.writeSelectedRows(0, -1, x1, yLineWrite, canvas);
if (table.isExtendLastRow()) {
PdfPRow last = (PdfPRow)sub.get(sub.size() - 1 - footerRows);
last.setMaxHeights(rowHeight);
}
}
else if (table.isExtendLastRow() && minY > PdfPRow.BOTTOM_LIMIT)
yTemp = minY;
yLine = yTemp;
if (k >= table.size()) {
yLine -= table.spacingAfter();
compositeElements.removeFirst();
splittedRow = false;
listIdx = 0;
}
else {
if (splittedRow) {
ArrayList rows = table.getRows();
for (int i = listIdx; i < k; ++i)
rows.set(i, null);
}
listIdx = k;
return NO_MORE_COLUMN;
}
}
else
compositeElements.removeFirst();
}
}
/**
* Gets the canvas.
* @return a PdfContentByte.
*/
public PdfContentByte getCanvas() {
return canvas;
}
/**
* Sets the canvas.
* @param canvas
*/
public void setCanvas(PdfContentByte canvas) {
this.canvas = canvas;
this.canvases = null;
if (compositeColumn != null)
compositeColumn.setCanvas(canvas);
}
/**
* Sets the canvases.
* @param canvases
*/
public void setCanvases(PdfContentByte[] canvases) {
this.canvases = canvases;
this.canvas = canvases[PdfPTable.TEXTCANVAS];
if (compositeColumn != null)
compositeColumn.setCanvases(canvases);
}
/**
* Gets the canvases.
* @return an array of PdfContentByte
*/
public PdfContentByte[] getCanvases() {
return canvases;
}
/**
* Checks if UseAscender is enabled/disabled.
* @return true is the adjustment of the first line height is based on max ascender.
*/
public boolean isUseAscender() {
return useAscender;
}
/**
* Enables/Disables adjustment of first line height based on max ascender.
* @param use enable adjustment if true
*/
public void setUseAscender(boolean use) {
useAscender = use;
}
/**
* Checks the status variable and looks if there's still some text.
*/
public static boolean hasMoreText(int status) {
return (status & ColumnText.NO_MORE_TEXT) == 0;
}
/**
* Holds value of property filledWidth.
*/
private float filledWidth;
/**
* Gets the real width used by the largest line.
* @return the real width used by the largest line
*/
public float getFilledWidth() {
return this.filledWidth;
}
/**
* Sets the real width used by the largest line. Only used to set it
* to zero to start another measurement.
* @param filledWidth the real width used by the largest line
*/
public void setFilledWidth(float filledWidth) {
this.filledWidth = filledWidth;
}
/**
* Replaces the <CODE>filledWidth</CODE> if greater than the existing one.
* @param w the new <CODE>filledWidth</CODE> if greater than the existing one
*/
public void updateFilledWidth(float w) {
if (w > filledWidth)
filledWidth = w;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -