2016-04-14 95 views
0

我想在不裁剪內容的情況下將新頁面大小設置爲現有PDF文檔。我正在編寫下面的代碼,但它只是從底部裁剪我的PDF文件,導致內容丟失。使用Java IText將新頁面大小設置爲現有PDF文檔

當前尺寸爲8.26「X 11.69」,我需要將其設置爲8.5「X 11」。

我的代碼只將11.59轉換爲11。試圖改變8.26,但它不是woking。

任何人都可以幫忙嗎?我正在使用itextpdf-5.5.8和Java。

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.GrayColor; 
import com.itextpdf.text.pdf.PdfArray; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfDictionary; 
import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.PdfNumber; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfRectangle; 
import com.itextpdf.text.pdf.PdfStamper; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 



public class PageSize { 

    public static final String SRC = "C:/Temp/BC.pdf"; 
    public static final String DEST = "C:/Temp/BC_New.pdf"; 

    public static void main(String[] args) throws IOException, DocumentException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new PageSize().manipulatePdf(SRC, DEST); 
    } 

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(src); 
     int n = reader.getNumberOfPages(); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     // properties 
     PdfContentByte over; 
     PdfDictionary pageDict; 
     PdfRectangle rect = new PdfRectangle(55, 76, 560, 816); 
     PdfArray mediabox; 
     float llx, lly, ury,llz; 
     // loop over every page 
     for (int i = 1; i <= n; i++) { 
      pageDict = reader.getPageN(i); 
      mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
      llx = mediabox.getAsNumber(0).floatValue(); 
      lly = mediabox.getAsNumber(1).floatValue(); 
      llz = mediabox.getAsNumber(2).floatValue(); 
      ury = mediabox.getAsNumber(3).floatValue(); 
      mediabox.set(1, new PdfNumber((lly + 50))); 
      over = stamper.getOverContent(i); 
      over.saveState(); 
         over.restoreState(); 
     } 



     stamper.close(); 
     reader.close(); 
    } 
} 

修訂 這裏是我用來減少11.69" 到11" 的代碼。它工作正常。但是,它不會增加寬度8.26至8.5"

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.GrayColor; 
import com.itextpdf.text.pdf.PdfArray; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfDictionary; 
import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.PdfNumber; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfRectangle; 
import com.itextpdf.text.pdf.PdfStamper; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 



public class PageSize { 

    public static final String SRC = "C:/Temp/Test.pdf"; 
    public static final String DEST = "C:/Temp/BC_New.pdf"; 

    public static void main(String[] args) throws IOException, DocumentException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new PageSize().manipulatePdf(SRC, DEST); 
    } 

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(src); 
     int n = reader.getNumberOfPages(); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     // properties 
     PdfContentByte over; 
     PdfDictionary pageDict; 
     PdfArray mediabox; 
     float llx, lly, ury,llz; 
     // loop over every page 
     for (int i = 1; i <= n; i++) { 
      pageDict = reader.getPageN(i); 
      mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
      llx = mediabox.getAsNumber(0).floatValue(); 
      lly = mediabox.getAsNumber(1).floatValue(); 
      ury = mediabox.getAsNumber(3).floatValue(); 
      mediabox.set(0, new PdfNumber((llx - 17))); 
      mediabox.set(1, new PdfNumber((lly + 50))); 
      over = stamper.getOverContent(i); 
      over.saveState(); 
         over.restoreState(); 
     } 



     stamper.close(); 
     reader.close(); 
    } 
} 

解決:

這是與源文件有問題,我試圖修改原始的源文件是8.26 「X 11.69」。hava程序爲文件添加一個徽標並將其保存到一個新文件中。

不知何故,由於這種轉換,新源文件的X軸被鎖定,因此我的程序無法修改x軸

因此,我將我的程序作爲第一步移動並運行。我的程序首先修改x和y軸,然後將文件傳遞給其他程序,該程序會添加標誌。

感謝布魯諾對此。 :)

+0

你說「我正在使用iText-2.1.4和Java」。你的代碼說「import com.itextpdf.text。」這是一個矛盾。您的代碼是iText 5代碼。你不能在iText 2.1.4中使用它。你甚至不應該使用iText 2.1.4。有關更多信息,請閱讀[iText 2.1.7或更早版本可否在商業上使用?]的答案(http://developers.itextpdf.com/question/can-itext-217-or-earlier-be-used-commercially) –

+0

哦。我的壞,我有兩個圖書館放置和混淆我正在使用哪一個。更新我的問題。它的itextpdf-5.5.8。感謝您的迴應。任何建議或改進我的代碼? – Techidiot

回答

1

您正在更改頁面大小而不更改內容。

如果你想收縮內容,那麼你需要更復雜的代碼。例如,請參閱Shrinking the contents of a pdf page。還有一個例子的官方文檔中:How to shrink pages in an existing PDF?

PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
PdfArray crop; 
PdfArray media; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    media = page.getAsArray(PdfName.CROPBOX); 
    if (media == null) { 
     media = page.getAsArray(PdfName.MEDIABOX); 
    } 
    crop = new PdfArray(); 
    crop.add(new PdfNumber(0)); 
    crop.add(new PdfNumber(0)); 
    crop.add(new PdfNumber(media.getAsNumber(2).floatValue()/2)); 
    crop.add(new PdfNumber(media.getAsNumber(3).floatValue()/2)); 
    page.put(PdfName.MEDIABOX, crop); 
    page.put(PdfName.CROPBOX, crop); 
    stamper.getUnderContent(p).setLiteral("\nq 0.5 0 0 0.5 0 0 cm\nq\n"); 
    stamper.getOverContent(p).setLiteral("\nQ\nQ\n"); 
} 
stamper.close(); 
reader.close(); 

如果您想要放大的內容,那麼你可以簡單地改變UserUnit。更改UserUnit也被官方文檔中解釋:How to rotate and scale pages in an existing PDF?

float factor = 2.5f; 
PdfReader reader = new PdfReader(src); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    if (page.getAsNumber(PdfName.USERUNIT) == null) 
     page.put(PdfName.USERUNIT, new PdfNumber(factor)); 
} 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
stamper.close(); 
reader.close(); 

此代碼將擴展頁面,其內容與2.5倍(因爲這是我們定義爲factor)。

UPDATE

在你的更新,你有這樣的:

mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
    llx = mediabox.getAsNumber(0).floatValue(); 
    lly = mediabox.getAsNumber(1).floatValue(); 
    ury = mediabox.getAsNumber(3).floatValue(); 
    mediabox.set(0, new PdfNumber((llx - 17))); 
    mediabox.set(1, new PdfNumber((lly + 50))); 

通過這樣做,你x方向(llx -17)添加0.236111英寸和你y方向減去0.69445英寸。如果你說這個變化爲11.69到11英寸,那麼我認爲你在談論Y方向。如果X方向的原始寬度原來是8.26,則應該是8.50。

我不明白你的問題。當然:我的計算假定文檔中沒有CropBox。是否有CropBox存在?

+0

感謝您的代碼。我試過了,但它只是縮小了我的頁面大小。是否有任何直接的方法來首先將頁面大小設置爲Letter(即8.5「X 11」),然後繼續添加內容?我目前的頁面尺寸是A4,即8.26「×11.69」。 – Techidiot

+0

要麼我不明白你的問題,要麼你不懂PDF。 PDF頁面中的內容是固定的。每個角色在頁面上都有固定的位置。您無法更改頁面大小,並希望內容會重新排版。 PDF不是爲此而製作的。您將PDF與Word處理格式混淆。 –

+0

我的理解是,我會用A4尺寸的PDF文件,閱讀它的內容,創建一個帶有Letter尺寸的新PDF文件,將內容添加到它並且內容應該適合。我想我的假設不夠接近。我想要實現的是,我將得到一個A4尺寸的PDF文件,並且我想用相同的內容和類似的佈局製作Letter尺寸的文件。採用我在原文中提到的方法,我能夠將11.69縮小到11「,而不是8.26」。我想如果通過手動執行(https://forums.adobe.com/thread/1269098?tstart=0)它可行,爲什麼不通過代碼。 – Techidiot

相關問題