글자 크기를 변경하여 모든 텍스트를 볼 수 있도록 원하는대로 반대로하기 쉽습니다. 글꼴 크기를 '0'으로 설정하면 iText (또는 Acrobat 등)가 즉시 사용할 글꼴 크기를 결정합니다 (적절한 제한 내에서).
텍스트의 주어진 청크의 길이를 확인하려면
myBaseFont.getWidthPoint(fieldValToBe, fontSize)
를 호출 할 수 있습니다. 그런 다음
필드의 크기를 전에
setField
으로 호출 할 수 있습니다. iText는 기본적으로 필드 모양을 렌더링하고 사용자가
setField
일 때 렌더링을 완료합니다. 필드 크기를 변경하면
setField
을 다시 호출하지 않는 한 필드의 모양이 변경되지 않습니다.
좋아, 그럼 필드 크기를 어떻게 변경합니까? iText는 직접 지원하지 않으므로 iText의 저수준 PDF 객체를 사용해야합니다. 이런 식으로 뭔가 :
AcroFields.Item fldItem = myAcroFields.getFieldItem("fieldName");
for (int i =0; i < fldItem.size(); ++i) {
// "widget" is the visible portion of the field
PdfDictionary widgetDict = fldItem.getwidget(0);
// pdf rectangles are stored as [llx, lly, urx, ury]
PdfArray rectArr = widgetDict.getAsArray(PdfName.RECT); // should never be null
float origX = rectArr.getAsNumber(0).floatValue();
// overwrite the old value.
rectArr.set(2, new PdfNumber(origX + newWidth + FUDGE_FACTOR));
}
FUDGE_FACTOR 바로 & 왼쪽 테두리 두께를 설명 할 필요가있다. 경사 경계와 선 두께에 따라 3 ~ 5 점을 추측 할 수 있습니다. 당신은 아마 가치를 선택하고 함께 갈 수 있습니다.
둘 이상의 필드가 이름을 공유하는 경우는 드물기 때문에 루프는 아마도 불필요합니다. OTOH, 이것이 맞다면 다른 인스턴스가 동일한 글꼴 크기를 공유 할 필요가 없으므로 newWidth
을 다시 계산해야 할 수도 있습니다.
마지막으로이 새로운 rectArr을 위젯 버전과 함께 항목의 "병합"버전에 작성해야 할 수도 있습니다. iText는 가능한 모든 키/값 쌍이 바로 있기 때문에 필드를 조작 할 때 병합 된 버전으로 거의 보편적으로 작동합니다. 위젯 버전으로 상위 필드 값을 확인해야 할 수도 있습니다.
OTOH, 지정된 "병합 된"및 "위젯"은 동일한 사각형을 공유해야합니다 (PdfArray
). "Rect"는 "리프"값이며 부모로부터 상속되지 않으므로 위젯의 배열은 병합 된 사전에 "얕은 복사"되어 ... 공유됩니다. 어떤 경우이든 쉽게 확인하실 수 있습니다. 이 ==
하지 .equals
것을
assert item.getWidget(0).getAsArray(PdfName.RECT) ==
item.getMerged(0).getAsArray(PdfName.RECT);
참고. 나는 PdfArray 이이고 equals()
을 가지고 있다고 생각하지 않기 때문에이 점이 모두 관련이있는 것은 아닙니다.
아, 실제로 할 일이 있기 때문에 올바른 방향으로 조금 움직여서 자신의 필드에서 BaseFont을 얻는 방법을 알아 보도록하겠습니다. DocumentFont
을 BaseFont.createFont(PRIndirectReference fontRef)
으로 보내고 The PDF Spec의 챕터 12.7 (대화 형 양식)과 9.5-9.10 (다양한 글꼴 유형 ... 어떤 DocumentFont가 크게 도움이 될지)을 확인해야합니다. 간접 참조.
간접 참조가 무엇인지 알아 보려면 7.3 장, "객체", 특히 7.3.10, "간접 객체"를 읽어야합니다.
다른 질문이있을 것 같습니다. 13 년 넘게 PDF 작업을 한 경험이있는 사람은 없었습니다. –