Как уменьшить встроенный дублированный шрифт в PDF - PullRequest
0 голосов
/ 06 февраля 2019

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

Эта процедура должна создать файл без дублированного шрифта.

Using msDoc As MemoryStream = New MemoryStream()
            Using document As iTextSharp.text.Document = New iTextSharp.text.Document()
                Using copy As iTextSharp.text.pdf.PdfSmartCopy = New iTextSharp.text.pdf.PdfSmartCopy(document, msDoc)
                document.Open()

                Dim pdfReader As New iTextSharp.text.pdf.PdfReader("C:\Users\pier\Desktop\prova.pdf")
                For i As Integer = 1 To pdfReader.NumberOfPages
                    copy.AddPage(copy.GetImportedPage(pdfReader, i))
                Next

                msDoc.Position = 0
                System.IO.File.WriteAllBytes("C:\Users\pier\Desktop\file213.pdf", msDoc.ToArray())
            End Using


        End Using
    End Using

1 Ответ

0 голосов
/ 06 февраля 2019

Вы перехватываете байты до того, как документ результата будет завершен.

PDF результата будет завершен после закрытия document.В вашем случае document неявно закрывается в End Using, и вы извлекаете байты потока до этого.Кроме того, вы играете с позицией потока (msDoc.Position = 0) до закрытия document, поэтому вы дополнительно заставляете конечную секцию PDF перезаписывать свое начало ...

Кроме того, не ставьтеэкземпляр PdfSmartCopy в строку Using;этот экземпляр неявно закрывается, когда document закрывается, но вы пытаетесь закрыть его раньше.

Таким образом, вместо этого выполните:

Using msDoc As MemoryStream = New MemoryStream()
    Using document As iTextSharp.text.Document = New iTextSharp.text.Document()
        Dim copy As New iTextSharp.text.pdf.PdfSmartCopy(document, msDoc)
        document.Open()

        Dim pdfReader As New iTextSharp.text.pdf.PdfReader("C:\Users\pier\Desktop\prova.pdf")
        For i As Integer = 1 To pdfReader.NumberOfPages
            copy.AddPage(copy.GetImportedPage(pdfReader, i))
        Next
    End Using

    System.IO.File.WriteAllBytes("C:\Users\pier\Desktop\file213.pdf", msDoc.ToArray())
End Using

Удаление дублирующихся шрифтов

Вы говорите

Эта процедура должна создать файл без дублированного шрифта.

Ваш код удаляет очень специфичные дубликаты записей шрифтов.Удаляет ли он все из вашего документа, зависит от того, относятся ли они к этому конкретному типу.

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