Yis*_*ski 4 pdf size itextsharp
我只花了几个小时在网上搜索.似乎其他人也有这个问题,但我找不到答案.
我有一大堆PDF文件,我需要他们的测量,即他们的高度和页面内容.
在Adobe Illustrator中,导入PDF时,您可以选择转到"边界框".这正是我需要的.
我尝试了很多方法,这里是大杂烩:
Dim pdfStream = IO.File.OpenRead(FilePath)
Dim img = PdfImages(pdfStream)
Dim pdfReader = New PdfReader(pdfStream)
Dim pdfDictionary = pdfReader.GetPageN(1)
Dim mediaBox = pdfDictionary.GetAsArray(PdfName.MEDIABOX)
Dim b = pdfReader.GetPageSize(pdfDictionary)
Dim ms = New MemoryStream
Dim document = New Document(pdfReader.GetPageSizeWithRotation(1))
Dim writer = PdfWriter.GetInstance(document, ms)
document.Open()
document.SetPageSize(pdfReader.GetPageSize(1))
document.NewPage()
Dim cb = writer.DirectContent
cb.Clip()
Dim pageImport = writer.GetImportedPage(pdfReader, 1)
pdfReader.Close()
pdfStream.Close()
Run Code Online (Sandbox Code Playgroud)
我设法得到的只是页面大小,这是没用的.我在一大堆PDF上试过这个,所以它不像一个腐败的文件或其他东西.
为了实现你的目标,
试图进入"边界框".这正是我需要的
你实际上必须解决两个问题:
广告1)更改各个页面的裁剪框
您不应该使用为该任务找到的代码.操作单个文档几乎总是最好使用a PdfStamper,而不是aPdfWriter.
该iText的在行动-第二版样品CropPages.java/CropPages.cs展示了如何做到这一点.中心方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
(代码在内存中工作,即需要一个byte []并返回一个,但可以很容易地修改为在文件系统中工作.)
如您所见,您实际操作PDF中存在的PDF PdfReader,然后仅使用它PdfStamper来存储更改的Pdf.
但是,在您的情况下,所有页面都没有固定的矩形,而是您必须确定每个页面的矩形...
Ad 2)确定某个页面的边界框
要确定边界框,您实际上必须解析整个页面内容并确定每个绘制元素的尺寸.
不幸的是,iText(Sharp)只在一定程度上以一种舒适的方式支持它:它提供了一个内容解析框架,但是这个框架还没有处理开箱即用的矢量图形.
该iText的在行动-第二版样品ShowTextMargins.java/ShowTextMargins.cs演示了如何使用框架来确定裁剪框(矢量图形忽略).基本代码:
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
[...]
TextMarginFinder finder = parser.ProcessContent(i, new TextMarginFinder());
Run Code Online (Sandbox Code Playgroud)
的finder通过finder.GetLlx(), finder.GetLly(), finder.GetUrx(),和finder.GetUry()其之后ProcessContent执行提供页面的边界框的左下角和右上角的坐标i(矢量图形忽略).您可以使用这些数据构建一个矩形,用它来pageDict.Put(PdfName.CROPBOX, rect)输入上面的代码.
但是,如果您还需要考虑矢量图形,则必须稍微扩展解析器命名空间类,以便为矢量图形操作符创建解析事件,并且TextMarginFinder还要考虑这些事件.有关这方面的阅读这个答案.
| 归档时间: |
|
| 查看次数: |
7216 次 |
| 最近记录: |