2015-12-22 95 views
-2

對於我目前的項目,我需要採用pdf並縮小第一頁的內容而不改變頁面的整體大小,以便我可以在沒有它的情況下向底部添加其他信息與任何預先存在的內容重疊。有沒有辦法使用iTextSharp來做到這一點?我將不勝感激您的任何幫助!縮小pdf頁面的內容

+1

請向我們展示您已擁有的代碼,並告訴我們您嘗試了哪些方法,哪些方法無效。 –

回答

4

您可以通過在頁面內容流中添加一個轉換矩陣來縮小頁面內容。像這樣:

public void shrink(PdfStamper stamper, int page, float factor) 
{ 
    Rectangle crop = stamper.Reader.GetCropBox(page); 
    float diffX = crop.Right * (1 - factor); 
    float diffY = crop.Top * (1 - factor); 
    PdfDictionary pageN = stamper.Reader.GetPageN(page); 
    stamper.MarkUsed(pageN); 
    PdfArray ar = null; 
    PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN); 
    if (content == null) 
     return; 
    if (content.IsArray()) 
    { 
     ar = new PdfArray((PdfArray)content); 
     pageN.Put(PdfName.CONTENTS, ar); 
    } 
    else if (content.IsStream()) 
    { 
     ar = new PdfArray(); 
     ar.Add(pageN.Get(PdfName.CONTENTS)); 
     pageN.Put(PdfName.CONTENTS, ar); 
    } 
    else 
     return; 
    ByteBuffer out_p = new ByteBuffer(); 
    out_p.Append(factor).Append(" 0 0 ").Append(factor).Append(' ').Append(diffX).Append(' ').Append(diffY).Append(" cm "); 
    PdfStream stream = new PdfStream(out_p.ToByteArray()); 
    ar.AddFirst(stamper.Writer.AddToBody(stream).IndirectReference); 
    out_p.Reset(); 
} 

(此代碼借用從PdfStamper UnderContent和OverContent代。)

提示:shrink具有檢索頁面的OverContent或UnderContent之前被使用。

您可以使用它像這樣:

[Test] 
public void ShrinkFirstPage() 
{ 
    string origFile = ...; 
    string resultFile = ...; 

    using (PdfReader reader = new PdfReader(origFile)) 
    using (FileStream output = new FileStream(resultFile, FileMode.Create, FileAccess.Write)) 
    using (PdfStamper stamper = new PdfStamper(reader, output)) 
    { 
     int page = 1; 
     float factor = .9f; 
     shrink(stamper, page, factor); 

     Rectangle box = reader.GetCropBox(page); 
     box.Top = box.Top - factor * box.Height; 

     PdfContentByte cb = stamper.GetOverContent(page); 
     cb.SetColorFill(BaseColor.YELLOW); 
     cb.SetColorStroke(BaseColor.RED); 
     cb.Rectangle(box.Left, box.Bottom, box.Width, box.Height); 
     cb.FillStroke(); 
     cb.SetColorFill(BaseColor.BLACK); 

     ColumnText ct = new ColumnText(cb); 

     ct.AddElement(new Paragraph("This is some text added to the front page of the front page of this document.")); 

     ct.SetSimpleColumn(box); 
     ct.Go(); 
    } 
} 

從這種原始

original 1

shrunk 1

,並從該

original 2

shrunk 2

請注意:該代碼並不需要頁面旋轉進去。如果您旋轉了頁面,則應該相應地擴展shrink

+0

工程就像一個魅力!我感謝您的幫助! – 1Programming1

+0

我還有一個問題。在縮小內容之後,是否有辦法將頁面中的內容居中放置,而不是正確地對其進行調整?我試着用diffX和diffY玩,沒有運氣。 – 1Programming1

+0

是的,上面的代碼使用'Top'和'Right'來修復右上角。如果您想縮小到中心位置,則必須使用頁面中間的座標來代替。 – mkl