缩小 pdf 页面的内容
Shrinking the contents of a pdf page
对于我当前的项目,我需要获取 pdf 并在不改变页面整体大小的情况下缩小第一页的内容,以便我可以在底部添加其他信息而不与任何预置内容重叠现有内容。有没有办法使用 iTextSharp 来做到这一点?如果您能提供任何帮助,我将不胜感激!
您可以通过在页面内容流中添加一个转换矩阵来缩小页面内容,例如像这样:
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();
}
}
来自这篇原文
你得到
并由此
你得到
注意:代码未考虑页面旋转。如果您旋转了页面,则应相应地扩展 shrink
。
对于我当前的项目,我需要获取 pdf 并在不改变页面整体大小的情况下缩小第一页的内容,以便我可以在底部添加其他信息而不与任何预置内容重叠现有内容。有没有办法使用 iTextSharp 来做到这一点?如果您能提供任何帮助,我将不胜感激!
您可以通过在页面内容流中添加一个转换矩阵来缩小页面内容,例如像这样:
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();
}
}
来自这篇原文
你得到
并由此
你得到
注意:代码未考虑页面旋转。如果您旋转了页面,则应相应地扩展 shrink
。