2015-09-07 125 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

相关问题