"PDFsharp не может обработать эту функцию PDF, представленную с ошибкой Acrobat 6" при открытии файла PDF
Я использую PDFsharp (v1.32) для объединения нескольких PDF-файлов. Я открываю документы с помощью этого кода:
PdfDocument inputDocument = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import);
и при открытии одного документа (с PDF версии 1.5 (Acrobat 6.x)) получаю исключение:
необработанное исключение типа PdfSharp'.Формат PDF.ИО.PdfReaderException произошел в PdfSharp.файл DLL Дополнительная информация: не удается обработать потоки iref. Текущая реализация PDFsharp не может обрабатывать эту функцию PDF, введенную с помощью Acrobat 6.
что я могу с ним сделать? Мне нужно объединить все файлы, я не могу просто пропустить его. Я попытался найти решение, но не нашел ответа или просто очень старые отзывы от команды PDFsharp, что они собираются "исправить это".
2 ответов
используйте PDFsharp 1.50 beta 3 с декабря 2015 года или более новую версию.
https://www.nuget.org/packages/PdfSharp/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-gdi/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-wpf/1.50.4820-RC1
вы можете использовать iText5 или iText7 для удаления потоков iref.
блок iText5 ниже вытягивается из http://forum.pdfsharp.net/viewtopic.php?f=2&t=693
static public PdfDocument Open(MemoryStream sourceStream)
{
PdfDocument outDoc = null;
sourceStream.Position = 0;
try
{
outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
//workaround if pdfsharp doesn't support this pdf
sourceStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(sourceStream);
iTextSharp.text.pdf.PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_4);
pdfStamper.Writer.CloseStream = false;
pdfStamper.Close();
outDoc = PdfReader.Open(outputStream, PdfDocumentOpenMode.Import);
}
return outDoc;
}
мне пришлось переписать его для iText7 (все еще используя старый PDFSharp):
static PdfDocument CompatibleOpen(MemoryStream inputStream, PdfDocumentOpenMode openMode)
{
PdfDocument pdfDocument = null;
inputStream.Position = 0;
try
{
pdfDocument = PdfReader.Open(inputStream, openMode);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
inputStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iText.Kernel.Pdf.WriterProperties writerProperties = new iText.Kernel.Pdf.WriterProperties();
writerProperties.SetPdfVersion(iText.Kernel.Pdf.PdfVersion.PDF_1_4);
iText.Kernel.Pdf.PdfReader pdfReader = new iText.Kernel.Pdf.PdfReader(inputStream);
iText.Kernel.Pdf.PdfDocument pdfStamper = new iText.Kernel.Pdf.PdfDocument(pdfReader, new iText.Kernel.Pdf.PdfWriter(outputStream, writerProperties));
iText.Forms.PdfAcroForm pdfForm = iText.Forms.PdfAcroForm.GetAcroForm(pdfStamper, true);
if (!pdfForm.IsNull())
{
pdfForm.FlattenFields();
}
writerProperties.SetFullCompressionMode(false);
pdfStamper.GetWriter().SetCloseStream(false);
pdfStamper.Close();
pdfDocument = PdfReader.Open(outputStream, openMode);
}
return pdfDocument;
}
Я надеюсь, что это поможет кому-то там пройти через ту же боль, что и я, и спасет их несколько дней!!!