2016-06-06 1 views
1

Visual Studio에서 iTextSharp로 작업하고 있습니다. 나는 다음과 같은 Pdfannotation을 만들었습니다.iTextSharp를 사용하여 텍스트 주석을 허용/거부/취소 한 것으로 표시하거나 숨기려면 어떻게해야합니까? C#

그래서 내 주석 내용에 "내 글을 씁니다"라는 내용이 있습니다. 필자는 Adobe Acrobat Reader를 사용하여 pdf 파일을 열었으며 "의견"버튼을 클릭하여 PDF에 쓴 모든 주석을 보았습니다. 내 의견을 보았고 "내 텍스트를 쓰겠습니다"라는 내 의견을 보았습니다. 나는 체크하거나 체크를 풀 수있는 작은 사각형을 보았다. 이것은 Pdf 주석을 만들 때 자동으로 생성 된 작은 체크 박스입니다. 나는 혼자서 그것을 만들지 않았다.

iTextSharp를 사용하여이 작은 확인란을 선택 또는 선택 취소하고 싶습니다.

나는 그렇게 생각하지만, 그것은 작동하지 않습니다

RadioCheckField checkbox = new RadioCheckField(stamper.Writer, rect, "bonjour", "on"); 
     checkbox.CheckType = RadioCheckField.TYPE_CHECK; 
     checkbox.Checked = true; 
     PdfFormField field = checkbox.CheckField; 

     annotation.Put(PdfName.A, field); 

사람이 그것을 수행하는 방법을 알고 있나요?

정말 고마워요!

좋은 하루 되세요! :)

+0

텍스트 주석을 작성 중입니다. 텍스트 주석을 선택하거나 선택 취소 할 수 없습니다. 확인란을 어떻게 만드는지 보여주세요. –

+0

Adobe Acrobat Reader를 보면 주석을 추가 한 후 주석을 선택하거나 선택 취소 할 수 있음을 알 수 있습니다. 나는 사진을 추가 할 수 없다. 웹 사이트는 나를 허용하지 않는다. – Caryluna

+0

질문이 정확하지 않습니다. 텍스트 주석 (일명 스티커 메모)을 만들고 있습니다. [here] (http://itextpdf.org/documents/stickynote.png)와 같이 표시를 체크 표시로 변경할 수 있지만 이는 사용자가 요구하는 것이 아닙니다. 확인란을 선택/선택 취소 할 것인지 묻는 중입니다. 체크 박스는 위젯 주석으로 표시되는 양식 필드이며, 텍스트 주석이 아닌 양식 주석입니다. 더 정확하게 말하십시오! –

답변

0

텍스트 (또는 스티커 메모) 주석의 컨텍스트에서 "확인/선택 취소"라는 용어 때문에 질문이 다소 혼란 스럽습니다. 올바른 용어는 다음과 같습니다. 텍스트 주석을 표시/해제하는 방법은 무엇입니까?

은/우리가 확인란에 대해 생각하게 즉시 체크 해제하지만 다음 스크린 샷은 우리가 텍스트 주석 표시에 대해 이야기 할 때 무엇을 의미하는지 보여줍니다

검사 : 텍스트 주석을 표시

enter image description here

것은 아니다 확인란을 선택해야합니다. 텍스트 주석을 표시하는 것은 숨겨진 "In Reply To"(IRT) 주석을 추가하여 수행됩니다. "답장"주석에 대한 자세한 내용은 공식 사이트 How to add an "In Reply To" annotation?을 참조하십시오.

나는 결과로 AddMarked으로 AddInReplyTo 예를 적용했습니다

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfDictionary page = reader.getPageN(1); 
    PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
    PdfDictionary sticky = annots.getAsDict(0); 
    PdfArray stickyRect = sticky.getAsArray(PdfName.RECT); 
    PdfDictionary popup = annots.getAsDict(1); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    PdfWriter writer = stamper.getWriter(); 
    Rectangle stickyRectangle = new Rectangle(
     stickyRect.getAsNumber(0).floatValue(), stickyRect.getAsNumber(1).floatValue(), 
     stickyRect.getAsNumber(2).floatValue(), stickyRect.getAsNumber(3).floatValue() 
    ); 
    PdfAnnotation replySticky = PdfAnnotation.createText(
      writer, stickyRectangle, "Bruno", "Marked set by Bruno", false, "Comment"); 
    replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0)); 
    replySticky.put(PdfName.STATE, new PdfString("Marked")); 
    PdfNumber n = sticky.getAsNumber(PdfName.F); 
    replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN)); 
    replySticky.put(new PdfName("StateModel"), new PdfString("Marked")); 
    stamper.addAnnotation(replySticky, 1); 
    stamper.close(); 
} 

예는 자바이지만 C 번호에 적응하기 상당히 쉬워야한다. 원본 주석을 sticky으로 표시하려면 추가 주석 replySticky을 추가해야합니다. 일반적인 IRT 주석과의 차이점은 주석의 플래그에 FLAGS_HIDDEN을 추가하여 주석을 숨길 것이라는 점입니다. /StateMarked/StateModelMarked으로 설정합니다.

이 코드는 요청한대로 hello_sticky_note.pdfhello_marked.pdf으로 바꿉니다. 그러나 catch가 있습니다! 이 확인란은 사용자 "Bruno"로 로그인 한 경우에만 표시됩니다. 이 확인란은 개인적인 용도로만 사용됩니다.

다른 사용자가 리뷰 상태를 볼 수있게하려면 "표시된"기능을 사용하면 안됩니다. 대신 "검토"를 사용해야합니다. 이것은 ISO-32000에서 잘 설명되어 있지 않습니다.제목 "텍스트 주석에 고유 한 추가 항목"으로 표를 참조하십시오

enter image description here

을 표 제목 "주석 상태"로 테이블을 참조 :

enter image description here

우리가 사용했던 조합 StateModel = 표시; 상태 =으로 표시됩니다. 즉, 사용자가 주석을 표시했음을 의미합니다. 나는이 마크가 문서를 표시 한 사용자의 기계에서만 볼 수 있음을 사양에서 발견하지 못했습니다.

PdfAnnotation replySticky = PdfAnnotation.createText(
     writer, stickyRectangle, "Bruno", "Accepted by Bruno", false, "Comment"); 
replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0)); 
replySticky.put(PdfName.STATE, new PdfString("Accepted")); 
PdfNumber n = sticky.getAsNumber(PdfName.F); 
replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN)); 
replySticky.put(new PdfName("StateModel"), new PdfString("Review")); 
stamper.addAnnotation(replySticky, 1); 
stamper.close(); 

이 예는 우리가 지금 조합을 사용하는 것을 제외하고 우리가 이전 한 것과 동일하다 :

이를 발견 한 후, 나는 AddAccepted 예를 만들었습니다 StateModel = 검토; 상태 = 수락. "주석 상태"표에서 알 수 있듯이 상태에 대한 다른 가능한 옵션은 "거부 됨", "취소됨", "완료 됨"및 "없음"(기본값)입니다.

결과는 다음과 같습니다 당신이 볼 수 있듯이

enter image description here

는 녹색 확인 표시가 코멘트 패널에 나타납니다. 그것은 브루노에 로그인 한 사용자가 아닌 컴퓨터에서 "브루노 수락"을 보여줍니다. 여기에서 직접 확인하실 수 있습니다 : hello_accepted.pdf

+0

답을 구하는 것보다! 왜이 줄을 사용합니까? replySticky.Put (PdfName.IRT, annots.GetAsIndirectObject (0)); 글을 쓸 때 "Bruno가 표시 한 내 댓글"답변이 더 이상 표시되지 않기 때문에. 그리고 글을 쓰지 않으면 내 대답은 여기에 있지만 문제는 계속됩니다. 나의 대답은 표시되어 있지 않습니다. – Caryluna

+0

예제를 그대로 복사하지 마십시오. 'IRT' 키를 제거하면 내 대답을 이해할 수 없습니다. 'IRT'는 ** In Reply To **를 나타냅니다. **이 엔트리의 값은 표시가 필요한 주석에 대한 참조입니다. 간단한 예제에서는 쉽습니다. 하나의 주석 만 있으므로, 첫 번째 주석 인'annots.getAsIndirectObject (0)'을 사용할 수 있습니다. 귀하의 경우, 표시하고자하는 주석의 색인으로 '0'을 변경해야합니다. hello_sticky_note.pdf에서 예제를 시도해보십시오.어떤 일이 일어나는지 검토하고 필요에 따라 간단한 예를 적용하십시오. –

+0

pdf 예제 hello_sticky_note.pdf로 코드를 복사했는데 작동하지 않습니다. "Bruno에 의해 설정된 표시"라는 대답은 나타나지 않고 표시도 0입니다. – Caryluna

관련 문제