2011-04-06 70 views
4

我使用iTextSharp的5.0.6讀取現有的PDF,遍歷頁面上的每個衝壓文本,然後寫出新加蓋PDF不加蓋有些。我面臨的問題是,這不是100%的時間。對於某些PDF,每個頁面都按預期蓋印,對於其他頁面,大多數頁面會被蓋印,而有些則不會。好像可能有出模具的GetOverContent()不返回最頂層的一個問題,但是這只是一個假設。有沒有人有類似的問題?iTextSharp的 - 如預期

using iTextSharp.text; 
using iTextSharp.text.pdf; 
const string WATERMARK_TEXT = "John Doe"; 

static void Main(string[] args) 
{ 
    string masterPdf = "master.pdf"; 
    string pdfToCreate = "watermark.pdf"; 

    byte[] bytes = StampPDF(masterPdf); 
    using (FileStream stream = new FileStream(pdfToCreate, FileMode.Create)) 
    { 
     stream.Write(bytes, 0, bytes.Length); 
    } 

} 

static byte[] StampPDF(string PdfPath) 
{ 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     PdfReader reader = new PdfReader(PdfPath); 
     int pageCount = reader.NumberOfPages; 
     PdfStamper stamper = new PdfStamper(reader, memoryStream); 

     float fontSize = 9; 
     float textAngle = 0f; 
     BaseFont font = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.WINANSI, BaseFont.EMBEDDED); 
     BaseColor backgroundColor = new BaseColor(0, 0, 0); 
     BaseColor fontColor = new BaseColor(255, 255, 255); 
     float padding = 2f; 
     float fontWidth = font.GetWidthPoint(WATERMARK_TEXT, fontSize); 
     iTextSharp.text.Rectangle pageSize; 
     PdfContentByte pageContents; 
     for (int i = 1; i <= pageCount; i++) 
     { 
      pageSize = reader.GetPageSize(i); 
      pageContents = stamper.GetOverContent(i); 
      //draw a rectangle 
      pageContents.SetColorFill(backgroundColor); 
      pageContents.MoveTo(pageSize.Width - (fontWidth + padding), 0f); 
      pageContents.LineTo(pageSize.Width, 0f); 
      pageContents.LineTo(pageSize.Width, 14f); 
      pageContents.LineTo(pageSize.Width - (fontWidth + padding), 14f); 
      pageContents.Fill(); 
      //drop our watermark on top of the rectangle we just created 
      pageContents.BeginText(); 
      pageContents.SetColorFill(fontColor); 
      pageContents.SetFontAndSize(font, fontSize); 
      pageContents.ShowTextAligned(PdfContentByte.ALIGN_LEFT, WATERMARK_TEXT, pageSize.Width - fontWidth, 4, textAngle); 
      pageContents.EndText(); 
     } 
     stamper.Close(); 
     reader.Close(); 

     return memoryStream.ToArray(); 
    } 
} 

回答

2

對於那些可能會遇到同樣的問題,關鍵是檢查裁剪框。由於PDF的裁剪框的尺寸可能小於其頁面尺寸,因此您需要有條件地使用其中一個或另一個。因此,基於該for環上面的代碼示例將被改變爲這樣:

for (int i = 1; i <= pageCount; i++) 
{ 
    mediaBox = reader.GetPageSize(i); 
    cropBox = reader.GetCropBox(i); 
    overContent = stamper.GetOverContent(i); 

    if (cropBox != null && (cropBox.Width < mediaBox.Width || cropBox.Height < cropBox.Height)) 
     mediaBox = cropBox; 

    //draw a rectangle 
    overContent.SetColorFill(backgroundColor); 
    overContent.MoveTo(mediaBox.Right - (fontWidth + fontPadding), mediaBox.Bottom); 
    overContent.LineTo(mediaBox.Right, mediaBox.Bottom); 
    overContent.LineTo(mediaBox.Right, mediaBox.Bottom + rectangleHeight); 
    overContent.LineTo(mediaBox.Right - (fontWidth + fontPadding), mediaBox.Bottom + rectangleHeight); 
    overContent.ClosePathFillStroke(); 
    //drop our watermark on top of the rectangle we just created 
    overContent.BeginText(); 
    overContent.SetColorFill(fontColor); 
    overContent.SetFontAndSize(font, fontSize); 
    overContent.ShowTextAligned(PdfContentByte.ALIGN_LEFT, WATERMARK_TEXT, mediaBox.Right - fontWidth, mediaBox.Bottom + (rectangleHeight - fontSize), textAngle); 
    overContent.EndText(); 
} 
0

你已經犯了兩個錯誤:

  1. 你假設頁面沒有旋轉,但它們可以是:90,180,270注,我從來沒有看到了180頁,但它的合法性。繪製到旋轉的頁面時,您必須在繪製時考慮該旋轉。有趣的變換矩陣。

  2. 你假定頁的(未旋轉)左下角是0,0。你的基礎在頁面的寬度和高度(關閉)的測量,但不調整任何在左下角的偏移。

有三種方法做一個橫向頁面:
11 「×8.5」
8.5 「X11」 @ 90度的旋轉
8.5 「X11」 @ 270度的旋轉

技術上,第四種方法是建立一個11x8.5 @ 180,但任何編寫這樣的代碼的人都應該被懲罰。很多。

有浮動關於如何處理頁面旋轉,讓細節上的各種做題。通過你的代碼,我會說你會很快找出llx,lly的東西。

+0

雖然它不是在代碼片段表示我已經採取了看看頁面旋轉的問題,沒有所有的PDF文件被旋轉(即全部具有0的旋轉值)。探索抵消是一個好主意,我會看看。謝謝。 – ScottD 2011-04-06 17:50:44