2014-01-27 20 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現在提供了一個商業授權)