2010-10-18 39 views
12

Tôi đã có một danh sách các byte [] mà tôi muốn nối vào một byte [] sẽ là PDf cuối cùng.Tạo iTextSharp một pdf từ danh sách các mảng byte

Trên "page = copy.GetImportedPage (PdfReader mới (p), i);" tôi nhận được một "tài liệu tham khảo đối tượng không được đặt để một lỗi dụ

tôi đã không có manh mối về những gì. xảy ra, tôi đã kiểm tra tất cả các đối tượng và không có vô

Bất kỳ ý tưởng về vấn đề này, hoặc một đoạn mã mà có thể làm các trick ?!

tôi đã có phương pháp này:.

EDIT

 public static byte[] concatAndAddContent(List<byte[]> pdf) 
    { 
     byte [] todos; 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      Document doc = new Document(); 
      doc.Open(); 

      PdfCopy copy = new PdfCopy(doc, ms); 
      PdfCopyFields copy2 = new PdfCopyFields(ms); 


      PdfReader reader; 
      foreach (byte[] p in pdf) 
      { 
       reader = new PdfReader(p); 
       int pages = reader.NumberOfPages; 

       // loop over document pages 
       for (int i = 1; i < pages; i++) 
       { 
        PdfImportedPage page = copy.GetImportedPage(reader, i); 
        PdfCopy.PageStamp stamp = copy.CreatePageStamp(page); 
        PdfContentByte cb = stamp.GetUnderContent(); 
        cb.SaveState(); 
        stamp.AlterContents(); 
        copy.AddPage(page); 
       } 
      } 

      doc.Close(); 
      todos = ms.GetBuffer(); 
      ms.Flush(); 
      ms.Dispose(); 
     } 

     return todos; 
    } 

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] 
    iTextSharp.text.pdf.PdfImportedPage..ctor(PdfReaderInstance readerInstance, PdfWriter writer, Int32 pageNumber) +45 
    iTextSharp.text.pdf.PdfReaderInstance.GetImportedPage(Int32 pageNumber) +175 
    iTextSharp.text.pdf.PdfCopy.GetImportedPage(PdfReader reader, Int32 pageNumber) +256 
    SAM.Web.Classes.UtileriasReportes.concatAndAddContent(List`1 pdf) in \Classes\UtileriasReportes.cs:199 
    SAM.Web.Classes.UtileriasReportes.ObtenReporteOdt(Int32 ordenTrabajoID, Boolean caratula, Boolean juntas, Boolean cortes, Boolean materiales, Boolean resumenMateriales) 

in D:\MIMOSS\Desarrollo\SAM 2.0\Desarrollo\WebSolution\SAM.Web\Classes\UtileriasReportes.cs:168 
    SAM.Web.Produccion.PopupImpresionOdt.btnImprimir_Click(Object sender, EventArgs e) in \PopupImpresionOdt.aspx.cs:44 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563 

nhờ thời gian của bạn!

+0

bạn có thể đăng stack trace –

+0

tôi đã thêm stacktrace. Cảm ơn vì đã dành thời gian cho tôi! – valin077

+0

Chỉ là một điều nhỏ nhặt để chỉ ra. Bởi vì GetImportedPage không phải là 0 dựa, bạn phải bắt đầu i val của bạn tại 1. Chỉ cần chắc chắn rằng bây giờ giá trị trang của bạn (NumberOfPages) cho phép bạn để có được tất cả các dữ liệu của bạn. Ngay bây giờ bạn dường như đang thiếu trang cuối cùng của bất kỳ tài liệu PDF nào. – Crag

Trả lời

36

Tôi đã figured it out, chỉ cần như vậy everbody có thể có giải pháp: ở đây là:

public static byte[] concatAndAddContent(List<byte[]> pdf) 
    { 
     byte [] all; 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      Document doc = new Document(); 

      PdfWriter writer = PdfWriter.GetInstance(doc, ms); 

      doc.SetPageSize(PageSize.LETTER); 
      doc.Open(); 
      PdfContentByte cb = writer.DirectContent; 
      PdfImportedPage page; 

      PdfReader reader; 
      foreach (byte[] p in pdf) 
      { 
       reader = new PdfReader(p); 
       int pages = reader.NumberOfPages; 

       // loop over document pages 
       for (int i = 1; i <= pages; i++) 
       { 
        doc.SetPageSize(PageSize.LETTER); 
        doc.NewPage(); 
        page = writer.GetImportedPage(reader, i); 
        cb.AddTemplate(page, 0, 0); 
       } 
      } 

      doc.Close(); 
      all = ms.GetBuffer(); 
      ms.Flush(); 
      ms.Dispose(); 
     } 

     return all; 
    } 

Hy vọng rằng sẽ giúp!

+0

Bạn là một huyền thoại! Cảm ơn bạn đã quay lại để chia sẻ cái nugget này. –

0

Tìm kiếm mã itextsharp có thể là nó không phải lúc nào cũng hoạt động tốt với nhiều người đọc trên cùng một nội dung.

tôi đề nghị bạn thử

page = copy.GetImportedPage(reader, i); 

hơn là tạo ra một độc giả mới cho mỗi trang web mà bạn đang cố gắng để đọc.

UPDATE: Tôi không biết nếu giúp nhưng

tôi sao chép và dán mã của bạn và tôi nhận được một NullReferenceException nhưng chỉ trên dòng này

stamp.AlterContents(); 

Đó là lạ vì đó là sau khi +

Khi truyền tải nội dung xấu trong Danh sách tôi có thể tạo ra tiêu đề thiếu PDF, Không tìm thấy đoạn giới thiệu v.v., vì vậy tôi không nghĩ sự khác biệt của nó trong nội dung của p

Tôi đang sử dụng phiên bản 5.0.4 với phiên bản mã nguồn được tích hợp sẵn trong VS 2008. Khách hàng là so với 2010. Có lẽ tài khoản này dành cho sự khác biệt.

+0

Cảm ơn bạn đã trả lời, nhưng điều đó không có tác dụng, tôi đã chỉnh sửa mã vì vậy đây là những gì tôi có ngay bây giờ: – valin077

+0

Đầu đọc PdfReader; foreach (byte [] p trong pdf) { reader = new PdfReader (p); int pages = reader.NumberOfPages; // vòng qua các trang tài liệu cho (int i = 0; i valin077

+0

của tôi xấu, tôi thực sự sửa đổi mã thay đổi tên byte [] từ todos cho tất cả, và bỏ qua nó, nhưng đó không phải là vấn đề. Tôi sẽ chỉnh sửa mã và để nó giống như tôi có ngay bây giờ. Cảm ơn bạn đã giúp đỡ. – valin077

0

Không chắc chắn nếu điều này sẽ sửa chữa nó cho bạn, nhưng hãy thử khởi tạo GetImportedPage bắt đầu từ trang 1, không phải 0 nhưng usng int i = 1 trong vòng lặp của bạn. Như thế này:

// loop over document pages 
//was (int i = 0; i < pages; i++) { 
for (int i = 1; i < pages; i++) { 
    page = copy.GetImportedPage(new PdfReader(p), i); 
    stamp = copy.CreatePageStamp(page); 
    PdfContentByte cb = stamp.GetUnderContent(); 
    cb.SaveState(); 
    stamp.AlterContents(); 
    copy.AddPage(page); 
} 
+0

thực sự thats chính xác, bằng cách sử dụng GetImportedPage (reader, 0) nó trả về một lỗi, nhưng bắt đầu từ trang 1 giữ cho tôi ngoại lệ tham chiếu null. Tôi bị lạc ở đây, không thể hiểu được tại sao. Cảm ơn, tôi thực sự đánh giá cao sự giúp đỡ của bạn! – valin077

0

Tôi đã sử dụng câu trả lời ở trên và PDF rất lớn .. Tôi nghĩ sẽ hữu ích khi quay lại và cung cấp liên kết này đã giải quyết xong vấn đề này cùng với vấn đề PDF LARGE cho tôi.

https://stackoverflow.com/a/6752769

2

này hoạt động:

sử dụng iTextSharp-LGPL 4.1.6:

public static byte[] ConcatenatePdfs(IEnumerable<byte[]> documents) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var outputDocument = new Document(); 
      var writer = new PdfCopy(outputDocument, ms); 
      outputDocument.Open(); 

      foreach (var doc in documents) 
      { 
       var reader = new PdfReader(doc); 
       for (var i = 1; i <= reader.NumberOfPages; i++) 
       { 
        writer.AddPage(writer.GetImportedPage(reader, i)); 
       } 
       writer.FreeReader(reader); 
       reader.Close(); 
      } 

      writer.Close(); 
      outputDocument.Close(); 
      var allPagesContent = ms.GetBuffer(); 
      ms.Flush(); 

      return allPagesContent; 
     } 
    } 
Các vấn đề liên quan