2013-05-02 5 views
4

이 방법을 사용하여 이미 생성 된 PDF 문서에 텍스트를 추가하고 있습니다. ITextSharp insert text to an existing pdf 기본적으로 PdfContentByte를 사용하고 콘텐츠 템플릿을 페이지에 추가합니다.텍스트를 추가하는 ITextSharp. 일부 텍스트가 나타나지 않음

파일의 일부 영역에서 텍스트가 표시되지 않습니다. 내가 추가중인 텍스트가 이미 페이지에있는 콘텐츠 뒤에 표시되고있는 것 같습니다. 나는 pdf 문서를 그냥 이미지로 평평하게 만들었지 만 평평한 파일에서도 같은 문제가 발생했습니다.

누군가가 Itextsharp를 사용하여 숨겨진 텍스트를 추가하는 데 문제가 있습니까?

아무 소용이 링크에서 제시 한대로 나는 또한 DirectContentUnder를 사용하여 시도 .. 여기 iTextSharp hides text when write

내가 위에 기본적으로 오버레이 그래프 용지에 노력하고 이것으로 ... 내가 사용하고있는 코드입니다 PDF. 이 예제에서는 모든 페이지의 왼쪽 위 모서리에 채워지지 않는 상자가 있습니다. 이 지점의 원본 pdf에 이미지가 있습니다. 그리고 4, 5 페이지에는 상자가 채워지지 않지만 이미지가 아닌 것 같습니다.

PdfReader reader = new PdfReader(oldFile); 
iTextSharp.text.Rectangle size = reader.GetPageSizeWithRotation(1); 
Document document = new Document(size); 

// open the writer 
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write); 
PdfWriter writer = PdfWriter.GetInstance(document, fs); 
document.Open(); 


// the pdf content 
PdfContentByte cb = writer.DirectContent; 


for (int i = 0; i < reader.NumberOfPages; i++) 
{ 
    document.NewPage(); 
    // select the font properties 
    BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 

    cb.SetFontAndSize(bf, 4); 
    cb.SetColorStroke(BaseColor.GREEN); 
    cb.SetLineWidth(1f); 
    for (int j = 10; j < 600; j += 10) 
    { 
     WriteToDoc(ref cb, j.ToString(), j, 10);//Write the line number 
     WriteToDoc(ref cb, j.ToString(), j, 780);//Write the line number 
     if (j % 20 == 0) 
     { 
      cb.MoveTo(j, 20); 
      cb.LineTo(j, 760); 
      cb.Stroke(); 
     } 
    } 
    for (int j = 10; j < 800; j += 10) 
    { 

     WriteToDoc(ref cb, j.ToString(), 5, j);//Write the line number 
     WriteToDoc(ref cb, j.ToString(), 590, j);//Write the line number 
     if (j % 20 == 0) 
     { 
      cb.MoveTo(15, j); 
      cb.LineTo(575, j); 
      cb.Stroke(); 
     } 
    } 




// create the new page and add it to the pdf 
PdfImportedPage page = writer.GetImportedPage(reader, i + 1); 
cb.AddTemplate(page, 0, 0); 

} 

// close the streams and voilá the file should be changed :) 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 

도움을 주셔서 감사합니다 ... 정말 고맙습니다! 모든 -Greg

답변

4

첫째 : 당신이 은 기본적으로 오버레이 그래프 용지는 PDF의 상단에, 왜 먼저 그래프 용지를 그릴 않고 그것에 원래 페이지를 근절하려는 경우? 당신은 본질적으로 그래프 용지, overlaying하지 underlay 있습니다.

페이지의 내용에 따라이 방법으로 그래프 용지를 쉽게 다룰 수 있습니다. 예 : 페이지 내용에 채워진 사각형이있는 경우 결과에 이 표시되며 모든 페이지의 왼쪽 위 모서리에 채워지지 않는 상자가 있습니다.

따라서 먼저 단순히 이전 페이지 콘텐츠를 추가 한 다음 오버레이 변경 사항을 추가하십시오.

기존 PDF에 변경 사항을 적용하는 작업에서 PdfWriterGetImportedPage을 사용하는 것이 최적의 결과를 얻지 못했습니다. 실제로는 기존 PDF에서 추가 내용을 스탬핑하기 위해 만들어진 PdfStamper 클래스의 작업입니다.

예. 중급 코드 인 sample StampText을 확인하십시오.

PdfReader reader = new PdfReader(resource); 
using (var ms = new MemoryStream()) 
{ 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) 
    { 
    PdfContentByte canvas = stamper.GetOverContent(1); 
    ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("Hello people!"), 36, 540, 0); 
    } 
    return ms.ToArray(); 
} 
+0

도움 주셔서 감사합니다. 나는 사용하고있는 코드를 이해하지 못했고 새로운 컨텐츠 위에 페이지 컨텐츠를 겹쳐 씌우고 있다는 것을 깨닫지 못했습니다. 방금 도면을 모든 도면 위에 오버레이하도록 코드를 이동 시켰으므로 이제는 정상적으로 작동합니다. 앞으로 필자는 PdfStamper도 살펴 보겠다. – smithygreg

+0

@smithygreg 새 코드 또는 코드의 변경 사항을 게시 할 수 있습니까? –

관련 문제