C# iTextSharp正在解析PDF对象,以删除未使用的对象
根据问题 我被告知必须有效地解析PDF文件,记下全局对象名,然后删除未使用的对象名 我甚至不知道从哪里开始 我正在VS2010本地查看器中查看,我可以在一个页面中看到一个名为Matrix的数组。这似乎包含页面中使用的XObject。但是矩阵似乎不是API允许的属性 我还在我的阅读器中发现了一个xrefObj数组,它似乎是每个对象。在查看XObject时,我发现了许多大小与实际图像相对应的PRStream对象C# iTextSharp正在解析PDF对象,以删除未使用的对象,c#,pdf,itextsharp,C#,Pdf,Itextsharp,根据问题 我被告知必须有效地解析PDF文件,记下全局对象名,然后删除未使用的对象名 我甚至不知道从哪里开始 我正在VS2010本地查看器中查看,我可以在一个页面中看到一个名为Matrix的数组。这似乎包含页面中使用的XObject。但是矩阵似乎不是API允许的属性 我还在我的阅读器中发现了一个xrefObj数组,它似乎是每个对象。在查看XObject时,我发现了许多大小与实际图像相对应的PRStream对象 iTextSharp.text.pdf.PdfDictionary dictionary
iTextSharp.text.pdf.PdfDictionary dictionary = reader.GetPageN(i);
iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, i);
iTextSharp.text.pdf.PdfDictionary res = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(dictionary.Get(iTextSharp.text.pdf.PdfName.RESOURCES));
iTextSharp.text.pdf.PdfDictionary xobj = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(res.Get(iTextSharp.text.pdf.PdfName.XOBJECT));
foreach (iTextSharp.text.pdf.PdfName name in xobj.Keys)
{
iTextSharp.text.pdf.PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
iTextSharp.text.pdf.PdfDictionary tg = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(obj);
iTextSharp.text.pdf.PdfName type = (iTextSharp.text.pdf.PdfName)iTextSharp.text.pdf.PdfReader.GetPdfObject(tg.Get(iTextSharp.text.pdf.PdfName.SUBTYPE));
if (iTextSharp.text.pdf.PdfName.IMAGE.Equals(type))
{
int XrefIndex = Convert.ToInt32(((iTextSharp.text.pdf.PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
iTextSharp.text.pdf.PdfObject pdfObj = reader.GetPdfObject(XrefIndex);
iTextSharp.text.pdf.PdfStream pdfStream = (iTextSharp.text.pdf.PdfStream)pdfObj;
}
}
}
这个块似乎给了我整个资源目录,而不是页面上特定使用的资源
所以我想我想要的是:
-如何将PDF文件(我假设我列出了所有的ObjNum)中的引用与阅读器中的主列表相匹配。
-删除所有未保留在“我的引用”列表中的引用并保存到位(这是一个临时文件,所以可以保存到位)
提前感谢。为了识别页面上的图像,我使用了PdfReaderContentParser
iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
MyImageRenderListener listener = new MyImageRenderListener();
while (i < numberofPages)
{
i++;
parser.ProcessContent(i, listener);
}
我使用原始问题中发布的代码作为主图像列表的基础
public void RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo renderInfo)
{
iTextSharp.text.pdf.parser.PdfImageObject image = renderInfo.GetImage();
if (image == null) return;
ImageNames.Add(renderInfo.GetRef().Number);
}