2015-09-07 122 views
0

我想將多個pdf頁面合併成一個pdf頁面。 ,以說明如何將PDF頁面合併成一個單一文件的iText的例子很多,但我需要的所有頁面以適應單頁(方法縮小其寬度和高度上沿着他們)將pdf文檔合併到一個頁面iText

String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT }; 
// step 1 
Document document = new Document(); 
// step 2 
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT)); 
// step 3 
document.open(); 
// step 4 
PdfReader reader; 
int n; 
// loop over the documents you want to concatenate 
for (int i = 0; i < files.length; i++) { 
    reader = new PdfReader(files[i]); 
    // loop over the pages in that document 
    n = reader.getNumberOfPages(); 
    for (int page = 0; page < n;) { 
     copy.addPage(copy.getImportedPage(reader, ++page)); 
    } 
    copy.freeReader(reader); 
    reader.close(); 
} 
// step 5 
document.close(); 

編輯: 嘗試這種代碼here,但它只是合併的PDF頁面至1個文件,我需要他們收縮到1單頁

+2

你能說一下「沒有快樂」嗎?它創造了一個沉悶的報紙呢?將文檔轉換爲摺疊帽子?打印出全部黑色?請[編輯]您的問題以添加缺少的信息。 – usr2564301

+0

對不起,我的意思是它沒有合併成一個頁面,而是合併到一個單獨的文件中。我需要將來自4個不同pdf文件的4頁合併爲1個包含全部4頁(這些頁面全部縮小到其原始尺寸的25%)的單頁pdf頁 – zvikachu

回答

3

正如你要複製的頁面,因爲他們是一個新的文檔作爲單獨的頁面(這是最常見的合併pdf文件使用案例),但改爲想要將所有頁面合併到一個頁面中(沿着它們的方式縮小它們的寬度和高度),單獨的code source you referenced不符合您的需要:其中的代碼着重於常見用例。

您的用例提醒了更多的n-up用例。因此,你應該看看n-up iText樣本。最明顯的一個是NUpTool其中焦點代碼是這樣的:

public void manipulatePdf(String src, String dest, int pow) 
    throws IOException, DocumentException { 
    // reader for the src file 
    PdfReader reader = new PdfReader(src); 
    // initializations 
    Rectangle pageSize = reader.getPageSize(1); 
    Rectangle newSize = (pow % 2) == 0 ? 
     new Rectangle(pageSize.getWidth(), pageSize.getHeight()) : 
     new Rectangle(pageSize.getHeight(), pageSize.getWidth()); 
    Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight()); 
    for (int i = 0; i < pow; i++) { 
     unitSize = new Rectangle(unitSize.getHeight()/2, unitSize.getWidth()); 
    } 
    int n = (int)Math.pow(2, pow); 
    int r = (int)Math.pow(2, pow/2); 
    int c = n/r; 
    // step 1 
    Document document = new Document(newSize, 0, 0, 0, 0); 
    // step 2 
    PdfWriter writer 
     = PdfWriter.getInstance(document, new FileOutputStream(String.format(dest, n))); 
    // step 3 
    document.open(); 
    // step 4 
    PdfContentByte cb = writer.getDirectContent(); 
    PdfImportedPage page; 
    Rectangle currentSize; 
    float offsetX, offsetY, factor; 
    int total = reader.getNumberOfPages(); 
    for (int i = 0; i < total;) { 
     if (i % n == 0) { 
      document.newPage(); 
     } 
     currentSize = reader.getPageSize(++i); 
     factor = Math.min(
      unitSize.getWidth()/currentSize.getWidth(), 
      unitSize.getHeight()/currentSize.getHeight()); 
     offsetX = unitSize.getWidth() * ((i % n) % c) 
      + (unitSize.getWidth() - (currentSize.getWidth() * factor))/2f; 
     offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n)/c) + 1)) 
      + (unitSize.getHeight() - (currentSize.getHeight() * factor))/2f; 
     page = writer.getImportedPage(reader, i); 
     cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY); 
    } 
    // step 5 
    document.close(); 
    reader.close(); 
} 

NUpTool.java

這種方法安排的PDF SRC的頁面的文檔DEST在2 pow每個目標頁面上的源頁面。


爲你的使用情況,因此,頁面中,你已經做的一個文件合併之後,你僅僅需要進行後處理,在上面使用pow爲最小值的常規單個文件其中2 pow不小於原來的頁數。

+0

正是我所需要的。謝謝 – zvikachu

相關問題