2010-01-15 9 views
4

죄송합니다. 내 비슷한 게시물이 있지만이 포럼에 새로 왔지만 찾지 못했습니다.TextField에 텍스트 맞추기 IText

동적으로 크기를 조정할 때 문제가 있습니다. TextField 크기는 텍스트 크기에 따라 다릅니다. 나는 AcroForm의 기존 PDF 채우기 필드를 채 웁니다.

form.setField ("field", "value"); (등)

모든 것이 정상이지만 필드 크기보다 큰 텍스트를 TextField에 설정하려고합니다. TextField (textField보다 큰 텍스트)에 맞게 setField 이후 또는 AcroForm 작성 프로세스의 일부 필드 속성을 동적으로 조정할 수있는 방법은 무엇입니까? 이 TextField는 글꼴 크기를 더 작은 크기로 변경하지 않고이 TextField에서 스크롤하지 않고 텍스트 크기와 정확히 동일한 크기를 가져야합니다.

도움을 주셔서 미리 감사드립니다.

+0

다른 질문이있을 것 같습니다. 13 년 넘게 PDF 작업을 한 경험이있는 사람은 없었습니다. –

답변

7

글자 크기를 변경하여 모든 텍스트를 볼 수 있도록 원하는대로 반대로하기 쉽습니다. 글꼴 크기를 '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을 얻는 방법을 알아 보도록하겠습니다. DocumentFontBaseFont.createFont(PRIndirectReference fontRef)으로 보내고 The PDF Spec의 챕터 12.7 (대화 형 양식)과 9.5-9.10 (다양한 글꼴 유형 ... 어떤 DocumentFont가 크게 도움이 될지)을 확인해야합니다. 간접 참조.

간접 참조가 무엇인지 알아 보려면 7.3 장, "객체", 특히 7.3.10, "간접 객체"를 읽어야합니다.

관련 문제