2014-10-24 2 views
0

PDF 페이지에 페이지를 삽입하려고합니다. 페이지가 끝에 추가되지 않거나 어딘가에 중간에 삽입 될 필요가 있기 시작합니다 (책갈피가있는 삽입 위치를 결정하는 방법이 있습니다).PdfStamper로 페이지를 삽입해도 양식 필드가 가져 오지 않습니다.

키는 북마크를 풀어서는 안됩니다. 그래서 PdfStamper를 사용하여 페이지를 삽입합니다. 문제는 삽입되는 pdfs에 양식 필드가 있고 해당 필드가 전달되지 않는다는 것입니다.

내가 필드를 복사하려면이 같은 시도했지만이 정확히 복사하지 않습니다

for (int pageNum = 1; pageNum <= readerPdfToAdd.NumberOfPages; pageNum++) 
{ 
    PdfImportedPage page = pdfStamper.GetImportedPage(readerPdfToAdd, pageNum); 
    pdfStamper.InsertPage(filesByCategory[i].PageOfInsert + pageNum, readerPdfToAdd.GetPageSizeWithRotation(pageNum)); 

    var rotation = readerPdfToAdd.GetPageRotation(pageNum); 
    if (rotation == 90 || rotation == 270) 
    { 
     pdfStamper.GetUnderContent(filesByCategory[i].PageOfInsert + pageNum) 
        .AddTemplate(page, 0, -1f, 1f, 0, 0, readerPdfToAdd.GetPageSizeWithRotation(pageNum).Height);           
    } 
    else 
    { 
     pdfStamper.GetUnderContent(filesByCategory[i].PageOfInsert + pageNum).AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 


    } 
} 

를 삽입 않는 코드입니다.

foreach (KeyValuePair<string, AcroFields.Item> kvp in pdfFormFields.Fields) 
{ 
    var s = pdfFormFields.GetFieldPositions("Date"); 

    PdfArray r = kvp.Value.GetWidget(0).GetAsArray(PdfName.RECT); 
    var name = kvp.Value.GetWidget(0).GetAsArray(PdfName.NAME); 
    Rectangle rr = new Rectangle(r.GetAsNumber(0).FloatValue, r.GetAsNumber(1).FloatValue, r.GetAsNumber(2).FloatValue, r.GetAsNumber(3).FloatValue); 
    TextField field = new TextField(pdfStamper.Writer, rr, kvp.Value.GetWidget(0).Get(PdfName.T).ToString()); 

    if (kvp.Value.GetWidget(0).Get(PdfName.V) != null) 
     field.Text = kvp.Value.GetWidget(0).Get(PdfName.V).ToString(); 
    // add the field here, the second param is the page you want it on 
    pdfStamper.AddAnnotation(field.GetTextField(), filesByCategory[i].PageOfInsert + pageNum); 

    fields.SetField(kvp.Key, kvp.Value.ToString()); 
} 

더 좋은 방법이 있나요? 나는 소스 문서에서 북마크를 잃어버린 PdfCopy를 시도했다.

+0

아, 당신은 상처의 세계에있을 것입니다. 대화 형 요소에 대한 PDF 사양 섹션을 확인하십시오. 바라건대 당신이 사용하고있는 라이브러리는 저수준을 지원하기 때문에 PDF 객체와 페이지 트리를 직접 조작 할 수 있습니다. – jjm

+0

잘 iTextsharp는 GetImportedPage가 필드를 가져 오지 않는 폼 데이터를 복사 할 수 있습니다. – Tigran

+0

잘못된 라이브러리 사용의 경우입니다. 'PdfStrapper'와'PdfCopy'를 결합해야합니다. –

답변

0

PdfCopy 또는 PdfSmartCopy을 사용하여 문서를 조합하십시오. chapter 6 of my book에 설명 된대로 PdfImportedPage은 콘텐츠 스트림에있는 내용 만 복사합니다.

원본 문서에 몇 가지 추가 콘텐츠를 찍기 위해서는 아마도 PdfStamper이 필요하지만 괜찮습니다.이 문서를 PdfCopy 또는 PdfSmartCopy과 결합하여 최종 문서를 조합해야합니다.

+0

브루노에게 감사드립니다. PdfCopy 및 PdfSmartCopy의 문제점은 책갈피가 손실되고 책갈피가 내 문서에 필수적이라는 것입니다. 나는 당신의 대답을 여기에서 보았다. http://stackoverflow.com/questions/14729237/add-file-with-bookmark 그래서 대신 북마크를 가지고 와라. 필자는 PdfStamper를 통해 독자를 전달하고 파일을 평평하게하기로 결정했습니다. 이렇게하면 양식 데이터를 얻습니다. 제 신청서에는 양식이 없다는 것이 좋습니다. 내용은 중요한 것입니다. – Tigran

+0

다른 대안입니다. 완벽을 기하기 위해 : 병합중인 다른 문서의 책갈피를 결합하고 해당 책갈피를'PdfCopy' 및'PdfSmartCopy' 인스턴스에 적용하는 것이 가능합니다. –