2013-02-25 4 views
2

기존 PDF에 항목을 추가하는 올바른 방법은 있습니까? GetFileBytes 메서드는 디스크에서 PDF를 읽어서 배열로 변환하지만,이 방법은 정상적으로 작동하지만 결과 파일 NP.PDF는 원본과 완전히 동일합니다. 실제로는 바코드를 추가하고 싶지만 간단한 항목으로 먼저 작업 해보십시오.iTextSharp로 기존 PDF에 항목 추가

Byte[] bytes = GetFileBytes(); 

Document document = new Document(); 
MemoryStream ms = new MemoryStream(bytes); 

PdfWriter writer = PdfWriter.GetInstance(document, ms); 
document.Open(); 

document.Add(new Paragraph("First Paragraph")); 
document.Add(new Paragraph("Second Paragraph")); 
//document.Close(); 
ms.Position = 0; 

File.WriteAllBytes(@"e:\NP.pdf", (Byte[])ms.ToArray()); 

답변

5

이것은 내가 과거에해온 방법입니다. PDF 작성기에 새 스트림을 사용해야하고 원본 PDF 내용을 새 문서에 추가해야합니다. 이것은 최고 또는 가장 효율적인 수행 방법이 아닐 수도 있습니다. 단지 작품을 발견 한 것입니다.

원래의 PDF는 Stream에서 가져오고 병합 된 출력은 Stream으로 생성되지만 사용자의 요구에 맞게 조정할 수 있습니다.

var originalPdfStream = GetOriginalPdfStream(); 
var pdfDocument = Document(); 
var finalPdfStream = new MemoryStream(); 
var pdfWriter = PdfWriter.GetInstance(pdfDocument, finalPdfStream); 

pdfDocument.Open(); 

// Add the originalPdfStream into the pdfDocument 
var originalPdfReader = new PdfReader(originalPdfStream); 
AddPdf(document, writer, reader); 

// Code to add other items to the pdfDocument. 


pdfWriter.CloseStream = false; 
pdfDocument.Close(); 
finalPdfStream.Position = 0; 

return finalPdfStream; 

그러면 다음과 같은 방법으로 문서와 작성자 및 독자가 추가 할 문서를 가져옵니다.

/// <summary> 
/// Merge a PDF file into a PDF document. 
/// </summary> 
/// <param name="document">The PDF document.</param> 
/// <param name="writer">The PDF writer.</param> 
/// <param name="reader">A PDF reader.</param> 
private static void AddPdf(Document document, PdfWriter writer, PdfReader reader) 
{ 
    if (document == null) throw new ArgumentNullException("document"); 
    if (writer == null) throw new ArgumentNullException("writer"); 
    if (reader == null) throw new ArgumentNullException("reader"); 

    var numberOfPages = reader.NumberOfPages; 
    var originalPageSize = document.PageSize; 

    // Iterate through all pages 
    for (var currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++) 
    { 
     // Determine page size for the current page 
     document.SetPageSize(reader.GetPageSizeWithRotation(currentPageIndex)); 

     // Create page 
     document.NewPage(); 
     var importedPage = writer.GetImportedPage(reader, currentPageIndex); 

     // Determine page orientation and add page. 
     var pageRotation = reader.GetPageRotation(currentPageIndex); 
     var pageWidth = reader.GetPageSizeWithRotation(currentPageIndex).Width; 
     var pageHeight = reader.GetPageSizeWithRotation(currentPageIndex).Height; 
     switch (pageRotation) 
     { 
      case 0: 
       writer.DirectContent.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0); 
       break; 

      case 90: 
       writer.DirectContent.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pageHeight); 
       break; 

      case 180: 
       writer.DirectContent.AddTemplate(
        importedPage, -1f, 0, 0, -1f, pageWidth, pageHeight); 
       break; 

      case 270: 
       writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0); 
       break; 

      default: 
       throw new Exception("Unexpected page rotation: [{0}].", pageRotation); 
     } 
    } 

    document.SetPageSize(originalPageSize); 
} 
+0

정보 주셔서 감사합니다. 기존의 pdfstream을 문서에 추가하는 방법은 MemoryStream에있을 때 어떻게합니까? – Dave

+0

답변이 업데이트되었습니다. – TimS

+0

좋은 예입니다. 감사합니다. – Dave

3

만큼 추가 내용 (샘플 코드를 표시하는 것 같은) 새로운 중간 PDF를 (너무 큰 아니라면 만드는 것처럼 단지, 당신은 추가를 만들 수있는 새 페이지에한다, 그것은이있을 수 있습니다 메모리에) 다음 PdfCopy를 사용하여 PDF 파일을 연결 :

using (MemoryStream ms = new MemoryStream()) { 
    // step 1 
    using (Document document = new Document()) { 
    // step 2 
    using (PdfCopy copy = new PdfCopy(document, ms)) { 
     // step 3 
     document.Open(); 
     // step 4 
     for (int i = 0; i < pdf.Count; ++i) { 
     PdfReader reader = ...;// retrieve a PdfReader for the i'th PDF to concatenate 
     // loop over the pages in that document 
     int n = reader.NumberOfPages; 
     for (int page = 0; page < n;) { 
      copy.AddPage(copy.GetImportedPage(reader, ++page)); 
     } 
     } 
    } 
    } 
    byte[] data = ms.ToArray(); 
    ... 
} 

이 (뻔뻔 Webified iTextSharp ExampleConcatenate.cs)

에서 복사 한 반면에, 당신의 도장을 찍어하려는 경우 무료 샘플 iText in Action — 2nd Editionchapter 6를 읽어

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 
    ); 
    } 
    byte[] data = ms.ToArray(); 
    ... 
} 

추가 배경 정보를

(또한 뻔뻔 Webified iTextSharp ExampleStampText.cs에서 복사) : omething 기존 페이지에, 당신은 더 많은 가능성이 PdfStamper이 필요합니다.

+0

정보를 주셔서 대단히 감사합니다. – Dave

관련 문제