为了实现你的目标,
triming to the “bounding box”. That’s exactly what I need
你实际上必须解决两个问题:
>您必须更改某些PDF文档的各个页面的裁剪框.
>您必须确定某个页面的边界框,即(我假设)包含页面所有可见内容的最小框(包含水平和垂直边).
广告1)更改各个页面的裁剪框
您不应该使用为该任务找到的代码.操作单个文档几乎总是最好使用PdfStamper而不是PdfWriter.
public byte[] ManipulatePdf(byte[] src)
{
PdfReader reader = new PdfReader(src);
int n = reader.NumberOfPages;
PdfDictionary pageDict;
PdfRectangle rect = new PdfRectangle(55, 76, 560, 816);
for (int i = 1; i <= n; i++)
{
pageDict = reader.GetPageN(i);
pageDict.Put(PdfName.CROPBOX, rect);
}
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, ms))
{
}
return ms.ToArray();
}
}
(代码在内存中工作,即需要一个byte []并返回一个,但可以很容易地修改为在文件系统中工作.)
如您所见,您实际操作PdfReader中存在的PDF,然后仅使用PdfStamper存储更改的Pdf.
但是,在您的情况下,所有页面都没有固定的矩形,而是您必须确定每个页面的矩形…
Ad 2)确定某个页面的边界框
要确定边界框,您实际上必须解析整个页面内容并确定每个绘制元素的尺寸.
不幸的是,iText(Sharp)只在一定程度上以一种舒适的方式支持它:它提供了一个内容解析框架,但是这个框架还没有处理开箱即用的矢量图形.
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
[...]
TextMarginFinder finder = parser.ProcessContent(i, new TextMarginFinder());
通过finder.GetLlx(),finder.GetLly(),finder.GetUrx()和finder.GetUry()之后的取景器,在ProcessContent执行之后提供页面i的边界框的左下角和右上角的坐标(矢量图形被忽略).您可以使用这些数据构建一个矩形,用于在上面的代码中提供pageDict.Put(PdfName.CROPBOX,rect).
但是,如果您还需要考虑矢量图形,则必须稍微扩展解析器命名空间类,以便为矢量图形运算符创建解析事件,并且TextMarginFinder也要考虑这些事件.有关此内容的更多信息,请阅读this answer.