2010-03-17 243 views

回答

3

我確信有幾種方法。但這是我如何做到的一個例子。我只是檢查頁面上的數據量,如果它是< 20個字節我不包括它:

public void removeBlankPdfPages(String pdfSourceFile, String pdfDestinationFile, boolean debug) 
    { 
     try 
     { 
      // step 1: create new reader 
      PdfReader r = new PdfReader(pdfSourceFile); 
      RandomAccessFileOrArray raf = new RandomAccessFileOrArray(pdfSourceFile); 
      Document document = new Document(r.getPageSizeWithRotation(1)); 
      // step 2: create a writer that listens to the document 
      PdfCopy writer = new PdfCopy(document, new FileOutputStream(pdfDestinationFile)); 
      // step 3: we open the document 
      document.open(); 
      // step 4: we add content 
      PdfImportedPage page = null; 


      //loop through each page and if the bs is larger than 20 than we know it is not blank. 
      //if it is less than 20 than we don't include that blank page. 
      for (int i=1;i<=r.getNumberOfPages();i++) 
      { 
       //get the page content 
       byte bContent [] = r.getPageContent(i,raf); 
       ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
       //write the content to an output stream 
       bs.write(bContent); 
       logger.debug("page content length of page "+i+" = "+bs.size()); 
       //add the page to the new pdf 
       if (bs.size() > blankPdfsize) 
       { 
        page = writer.getImportedPage(r, i); 
        writer.addPage(page); 
       } 
       bs.close(); 
      } 
      //close everything 
      document.close(); 
      writer.close(); 
      raf.close(); 
      r.close(); 
     } 
     catch(Exception e) 
     { 
     //do what you need here 
     } 
    } 
+0

只有幾次。其他時間它不起作用。 – 2012-06-09 06:22:36

4

C#(由格利揚的要求),它的工作原理

public static void removeBlankPdfPages(string pdfSourceFile, string pdfDestinationFile, bool debug) { 

// step 0: set minimum page size 
const int blankPdfsize = 20; 

// step 1: create new reader 
var r = new PdfReader(pdfSourceFile); 
var raf = new RandomAccessFileOrArray(pdfSourceFile); 
var document = new Document(r.GetPageSizeWithRotation(1)); 

// step 2: create a writer that listens to the document 
var writer = new PdfCopy(document, new FileStream(pdfDestinationFile, FileMode.Create)); 

// step 3: we open the document 
document.Open(); 

// step 4: we add content 
PdfImportedPage page = null; 

//loop through each page and if the bs is larger than 20 than we know it is not blank. 
//if it is less than 20 than we don't include that blank page. 
for (var i=1 ; i <= r.NumberOfPages; i++) 
{ 
    //get the page content 
    byte[] bContent = r.GetPageContent(i, raf); 
    var bs = new MemoryStream(); 

    //write the content to an output stream 
    bs.Write(bContent, 0, bContent.Length); 
    Console.WriteLine("page content length of page {0} = {1}", i, bs.Length); 

    //add the page to the new pdf 
    if (bs.Length > blankPdfsize) 
    { 
     page = writer.GetImportedPage(r, i); 
     writer.AddPage(page); 
    } 
    bs.Close(); 
} 
//close everything 
document.Close(); 
writer.Close(); 
raf.Close(); 
r.Close();} 
+1

爲了獲得內存流的長度,將字節數組寫入內存流是什麼意思? – Simon 2013-05-08 01:55:38

+0

對不起@西蒙,我不記得了! ...這是一個3歲的問題。 – 2013-05-08 04:38:01

+0

好吧,我直接在bContent.Length上進行了比較,它工作。不知道你是否想麻煩更新答案:) – Simon 2013-05-08 05:16:40