PDFsharp & MigraDoc Foundation

PDFsharp - A .NET library for processing PDF & MigraDoc Foundation - Creating documents on the fly
It is currently Sat Sep 07, 2024 5:20 am

All times are UTC


Forum rules


Please read this before posting on this forum: Forum Rules



Post new topic Reply to topic  [ 4 posts ] 
Author Message
PostPosted: Wed Apr 17, 2013 4:30 pm 
Offline

Joined: Fri Apr 05, 2013 6:42 pm
Posts: 10
OK I have a PDF document that I create with MigraDoc. Later on down the line I eventually append addendum information to it. I add a bookmark to the combined documents on the second page of the addendum PDF (which would be original pdf.pagecount + offset).

The bookmark is added successfully, but it overwrites the existing ones from the original PDF before merging.

Is there a way to make it not do this? If not I guess I could try and change the source to remember the previous Catalog's bookmarks every page add.

Thanks,

Justin


Last edited by MonkFox on Wed Apr 17, 2013 4:49 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
PostPosted: Wed Apr 17, 2013 4:39 pm 
Offline

Joined: Fri Apr 05, 2013 6:42 pm
Posts: 10
Actually, now that I've looked into it more.

It's the line 'pdf.Outlines.Add("Addendums",page,false)'.

I'm using:

Code:
PdfSharp.Pdf.IO.PdfReader.Open(System.IO.Path.Combine(path, "Document.pdf"))


Do I need to specific a certain type of opening? For instance, like:

Code:
 PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import


for the document that's being appended to?


Top
 Profile  
Reply with quote  
PostPosted: Fri Apr 19, 2013 1:54 pm 
Offline

Joined: Fri Apr 05, 2013 6:42 pm
Posts: 10
I looked into the pdfmerge project and got the functionality that I wanted.
This example simply creates two PDF documents and then merges them
while keeping the bookmarks from each document using the PDFmerge library.

I also took the three files from SplitMergeLib and created a PDFMerge class library.

Sub Main:
Code:
    Sub Main()

        CreatDocument("testpdf1.pdf")
        CreatDocument("testpdf2.pdf")

        Dim merger As New PdfMerge.SplitMergeLib.SplitMergeCmdFile()
        Dim MergeListItem As New PdfMerge.SplitMergeLib.MergeListFiles()
        MergeListItem.Path = "testpdf1.pdf"
        MergeListItem.Level = 0
        merger.MergeListFileArray.Add(MergeListItem)

        Dim MergeListItem2 As New PdfMerge.SplitMergeLib.MergeListFiles()
        MergeListItem2.Path = "testpdf2.pdf"
        MergeListItem2.Level = 0
        merger.MergeListFileArray.Add(MergeListItem2)

        MergeDocuments(merger)

        Console.ReadLine()
    End Sub


MergeDocuments():
Code:

    Public Sub MergeDocuments(ByVal merger As PdfMerge.SplitMergeLib.SplitMergeCmdFile)
        Dim psm As New PdfMerge.SplitMergeLib.PdfSharpSplitterMerger()

        Dim line As String = ""
        For Each merge As PdfMerge.SplitMergeLib.MergeListFiles In merger.MergeListFileArray
            line = merge.Descriptor

            Dim pagelst As String = merge.Pages
            Dim page As Integer = 1

            Dim pagearr As String() = pagelst.Split(New Char() {"-"})
            Dim start As Integer = 0
            Dim endp As Integer = 0
            Dim ps As New ArrayList()

            Try
                start = Integer.Parse(pagearr(0))
                endp = start
                If pagearr.Length > 1 Then
                    endp = Integer.Parse(pagearr(1))
                End If
                If endp > 0 Then
                    For x As Integer = start To endp
                        ps.Add(x - 1)
                    Next
                End If
            Catch ex As Exception

            End Try

            If (ps.Count > 0) Then
                page += psm.Add(merge.Path, ps.ToArray(System.Type.GetType("Integer")))
            Else
                page += psm.Add(merge.Path)
            End If

            Dim err As String = ""
            psm.AddBookmarksFromFile("", merge.Level, True, err)
        Next

        psm.Finish("output.pdf", Nothing, False, 1)
    End Sub


CreateDocument():
Code:
    Public Sub CreatDocument(ByVal name As String)

        Dim doc As New MigraDoc.DocumentObjectModel.Document()
        doc.Info.Title = "name"

        Dim section As MigraDoc.DocumentObjectModel.Section = doc.AddSection()
        section.PageSetup.TopMargin = "1.0cm"

        Dim header As MigraDoc.DocumentObjectModel.HeaderFooter = section.Headers.Primary

        Dim paragraph As MigraDoc.DocumentObjectModel.Paragraph = section.AddParagraph()
        paragraph.AddText("this is text on page 1")
        paragraph.AddBookmark("Page 1")
        paragraph.Format.OutlineLevel = MigraDoc.DocumentObjectModel.OutlineLevel.Level1
        paragraph.ExpandOutline = False

        section = doc.AddSection()

        paragraph = section.AddParagraph()
        paragraph.AddText("this is text on page 2")
        paragraph.AddBookmark("Page 2")
        paragraph.Format.OutlineLevel = MigraDoc.DocumentObjectModel.OutlineLevel.Level1
        paragraph.ExpandOutline = False

        MigraDoc.DocumentObjectModel.IO.DdlWriter.WriteToFile(doc, "MigraDoc.mdddl")
        Dim DocRenderer As New MigraDoc.Rendering.PdfDocumentRenderer(True, Global.PdfSharp.Pdf.PdfFontEmbedding.Always)

        DocRenderer.Document = doc
        DocRenderer.RenderDocument()

        DocRenderer.PdfDocument.Save(name)

        DocRenderer.PdfDocument.Close()
        DocRenderer.PdfDocument.Dispose()

    End Sub


I added the .ExpandOutline property.
Here are the steps.

MigraDoc.DocumentObjectModel -> Paragraph.cs:
Add:
Code:
    /// <summary>
    /// Gets or sets a boolean value indicating whether or not to expand the outlines defined by paragraphs.
    /// </summary>
    public bool ExpandOutline
    {
        get { return this.expandOutline; }
        set { this.expandOutline = value; }
    }
    internal bool expandOutline = true;


MigraDoc.Rendering -> DocumentRenderer.cs
Look for:
Code:
 function internal void AddOutline(int level, string title, PdfPage destinationPage)


Change to:
Code:
 AddOutline(int level, string title, PdfPage destinationPage, bool expandOutline)


In the same function, Look for lines:
Code:
PdfOutline outline = outlines.Add(" ", destinationPage, true);
// ... and
outlines.Add(title, destinationPage, true);


Change to:
Code:
PdfOutline outline = outlines.Add(" ", destinationPage, expandOutline );
//... and
outlines.Add(title, destinationPage, expandOutline );


MigraDoc.Rendering -> ParagraphRenderer.cs
Look for:
Code:
 
Internal override void Render()


Change:
Code:
// ... stuff before
      InitRendering();
      if ((int)this.paragraph.Format.OutlineLevel >= 1 && this.gfx.PdfPage != null) // Don't call GetOutlineTitle() in vain
        this.documentRenderer.AddOutline((int)this.paragraph.Format.OutlineLevel, GetOutlineTitle(), this.gfx.PdfPage );
// ... stuff After


To:

Code:
// ... stuff before
      InitRendering();
      if ((int)this.paragraph.Format.OutlineLevel >= 1 && this.gfx.PdfPage != null) // Don't call GetOutlineTitle() in vain
        this.documentRenderer.AddOutline((int)this.paragraph.Format.OutlineLevel, GetOutlineTitle(), this.gfx.PdfPage, this.paragraph.ExpandOutline );
// ... stuff After


I noticed that the PdfOutline object has a public Opened property. I'm guessing I could have looped through the Renderer.PdfDocument's Outlines
and set the expanded that way. I just like the option being there when I'm using MigraDoc.


Justin


Top
 Profile  
Reply with quote  
PostPosted: Fri Apr 19, 2013 2:04 pm 
Offline

Joined: Fri Apr 05, 2013 6:42 pm
Posts: 10
How do I mark this issue as resolved?


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 4 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 26 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Privacy Policy, Data Protection Declaration, Impressum
Powered by phpBB® Forum Software © phpBB Group