2015-04-21 89 views
2

我的web應用程序簽署PDF文檔。我想讓用戶下載原始PDF文檔(未簽名),但在PDF文檔的左邊緣添加圖像和簽名者。如何擴展PDF的頁面大小以添加水印?

我在另一個web應用程序中看到了這個想法,我也想這樣做。當然我想用itext庫來做。

我附上了兩張圖片,即原始PDF文檔(未簽名)和修改後的PDF文檔。

enter image description here

enter image description here

+0

我說得對,如果我認爲該文件是不只是水印,而且還的大小頁面已更改。就好像多餘的空間被添加到左邊。它是否正確?這裏解釋了水印:[如何使用文本或圖像對PDF進行水印?](http://stackoverflow.com/questions/29560373/how-to-watermark-pdfs-using-text-or-images)。答案也可用法文提供:[評論créerun filigrane transparent en PDF?](http://www.developpez.net/forums/blogs/133351-blowagie/b432/creer-filigrane-transparent-pdf/) –

+0

是,頁面的大小已經改變。我已經看到它與Adobe Reader。第一個文檔頁面大小爲215,9 x 279,4,第二個文檔頁面大小爲210 x 297(mm) – Eduardo

+1

好的,這很容易實現,但我目前在Adobe HQ上參加有關ISO-32000的ISO會議-2,所以你必須給我一些時間。 –

回答

1

首先這樣的:你的數字簽名是很重要的前改變文檔。一旦數字簽名,這些更改將打破簽名。

我會分手的問題分爲兩個部分,我會跳過部分關於實際水印,因爲這是已經在這裏解釋:How to watermark PDFs using text or images?

這個問題是不是這個問題的重複,多餘的,因爲要求在右側添加額外的保證金。

看看primes.pdf文檔。這是我們將在AddExtraMargin示例中使用的源文件,其結果如下:primes_extra_margin.pdf。如您所見,每頁左側添加了半英寸的邊距。

這是它是如何做:

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; 
    // 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 - 36)); 
     over = stamper.getOverContent(i); 
     over.saveState(); 
     over.setColorFill(new GrayColor(0.5f)); 
     over.rectangle(llx - 36, lly, 36, ury - llx); 
     over.fill(); 
     over.restoreState(); 
    } 
    stamper.close(); 
    reader.close(); 
} 

我們與getPageN()方法得到的PdfDictionary被稱爲頁字典。它有關於PDF中特定頁面的大量信息。我們只查看一個條目:/MediaBox。這只是一個概念證明。如果你想寫一個更強大的應用程序,你也應該看看/CropBox/Rotate條目。順便說一下,我知道這些條目不存在於primes.pdf中,所以我在此省略它們。

媒體盒的頁的是與表示由其左下和右上拐角(的座標定義的矩形的四個值的數組通常,我稱它們爲llxllyurxury)。

在我的代碼示例中,我通過減去36個用戶單位來更改llx的值。如果您比較兩個PDF的頁面大小,則會看到我們已添加了半英寸。

我們還使用這些座標繪製一個覆蓋額外半英寸的矩形。現在切換到其他水印示例以瞭解如何向每個頁面添加文本或其他內容。

更新:

如果你需要縮小現有的網頁,請參閱Fix the orientation of a PDF in order to scale it

+0

非常感謝!我相信,有了這些信息,我就能實現我的目標。 – Eduardo

相關問題