После обновления до iTextSharp v5.5.8 + недействительный pdf - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над приложением C #, которое создает отчеты, открывая шаблон и добавляя текст и таблицы. Это отлично работает в iTextSharp v5.5.6

Поскольку мне нужно внести некоторые изменения в код, который я хочу обновить до последней версии: v5.5.13

PDF все еще создан. У меня нет проблем с просмотром в pdfJS, но после загрузки и открытия в Adobe Acrobat Reader я получаю сообщение о том, что что-то не так в документе. Документ по-прежнему отображается правильно.

Когда я проверяю PDF в https://www.pdf -online.com / osa / validate.aspx , я получаю такой результат:

Compliance  pdf1.7
Result  Document does not conform to PDF/A.
Details Validating file "foo.pdf" for conformance level pdf1.7
The name Xf1 of a xobject resource is unknown.
The document does not conform to the requested standard.
The document doesn't conform to the PDF reference (missing required entries, wrong value types, etc.).
The document's meta data is either missing or inconsistent or corrupt.
The document does not conform to the PDF 1.7 standard.

PDF, созданный в версии 5.5.6, возвращает:

Compliance  pdf1.7
Result  Document validated successfully.
Details Validating file "foo.pdf" for conformance level pdf1.7
The document does conform to the PDF 1.7 standard.

Я перепробовал все версии между v5.5.6 и v5.5.13 и начиная с v5.5.8 я получаю эту ошибку.

Скорее всего, мне нужно изменить свой код, но я не уверен, как. Я проверил журналы изменений, но не смог найти ничего, связанного с этой ошибкой.

Вот код:

var ms = new MemoryStream();
var document = new Document();
var writer = PdfWriter.GetInstance(document, ms);
writer.PageEvent = new MyPageEventHandler();
document.Open();

writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
writer.PdfVersion = PdfWriter.VERSION_1_7;
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
writer.SetFullCompression();

document.SetMargins(33, 33, 35, 55);
document.AddTitle(title);
document.AddAuthor("foo");
document.AddSubject(subject);
document.AddAuthor("bar");
document.AddCreationDate();
document.AddProducer();
document.AddLanguage("NL");
document.AddCreator("fooMore");

// Add some text and table data
---
writer.CloseStream = false;
document.Close();
ms.Position = 0;
return ms;

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Первые благодарности @KevinWillems за предложение PDF / A. Скоро посмотрю.

Но между тем я исправил свою проблему. В этом посте у меня есть весь код в одном методе, но на самом деле у меня есть несколько методов, которые вызывают. Одним из них является установка полей и метаданных. В этом методе я также назвал document.open();. Версии до v5.5.8 не ломались на этом, но более новые делают. Вероятно, потому что документ открывается дважды и только один закрывается / освобождается. После удаления второго document.open(); Acrobat Reader больше не жаловался и проверка прошла также.

0 голосов
/ 07 ноября 2018

Я бы рекомендовал использовать класс PdfAWriter для создания документов PdfA с использованием iText 5. Этот класс уже охватывает несколько требований, которые применяются стандартом PDF / A. Также будет сгенерировано исключение, если определенное требование не будет выполнено.

    public void createPdf(String dest) throws IOException, DocumentException {
        Font font = new Font(BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 10);
        Document document = new com.itextpdf.text.Document(PageSize.A4,
                MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM);
        PdfAWriter writer = PdfAWriter.getInstance(document,
                new FileOutputStream(DEST), PdfAConformanceLevel.PDF_A_1A);
        document.addAuthor("Author");
        document.addSubject("Subject");
        document.addLanguage("nl-nl");
        document.addCreationDate();
        document.addCreator("Creator");
        document.addTitle("title");
        writer.setTagged();
        writer.createXmpMetadata();
        document.open();
        File file = new File("resources/data/sRGB_CS_profile.icm");
        ICC_Profile icc = ICC_Profile
                .getInstance(new FileInputStream(file));
        writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
        Paragraph element = new Paragraph("Hello World", font);
        document.add(element);
        Image logoImage = Image.getInstance(LOGO);
        logoImage.setAccessibleAttribute(PdfName.ALT, new PdfString("Logo"));
        document.add(logoImage);
        document.close();
    }

Вы можете добавить класс PdfAWriter в свое приложение, добавив зависимость от com.itextpdf.itext-pdfa.

<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-pdfa -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-pdfa</artifactId>
    <version>5.5.13</version>
    <scope>test</scope>
</dependency>

Источник: iText 5 Pdf / A1 Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...