使用 iTextSharp 删除 PDF 不可见对象

问题描述 投票:0回答:5

是否可以使用 iTextSharp 从 PDF 文档中删除不可见(或至少不显示)的对象?

更多详情:

1)我的源是一个包含图像和文本(可能是一些矢量绘图)和嵌入字体的 PDF 页面。

2)有一个界面可以设计多个“裁剪框”。

3)我必须生成一个新的 PDF,其中仅包含裁剪框内的内容。必须从生成的文档中删除任何其他内容(事实上,我可以接受一半在里面,一半在外面的内容,但这不是理想的情况,无论如何它都不应该出现)。

到目前为止我的解决方案:

我已经成功开发了一种创建新临时文档的解决方案,每个文档都包含每个裁剪框的内容(使用 writer.GetImportedPage 和 contentByte.AddTemplate 到与裁剪框大小完全相同的页面)。然后,我创建最终文档并重复该过程,使用 AddTemplate 方法将每个“裁剪页面”放置在最终页面中。

这个解决方案有两大缺点:

  • 文档的尺寸是[原始尺寸]*[裁剪框数量],因为整个页面都在那里,盖章了很多次! (看不见,但它就在那里)
  • 仍然可以通过在阅读器中选择全部 (CTRL+A) 并粘贴来访问不可见文本。

所以,我想我需要遍历PDF对象,检测它是否可见,然后删除它。在撰写本文时,我正在尝试使用 pdfReader.GetPdfObject。

感谢您的帮助。

c# pdf itext
5个回答
1
投票
PdfReader pdfReader = new PdfReader(../Template_Path.pdf"));
PdfStamper pdfStamperToPopulate = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create));
AcroFields pdfFormFields = pdfStamperToPopulate.AcroFields;
pdfFormFields.RemoveField("fieldNameToBeRemoved");

1
投票

是的,这是可能的。您需要将 pdf 页面内容字节解析为 PdfObjects,将它们存储到内存中,删除不需要的 PdfObject,将 Pdf 内容从 PdfObject 构建回 pdf 内容字节,在通过 PdfWriter 导入页面之前替换 PdfReader 中的页面内容。

我建议您查看以下内容:http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html

链接中的示例实现了 Pdf 内容字节解析,从 PdfObjec 构建回来,替换 PdfReader 页面内容字节...


1
投票

这是我找到的三个解决方案,如果它可以帮助某人(使用iTextSharpAmyuniTracker-Software,正如@Hetote在评论中所说,他正在寻找另一个库):

使用iTextSharp

正如@martinbuberl 在另一个问题中回答的

public static void CropDocument(string file, string oldchar, string repChar) { int pageNumber = 1; PdfReader reader = new PdfReader(file); iTextSharp.text.Rectangle size = new iTextSharp.text.Rectangle( Globals.fX, Globals.fY, Globals.fWidth, Globals.fHeight); Document document = new Document(size); PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(file.Replace(oldchar, repChar), FileMode.Create, FileAccess.Write)); document.Open(); PdfContentByte cb = writer.DirectContent; document.NewPage(); PdfImportedPage page = writer.GetImportedPage(reader, pageNumber); cb.AddTemplate(page, 0, 0); document.Close(); }

@rafixwpt 在

他的问题中的另一个答案,但它不会删除不可见的元素,它会清理页面的一个区域,这可能会影响页面的其他部分:

static void textsharpie() { string file = "C:\\testpdf.pdf"; string oldchar = "testpdf.pdf"; string repChar = "test.pdf"; PdfReader reader = new PdfReader(file); PdfStamper stamper = new PdfStamper(reader, new FileStream(file.Replace(oldchar, repChar), FileMode.Create, FileAccess.Write)); List<PdfCleanUpLocation> cleanUpLocations = new List<PdfCleanUpLocation>(); cleanUpLocations.Add(new PdfCleanUpLocation(1, new iTextSharp.text.Rectangle(0f, 0f, 600f, 115f), iTextSharp.text.BaseColor.WHITE)); PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanUpLocations, stamper); cleaner.CleanUp(); stamper.Close(); reader.Close(); }

使用Amyuni

正如@yms在另一个问题中回答的

IacDocument.GetObjectsInRectangle 方法

GetObjectsInRectangle 方法获取矩形中的所有对象 指定的矩形。

然后你可以迭代页面中的所有对象并删除那些你不感兴趣的:

//open a pdf document document.Open(testfile, ""); IacPage page1 = document.GetPage(1); Amyuni.PDFCreator.IacAttribute attribute = page1.AttributeByName("Objects"); // listObj is an array list of graphic objects System.Collections.ArrayList listobj = (System.Collections.ArrayList) attribute.Value.Cast<IacObject>();; // listObjToKeep is an array list of graphic objects inside a rectangle var listObjToKeep = document.GetObjectsInRectangle(0f, 0f, 600f, 115f, IacGetRectObjectsConstants.acGetRectObjectsIntersecting).Cast<IacObject>(); foreach (IacObject pdfObj in listObj.Except(listObjToKeep)) { // if pdfObj is not in visible inside the rectangle then call pdfObj.Delete(); pdfObj.Delete(false); }

正如@yms在评论中所说,使用5.0版本中的新方法
IacDocument.Redact

的另一种解决方案也可以用于删除指定矩形中的所有对象,并在其位置绘制纯色矩形。

使用Tracker-Software Editor SDK

我没有尝试过,但似乎有可能,请参阅此

post


1
投票

PdfReader pdfReader = new PdfReader("../Template_Path.pdf"); PdfStamper pdfStamperToPopulate = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create)); AcroFields pdfFormFields = pdfStamperToPopulate.AcroFields; pdfFormFields.RemoveField("fieldNameToBeRemoved");



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.