2013-10-15 3 views
1

내 목표는 Windows.Forms C# 응용 프로그램에서 메타 데이터 (작성자, 제목, ...)를 유지하면서 일부 페이지를 추가하거나 제거하는 것입니다.메타 데이터를 보존하면서 기존 PDF 수정 (페이지 추가/제거)

필자는 iTextSharp를 사용하여 PdfConcatenate 클래스를 사용하여 페이지를 추가하거나 제거하는 방법을 발견했습니다. 메타 데이터를 유지하려면 나중에 PdfStamper를 사용하십시오. 일을 빠르게하기 위해 결과를 디스크에 저장하기 전에 메모리에서 수정 작업을 수행하려고합니다.

문제는 페이지를 추가하거나 제거하는 것이 아니라 메타 데이터를 동일한 단계로 유지하는 것입니다. 아무도 나에게/좋은 방법을이 (더) 달성하는 방법에 대한 예를 말해 줄 수 없습니까? 아니면 완전히 잘못된 경로에 있습니까?

다음

내 현재 코드는 (문제 정의 라인에 대한 의견을 참조)

public void RemovePagesInFile(string documentLocation, int pageIndexFrom, int pageCount) 
{ 
    // TB: open the pdf 
    using (PdfReader sourcePdfReader = new PdfReader(documentLocation)) 
    using (MemoryStream concatenatedTargetStream = new MemoryStream((int)sourcePdfReader.FileLength)) 
    { 
     // TB: use a concatenator to create a new pdf containing only the desired pages 
     PdfConcatenate concatenator = new PdfConcatenate(concatenatedTargetStream); 

     // TB: create a list with the page numbers to keep 
     List<int> pagesToKeep = new List<int>(); 
     for (int i = 1; i <= pageIndexFrom; i++) 
     { 
      pagesToKeep.Add(i); 
     } 

     for (int i = pageIndexFrom + pageCount + 1; i <= sourcePdfReader.NumberOfPages; i++) 
     { 
      pagesToKeep.Add(i); 
     } 

     // TB: execute the page copy 
     sourcePdfReader.SelectPages(pagesToKeep); 
     concatenator.AddPages(sourcePdfReader); 

     // TB: problem(s) here: 
     // 1. when calling concatenator.Close() the memory stream gets disposed as expected. 
     // concatenator.Close(); 
     // 2. even when calling concatenator.WriterFlush() the memory stream seems to be missing content (error when creating targetReader (see below)). 
     // concatenator.Writer.Flush(); 
     // 3. when keeping concatenator open the same error as above occures (I assume not all bytes have been written to the memory stream) 

     // TB: preserve the meta data from the source document 
     // => ERROR here: "Rebuild trailer not found. Original Error: PDF startxref not found" 
     using (PdfReader targetReader = new PdfReader(concatenatedTargetStream)) 
     using (MemoryStream targetStream = new MemoryStream((int)concatenatedTargetStream.Length)) 
     { 
      using (PdfStamper stamper = new PdfStamper(targetReader, targetStream)) 
      { 
       stamper.MoreInfo = sourcePdfReader.Info; 

       // TB: same problem as above with stamper ? 
       stamper.Close(); 
      } 

      // TB: close the reader to be able to access the source pdf 
      sourcePdfReader.Close(); 

      // TB: write the modified pdf to the disk 
      File.WriteAllBytes(documentLocation, targetStream.ToArray()); 
     } 
    } 
} 
+0

나는 10 명 이상의 평판 점수를 가지고 있지 않으므로 누구나 다음과 같은 답변을 게시 할 수 있습니다. ... 편집 : 작동하지 않습니다 - 텍스트가 너무 길어서 댓글 * grrrr * –

+0

평범하고 단순한 : 해결책 두 개의 변경을하는 것입니다 : "concatenator.Close()"를 호출하기 전에 "concatenator.Writer.CloseStream = false"를 호출하고 PdfStamper와 동일하게 호출하십시오. 따라서 더 많은 평판을 가진 사람이 답변으로 추가하면 감사합니다! –

답변

0

두 가지 사항이 변경 될 필요가있다.

concatenator.Close() 

가 PdfStamper에 대해 동일한 일을 할 호출하기 전에

concatenator.Writer.CloseStream = false 

전화해서 당신은 설정하고 있습니다.

관련 문제