这是我找到的三个解决方案,如果它可以帮助某人(使用iTextSharp、Amyuni或Tracker-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
我没有尝试过,但似乎有可能,请参阅这篇文章。