Внешняя часть: средство просмотра PDF.js, где пользователь рисует на странице затемненные прямоугольники.
Внутренняя часть: iTextSharp для рисования прямоугольников с черной заливкой (анонимизация).
Если в PDF-файле есть метаданные «Поворот», он отображается правильно (повернутый) в редакторе анонимизации. Однако на выходе это портится. Это код, который рисует
Код: Выделить всё
public static Stream CleanUpAllRectangles(Stream pdfToAnomnymization, IEnumerable
locationToAnonymizes)
{
PdfReader.unethicalreading = true;
using (var reader = new PdfReader(pdfToAnomnymization))
{
reader.encrypted = false;
using (var anonymizedPdf = new MemoryStream())
{
using (var stamper = new PdfStamper(reader, anonymizedPdf))
{
var pdfCleanUpLocations = locationToAnonymizes.ToList();
var cleaner = new CleanUp.PdfCleanUpProcessor(pdfCleanUpLocations, stamper);
cleaner.CleanUp();
}
return new MemoryStream(anonymizedPdf.ToArray());
}
}
}
public void CleanUp()
{
PdfReader pdfReader = pdfStamper.Reader;
foreach (var signatureName in pdfReader.AcroFields.GetSignatureNames())
{
var positions = pdfReader.AcroFields.GetFieldPositions(signatureName);
if (positions != null)
{
var matches =
from position in positions
from entry in pdfCleanUpLocations.TryGetValue(position.page, out var e) ? e : Enumerable.Empty()
where !new RectangleJ(position.position)
.Intersection(
new RectangleJ(entry.Region))
.IsEmpty()
select position;
if (matches.Any())
{
pdfReader.AcroFields.RemoveField(signatureName);
}
}
}
foreach (KeyValuePair entry in pdfCleanUpLocations)
{
CleanUpPage(entry.Key, entry.Value);
}
pdfStamper.Reader.RemoveUnusedObjects();
}
private void CleanUpPage(int pageNum, IList cleanUpLocations)
{
if (cleanUpLocations.Count == 0)
{
return;
}
PdfReader pdfReader = pdfStamper.Reader;
PdfDictionary page = pdfReader.GetPageN(pageNum);
PdfContentByte canvas = pdfStamper.GetUnderContent(pageNum);
byte[] pageContentInput = ContentByteUtils.GetContentBytesForPage(pdfReader, pageNum);
page.Remove(PdfName.CONTENTS);
canvas.SaveState();
PdfCleanUpRegionFilter filter = CreateFilter(cleanUpLocations);
PdfCleanUpRenderListener pdfCleanUpRenderListener = new PdfCleanUpRenderListener(pdfStamper, filter);
pdfCleanUpRenderListener.RegisterNewContext(pdfReader.GetPageResources(page), canvas);
PdfContentStreamProcessor contentProcessor = new PdfContentStreamProcessor(pdfCleanUpRenderListener);
PdfCleanUpContentOperator.PopulateOperators(contentProcessor, pdfCleanUpRenderListener);
contentProcessor.ProcessContent(pageContentInput, page.GetAsDict(PdfName.RESOURCES));
pdfCleanUpRenderListener.PopContext();
canvas.RestoreState();
ColorCleanedLocations(canvas, cleanUpLocations);
if (redactAnnotIndirRefs != null)
{ // if it isn't null, then we are in "extract locations from redact annots" mode
DeleteRedactAnnots(pageNum);
}
}
Поворот на 270 (поскольку сканирование PDF-файла выполняется в пространстве), прямоугольники рисуются на правильно повернутом содержимом через PDF.js, в результате чего анонимный PDF-файл с помощью iTextSharp возвращает документ в книжной ориентации с содержимым сбоку. Прямоугольники повернуты на 270 градусов.
Попытка stamper.RotateContents = false:
Содержимое теперь повернуто правильно, прямоугольники теперь повернуты на 180 градусов.
Как сопоставить координаты, созданные в редакторе PDF.js? Я не совсем понимаю, что происходит с ротацией.
Подробнее здесь: https://stackoverflow.com/questions/798 ... tate-pages
Мобильная версия