2010-12-02 8 views
3

J'utilise abcpdf et je suis curieux de savoir si nous pouvons nous appelons récursivement AddImageUrl() fonction pour assembler le document pdf qui compile plusieurs urls?appelez plusieurs fois AddImageUrl (url) pour assembler document pdf

quelque chose comme:

 int pageCount = 0; 
    int theId = theDoc.AddImageUrl("http://stackoverflow.com/search?q=abcpdf+footer+page+x+out+of+", true, 0, true); 
    //assemble document 
    while (theDoc.Chainable(theId)) 
    { 
     theDoc.Page = theDoc.AddPage(); 
     theId = theDoc.AddImageToChain(theId); 
    } 
    pageCount = theDoc.PageCount; 
    Console.WriteLine("1 document page count:" + pageCount); 
    //Flatten document 
    for (int i = 1; i <= pageCount; i++) 
    { 
     theDoc.PageNumber = i; 
     theDoc.Flatten(); 
    } 

    //now try again 
    theId = theDoc.AddImageUrl("http://stackoverflow.com/questions/1980890/pdf-report-generation", true, 0, true); 
    //assemble document 
    while (theDoc.Chainable(theId)) 
    { 
     theDoc.Page = theDoc.AddPage(); 
     theId = theDoc.AddImageToChain(theId); 
    } 
    Console.WriteLine("2 document page count:" + theDoc.PageCount); 
    //Flatten document 
    for (int i = pageCount + 1; i <= theDoc.PageCount; i++) 
    { 
     theDoc.PageNumber = i; 
     theDoc.Flatten(); 
    } 
    pageCount = theDoc.PageCount; 

modifier: code qui semble fonctionner sur la base 'chasseur' solution:

 static void Main(string[] args) 
    { 
    Test2(); 
    } 

    static void Test2() 
    { 

    Doc theDoc = new Doc(); 
    // Set minimum number of items a page of HTML should contain. 
    theDoc.HtmlOptions.ContentCount = 10;// Otherwise the page will be assumed to be invalid. 
    theDoc.HtmlOptions.RetryCount = 10; // Try to obtain html page 10 times 
    theDoc.HtmlOptions.Timeout = 180000;// The page must be obtained in less then 10 seconds 

    theDoc.Rect.Inset(0, 10); // set up document 
    theDoc.Rect.Position(5, 15); 
    theDoc.Rect.Width = 602; 
    theDoc.Rect.Height = 767; 
    theDoc.HtmlOptions.PageCacheEnabled = false; 

    IList<string> urls = new List<string>(); 
    urls.Add("http://stackoverflow.com/search?q=abcpdf+footer+page+x+out+of+"); 
    urls.Add("http://stackoverflow.com/questions/1980890/pdf-report-generation"); 
    urls.Add("http://yahoo.com"); 
    urls.Add("http://stackoverflow.com/questions/4338364/recursively-call-addimageurlurl-to-assemble-pdf-document"); 

    foreach (string url in urls) 
     AddImage(ref theDoc, url); 

    //Flatten document 
    for (int i = 1; i <= theDoc.PageCount; i++) 
    { 
     theDoc.PageNumber = i; 
     theDoc.Flatten(); 
    } 

    theDoc.Save("batchReport.pdf"); 
    theDoc.Clear(); 
    Console.Read(); 

    } 


    static void AddImage(ref Doc theDoc, string url) 
    { 
    int theId = theDoc.AddImageUrl(url, true, 0, true); 
    while (theDoc.Chainable(theId)) 
    { 
     theDoc.Page = theDoc.AddPage(); 
     theId = theDoc.AddImageToChain(theId); // is this right? 
    } 
    Console.WriteLine(string.Format("document page count: {0}", theDoc.PageCount.ToString())); 
    } 

modifier 2: appeler malheureusement AddImageUrl à plusieurs reprises lors de la génération des documents pdf n » t semblent fonctionner ...

+0

Ce n'est pas une récursivité. La récursivité est une fonction qui s'appelle elle-même. –

+0

d'accord, mauvais choix de mots ... – krul

Répondre

7

Enfin trouvé une solution fiable. Au lieu d'exécuter la fonction AddImageUrl() sur le même document sous-jacent, nous devons exécuter la fonction AddImageUrl() sur son propre document Doc et créer une collection de documents que nous assemblerons en un seul document en utilisant la méthode Append(). Voici le code:

 static void Main(string[] args) 
    { 
    Test2(); 
    } 

    static void Test2() 
    { 
    Doc theDoc = new Doc(); 
    var urls = new Dictionary<int, string>(); 
    urls.Add(1, "http://www.asp101.com/samples/server_execute_aspx.asp"); 
    urls.Add(2, "http://stackoverflow.com/questions/4338364/repeatedly-call-addimageurlurl-to-assemble-pdf-document"); 
    urls.Add(3, "http://www.google.ca/"); 
    urls.Add(4, "http://ca.yahoo.com/?p=us"); 
    var theDocs = new List<Doc>(); 

    foreach (int key in urls.Keys) 
     theDocs.Add(GetReport(urls[key])); 

    foreach (var doc in theDocs) 
    { 
     if (theDocs.IndexOf(doc) == 0) 
      theDoc = doc; 
     else 
      theDoc.Append(doc); 
    } 

    theDoc.Save("batchReport.pdf"); 
    theDoc.Clear(); 
    Console.Read(); 

    } 


    static Doc GetReport(string url) 
    { 

    Doc theDoc = new Doc(); 
    // Set minimum number of items a page of HTML should contain. 
    theDoc.HtmlOptions.ContentCount = 10;// Otherwise the page will be assumed to be invalid. 
    theDoc.HtmlOptions.RetryCount = 10; // Try to obtain html page 10 times 
    theDoc.HtmlOptions.Timeout = 180000;// The page must be obtained in less then 10 seconds 

    theDoc.Rect.Inset(0, 10); // set up document 
    theDoc.Rect.Position(5, 15); 
    theDoc.Rect.Width = 602; 
    theDoc.Rect.Height = 767; 
    theDoc.HtmlOptions.PageCacheEnabled = false; 

    int theId = theDoc.AddImageUrl(url, true, 0, true); 
    while (theDoc.Chainable(theId)) 
    { 
     theDoc.Page = theDoc.AddPage(); 
     theId = theDoc.AddImageToChain(theId); 
    } 

    //Flatten document 
    for (int i = 1; i <= theDoc.PageCount; i++) 
    { 
     theDoc.PageNumber = i; 
     theDoc.Flatten(); 
    } 

    return theDoc; 
    } 

    } 
+0

cela fonctionne pour moi aussi, une chose à noter si vous devrez réappliquer toute mise en page que vous avez fait si vous utilisez un nouveau document maître pour tous les autres, vous peut également obtenir des numéros de page fonctionnant comme prévu si vous faites le code de numéro de page après les ajouts –

Questions connexes