Я оцениваю iText 7 как альтернативу для наших текущих пакетов обработки PDF. Я создаю Po C, где вход представляет собой PDF-документ с контейнерами (т.е. аннотации). Logi c должен удалить существующие QR-коды, а затем добавить новые в контейнеры.
Хотя logi c, кажется, работает и коды удалены и / или добавлены, все еще существуют проблемы с измененными файл. В нем говорится об ошибках с таблицей XREF. Ошибка вводится также, если я только удаляю или добавляю код, поэтому я подумал, что причина может быть в общем коде.
Кажется, нет никаких проблем при открытии измененного файла в браузере. При открытии с помощью расширенного редактора PDF отображается предупреждение. Восстановление файла в редакторе, похоже, исправляет файл, но это не решение.
Интересно, где я ошибся и что делать, чтобы это исправить или исследовать дальше. С кодом ниже легко воспроизвести. Есть мысли по этому поводу?
Я тестирую с помощью iText 7.1.11 в. NET Базовом консольном приложении, написанном с C#.
Основной код процесса:
using (var pdfFileStream = new MemoryStream(pdfFileBytes))
{
using (var outputFileStream = new ByteArrayOutputStream())
{
var pdfReader = new PdfReader(pdfFileStream);
var pdfWriter = new PdfWriter(outputFileStream);
var pdfDocument = new PdfDocument(pdfReader, pdfWriter);
var pageCount = pdfDocument.GetNumberOfPages();
PdfPage page = null;
IList<PdfAnnotation> annotations = null;
for (int i = 0; i < pageCount; i++)
{
page = pdfDocument.GetPage(i + 1);
annotations = page.GetAnnotations();
if (annotations.Count == 0)
{
continue;
}
// Get QR code containers
var containers = FilterAnnotations(annotations, containerName);
if (containers.Count == 0)
{
continue;
}
// Get QR codes instances
var instances = FilterAnnotations(annotations, instanceName);
if (instances.Count > 0)
{
foreach (var instance in instances)
{
RemoveQRCode(instance, page);
}
}
foreach (var container in containers)
{
AddQRCode(container, page, pdfDocument, url);
}
}
pdfDocument.Close();
return outputFileStream.ToArray();
}
}
Я отфильтровываю аннотации, которые я хотел бы удалить (т.е. коды) по темам. То же самое касается поиска контейнеров, в которые нужно поместить аннотации кода:
private List<PdfAnnotation> FilterAnnotations(IList<PdfAnnotation> annotations, string subject)
{
return annotations.Where(a =>
!string.IsNullOrEmpty(GetSubject(a)) &&
GetSubject(a).ToLowerInvariant().Equals(subject, StringComparison.OrdinalIgnoreCase)).ToList();
}
Затем я прохожу через отфильтрованные аннотации oop:
private void RemoveQRCode(PdfAnnotation annotation, PdfPage page)
{
page.RemoveAnnotation(annotation);
}
Следующий код описывает добавление кодов:
private void AddQRCode(PdfAnnotation container, PdfPage page, PdfDocument document, string url)
{
BarcodeQRCode qrCode = new BarcodeQRCode(url);
PdfFormXObject qrCodeForm = qrCode.CreateFormXObject(ColorConstants.BLACK, document);
var rectangle = GetRectangle(container);
var canvas = new PdfCanvas(page);
canvas
.SaveState()
.AddXObject(qrCodeForm, rectangle)
.RestoreState();
canvas.Release();
PdfStampAnnotation stampAnnotation = new PdfStampAnnotation(rectangle);
stampAnnotation.SetSubject(new PdfString(instanceName));
stampAnnotation.SetAppearance(PdfName.N, new PdfAnnotationAppearance(qrCodeForm.GetPdfObject()));
stampAnnotation.SetFlags(PdfAnnotation.PRINT);
page.AddAnnotation(stampAnnotation);
}
Я для краткости пропустил код.
Заранее спасибо.
Обновление 1
Согласно запросу @ mkl два файла , результатом которых является test2_mod. Я также добавил больше кода. Спасибо за ваш быстрый ответ.