2014-01-27 30 views
1

在一个应用程序中,用户可以上传任何pdf文件,其尺寸为8.46“×10.97”。根据我们的应用尺寸应该是8.5“×11”。问题是,如何重新设置现有的pdf页面大小来设置8.5“x 11”?我必须通过代码修复,而不是手动或称赞线路或外部软件。请让我知道哪个Java支持jar(免费版)提供了实现这个功能的功能,或者通过简单的java修复也很好。如何调整现有的pdf页面大小

+0

你是指*免费版*是什么意思?例如。只要您尊重AGPL许可证,iText就可以自由使用。你能尊重它吗?如果没有,请澄清您的许可限制。 – mkl

+0

这就是说,你所要做的就是操纵每个文档页面的媒体框(和裁切框,如果有的话)的值。这可以很容易地用例如iText或PDFBox,但其他库也是如此。那么,应该使用哪个库? – mkl

+0

没有购买的免费手段。如果可以通过iText或PDFBox获得如何调整现有PDF页面的大小,请提供代码。 – Subbu

回答

2

利用iText你可以做这样的事情:

float width = 8.5f * 72; 
float height = 11f * 72; 
float tolerance = 1f; 

PdfReader reader = new PdfReader("source.pdf"); 

for (int i = 1; i <= reader.getNumberOfPages(); i++) 
{ 
    Rectangle cropBox = reader.getCropBox(i); 
    float widthToAdd = width - cropBox.getWidth(); 
    float heightToAdd = height - cropBox.getHeight(); 
    if (Math.abs(widthToAdd) > tolerance || Math.abs(heightToAdd) > tolerance) 
    { 
     float[] newBoxValues = new float[] { 
      cropBox.getLeft() - widthToAdd/2, 
      cropBox.getBottom() - heightToAdd/2, 
      cropBox.getRight() + widthToAdd/2, 
      cropBox.getTop() + heightToAdd/2 
     }; 
     PdfArray newBox = new PdfArray(newBoxValues); 

     PdfDictionary pageDict = reader.getPageN(i); 
     pageDict.put(PdfName.CROPBOX, newBox); 
     pageDict.put(PdfName.MEDIABOX, newBox); 
    } 
} 

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("target.pdf")); 
stamper.close(); 

我介绍了宽容,因为您可能不想更改大小只有很小一部分的页面。

此外,您可能还想要计入页面的UserUnit值,即使它几乎没有被使用过。

任何通用PDF库都可能允许这样的事情,或者通过提供明确的方法来调整大小或允许直接访问这里使用。

关于您的要求免费版您在评论中澄清了没有购买的免费手段;只要您遵守AGPL,就可以在不购买许可证的情况下使用iText。

+0

谢谢mkl ...我会试着在你的代码上面更新这个... – Subbu

+0

只有在使用PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(“C:\\ TestingDoc \\ target.pdf”) ); 我不应该生成新的输出文件。问题是调整大小逻辑不工作在像[PdfReader reader = new PdfReader(attachment.getFullDocContent()); getFullDocContent将返回byte []。 – Subbu

+0

除了'FileOutputStream'之外,您还可以使用'ByteArrayOutputStream',从中可以在没有任何文件的情况下获得byte []'。在未来的问题中,请不要忘记提及重要的要求。 – mkl

0

也许现有的文件追加到使用PDFBox的给定的规范一个新的文档说明in this question(iTextPdf现在提供了一个商业授权)