2

私には、目次のコンテンツを作成し、うまく機能するクラスがあります。コードは次のとおりです。

public void Build(string center,IDictionary<string,iTextSharp.text.Image> images)
    {
        iTextSharp.text.Image image = null;
        XPathDocument rapportTekst = new XPathDocument(Application.StartupPath + @"..\..\..\RapportTemplates\RapportTekst.xml");
        XPathNavigator nav = rapportTekst.CreateNavigator();
        XPathNodeIterator iter;

        iter = nav.Select("//dokument/brevhoved");
        iter.MoveNext();
        var logo = iTextSharp.text.Image.GetInstance(iter.Current.GetAttribute("url", ""));
        iter = nav.Select("//dokument/gem_som");
        iter.MoveNext();
        string outputPath = iter.Current.GetAttribute("url", "")+center+".pdf";
        iter = nav.Select("//dokument/titel");
        iter.MoveNext();
        this.titel = center;

        Document document = new Document(PageSize.A4, 30, 30, 100, 30);
        var outputStream = new FileStream(outputPath, FileMode.Create);
        var pdfWriter = PdfWriter.GetInstance(document, outputStream);
        pdfWriter.SetLinearPageMode();

        var pageEventHandler = new PageEventHandler();
        pageEventHandler.ImageHeader = logo;
        pdfWriter.PageEvent = pageEventHandler;

        DateTime timeOfReport = DateTime.Now.AddMonths(-1);

        pageWidth = document.PageSize.Width - (document.LeftMargin + document.RightMargin);
        pageHight = document.PageSize.Height - (document.TopMargin + document.BottomMargin);

        document.Open();
        var title = new Paragraph(titel, titleFont);
        title.Alignment = Element.ALIGN_CENTER;
        document.Add(title);

        List<TableOfContentsEntry> _contentsTable = new List<TableOfContentsEntry>();
        nav.MoveToRoot();
        iter = nav.Select("//dokument/indhold/*");
        Chapter chapter = null;
        int chapterCount = 1;
        while (iter.MoveNext())
        {
            _contentsTable.Add(new TableOfContentsEntry("Test", pdfWriter.CurrentPageNumber.ToString()));
            XPathNodeIterator innerIter = iter.Current.SelectChildren(XPathNodeType.All);
            chapter = new Chapter("test", chapterCount);
            while(innerIter.MoveNext())
            {                  
                if (innerIter.Current.Name.ToString().ToLower().Equals("billede"))
                {
                    image = images[innerIter.Current.GetAttribute("navn", "")];
                    image.Alignment = Image.ALIGN_CENTER;
                    image.ScaleToFit(pageWidth, pageHight);
                    chapter.Add(image);
                }
                if (innerIter.Current.Name.ToString().ToLower().Equals("sektion"))
                {
                    string line = "";
                    var afsnit = new Paragraph();
                    line += (innerIter.Current.GetAttribute("id", "") + " ");
                    innerIter.Current.MoveToFirstChild();
                    line += innerIter.Current.Value;
                    afsnit.Add(line);
                    innerIter.Current.MoveToNext();
                    afsnit.Add(innerIter.Current.Value);
                    chapter.Add(afsnit);
                }
            }
            chapterCount++;
            document.Add(chapter);
        }
        document = CreateTableOfContents(document, pdfWriter, _contentsTable);
        document.Close();           
    }

次に、メソッドを呼び出します。そのため、メソッドCreateTableOfContents()は本来の動作を実行します。メソッドのコードは次のとおりです。

public Document CreateTableOfContents(Document _doc, PdfWriter _pdfWriter, List<TableOfContentsEntry> _contentsTable)
    {
        _doc.NewPage();
        _doc.Add(new Paragraph("Table of Contents", FontFactory.GetFont("Arial", 18, Font.BOLD)));
        _doc.Add(new Chunk(Environment.NewLine));

        PdfPTable _pdfContentsTable = new PdfPTable(2);

        foreach (TableOfContentsEntry content in _contentsTable)
        {
            PdfPCell nameCell = new PdfPCell(_pdfContentsTable);
            nameCell.Border = Rectangle.NO_BORDER;
            nameCell.Padding = 6f;
            nameCell.Phrase = new Phrase(content.Title);
            _pdfContentsTable.AddCell(nameCell);

            PdfPCell pageCell = new PdfPCell(_pdfContentsTable);
            pageCell.Border = Rectangle.NO_BORDER;
            pageCell.Padding = 6f;
            pageCell.Phrase = new Phrase(content.Page);
            _pdfContentsTable.AddCell(pageCell);
        }
        _doc.Add(_pdfContentsTable);
        _doc.Add(new Chunk(Environment.NewLine));

        /** Reorder pages so that TOC will will be the second page in the doc
        * right after the title page**/
        int toc = _pdfWriter.PageNumber - 1;
        int total = _pdfWriter.ReorderPages(null);
        int[] order = new int[total];

        for (int i = 0; i < total; i++)
        {
            if (i == 0)
            {
                order[i] = 1;
            }
            else if (i == 1)
            {
                order[i] = toc;
            }
            else
            {
                order[i] = i;
            }
        }

        _pdfWriter.ReorderPages(order);
        return _doc;
    }

ただし、問題はです。当然、目次が最初のページになるように、ページを並べ替えるために、目次の前にページ分割を挿入したいと思います。しかし、pdfファイルの出力は正しくありません。

これがどのように見えるかの写真です: 写真

_doc.NewPage()inCreateTableOfContents()メソッドが正しく実行されていないようです。これは、メソッドがページの並べ替えを開始したときに、画像と目次が同じページにあることを意味します。

編集:上記を明確にするために、_doc.NewPage()は実行されますが、画像と目次の後に空白のページが追加されます。

すでに空白のページの後に新しいページを挿入しようとしているため、これが考えられる場所をいくつか読んだことがあります。しかし、そうではありません。

問題をわかりやすく説明するために、PDFファイルにもリンクします。

目次付きのPDF:目次付き

目次なしのPDF:目次なし

よろしくお願いします:)

4

0 に答える 0