合并pdf并保留SetTagged

问题描述 投票:0回答:1

我正在使用iTextSharp 5.x.我正在尝试合并两个pdf并保留isTagged标志。当我删除copy.SetTagged();结果pdf包含两个pdfs,这很棒。添加copy.SetTagged()时会出现异常

Exception -->System.ObjectDisposedException: Cannot access a closed file.
at System.IO.__Error.FileNotOpen()
at System.IO.FileStream.get_Position()

这是代码

List<string> filesToMerge = new List<string> { "C:/dev/dcs/wp-cla-dcs/Hex/Docs/metadata/coverPage.pdf", "C:/dev/dcs/wp-cla-dcs/Hex/Docs/metadata/49W7a.pdf" };
string outputFileName = "C:/dev/dcs/wp-cla-dcs/Hex/Docs/metadata/results.pdf";

using (FileStream outFS = new FileStream(outputFileName, FileMode.Create))
using (Document document = new Document())
//  using (PdfCopy copy = new PdfCopy(document, outFS))
using (PdfCopy copy = new PdfSmartCopy(document, outFS))
{
    {
        copy.SetTagged();
        // Set up the iTextSharp document
        document.Open();
        foreach (string pdfFile in filesToMerge)
        {
            using (var reader = new PdfReader(pdfFile))
            {
                copy.AddDocument(reader);
                copy.FreeReader(reader);
            }
        }

    }
}
c# pdf itext
1个回答
0
投票

尽管@ bruno-lowagie的评论,我用iText5做了更好的结果。

Uisng iText7,PdfMerger留下了几个没有标记的内容(所有内容都标记在源文档中)。 iText5中的PdfCopy工作得很好,只需要手动添加Xmp元数据,标题,语言等:

public static void CombineMultiplePDFs(string[] fileNames, string outFile)
{
    var lang = "en";
    var title = "My new title";

    // step 1: creation of a document-object
    Document document = new Document();

    // step 2: we create a writer that listens to the document
    FileStream newFileStream = new FileStream(outFile, FileMode.Create);
    PdfCopy writer = new PdfCopy(document, newFileStream);

    writer.SetTagged();

    writer.PdfVersion = PdfWriter.VERSION_1_7;
    writer.AddViewerPreference(PdfName.DISPLAYDOCTITLE, new PdfBoolean(true));
    writer.Info.Put(PdfName.TITLE, new PdfString(title));
    writer.CreateXmpMetadata();

    // step 3: we open the document
    document.Open();

    // set meta data
    document.AddLanguage(lang);
    document.AddTitle(title);

    // keep an array of all open readers so they can be closed again.
    var readers = new PdfReader[fileNames.Length];
    for (var fi = 0; fi < fileNames.Length; fi++)
    {
        // we create a reader for a certain document
        var fileName = fileNames[0];
        PdfReader reader = new PdfReader(fileName);
        readers[fi] = reader;
        reader.ConsolidateNamedDestinations();

        // step 4: we add content
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            // IMPORTANT: the third param is is "KeepTaggedPdfStructure"
            PdfImportedPage page = writer.GetImportedPage(reader, i, true);
            writer.AddPage(page);
        }
    }

    // step 5: we close the document and writer
    writer.Close();
    document.Close();

    // close readers only after document is lcosed
    foreach (var r in readers)
    {
        r.Close();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.