2015-12-22 151 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