Author: jghali
Date: Wed Mar 14 22:03:14 2018
New Revision: 22434

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22434
Log:
#15191: PDF bookmarks go to wrong target page on partial export

Modified:
    trunk/Scribus/scribus/pdflib_core.cpp
    trunk/Scribus/scribus/pdflib_core.h
    trunk/Scribus/scribus/pdfstructs.h

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22434&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Wed Mar 14 22:03:14 2018
@@ -541,7 +541,6 @@
        Catalog.Outlines = 2;
        Catalog.PageTree = 3;
        Catalog.Dest = 4;
-       PageTree.Count = 0;
        Outlines.First = 0;
        Outlines.Last = 0;
        Outlines.Count = 0;
@@ -664,7 +663,7 @@
                        qApp->processEvents();
                        if (abortExport) break;
 
-                       PDF_End_Page(a);
+                       PDF_End_Page();
                        pc_exportpages++;
                        if (usingGUI)
                        {
@@ -3364,7 +3363,7 @@
        }
 }
 
-void PDFLibCore::PDF_End_Page(int physPage)
+void PDFLibCore::PDF_End_Page()
 {
        if (!pageData.radioButtonList.isEmpty())
                PDF_RadioButtons();
@@ -3582,7 +3581,7 @@
                PutDoc(">>");
                writer.endObj(Gobj);
        }
-       uint pageObject = writer.newObject();
+       PdfId pageObject = writer.newObject();
        writer.startObj(pageObject);
        PutDoc("<<\n/Type /Page\n/Parent " + Pdf::toObjRef(writer.PagesObj) + 
"\n");
        PutDoc("/MediaBox [0 0 "+FToStr(maxBoxX)+" "+FToStr(maxBoxY)+"]\n");
@@ -3751,8 +3750,8 @@
        }
        PutDoc(">>");
        writer.endObj(pageObject);
-       PageTree.Count++;
-       PageTree.Kids[physPage] = pageObject;
+       PageTree.Kids.append(pageObject);
+       PageTree.KidsMap[ActPageP->pageNr()] = pageObject;
 }
 
 
@@ -9772,7 +9771,7 @@
 
 void PDFLibCore::PDF_Bookmark(PageItem *currItem, double ypos)
 {
-       Bvie->setAction(currItem, "/XYZ 0 "+FToStr(ypos)+" 0]");
+       Bvie->setAction(currItem, "/XYZ 0 "+FToStr(ypos)+" 0");
        BookMinUse = true;
 }
 
@@ -10953,7 +10952,7 @@
                                Inhal += "/Last "+Pdf::toPdf(ip->Last+Basis)+" 
0 R\n";
                        if (ip->childCount())
                                Inhal += "/Count 
-"+Pdf::toPdf(ip->childCount())+"\n";
-                       if ((ip->PageObject->OwnPage != -1) && 
PageTree.Kids.contains(ip->PageObject->OwnPage))
+                       if ((ip->PageObject->OwnPage != -1) && 
PageTree.KidsMap.contains(ip->PageObject->OwnPage))
                        {
                                QByteArray action = 
Pdf::toPdfDocEncoding(ip->Action);
                                if (action.isEmpty())
@@ -10962,7 +10961,7 @@
                                        double actionPos = page->height() - 
(ip->PageObject->yPos() - page->yOffset());
                                        action = "/XYZ 0 " + 
Pdf::toPdf(actionPos) + " 0";
                                }
-                               Inhal += "/Dest 
["+Pdf::toPdf(PageTree.Kids[ip->PageObject->OwnPage])+" 0 R "+action+"\n";
+                               Inhal += "/Dest 
["+Pdf::toPdf(PageTree.KidsMap[ip->PageObject->OwnPage])+" 0 R "+action+"]\n";
                        }
                        Inhal += ">>";
                        Inha[ip->ItemNr] = Inhal;
@@ -11037,11 +11036,13 @@
 {
        writer.startObj(writer.PagesObj);
        PutDoc("<<\n/Type /Pages\n/Kids [");
-       QMap<int, int>::Iterator kidsIt;
-       for (kidsIt = PageTree.Kids.begin(); kidsIt != PageTree.Kids.end(); 
++kidsIt)
-               PutDoc(Pdf::toPdf(kidsIt.value())+" 0 R ");
+       for (int i = 0; i < PageTree.Kids.count(); ++i)
+       {
+               PdfId objId = PageTree.Kids.at(i);
+               PutDoc(Pdf::toPdf(objId) + " 0 R ");
+       }
        PutDoc("]\n");
-       PutDoc("/Count "+Pdf::toPdf(PageTree.Count)+"\n");
+       PutDoc("/Count "+ Pdf::toPdf(PageTree.Kids.count()) + "\n");
        PutDoc("/Resources "+Pdf::toPdf(writer.ResourcesObj)+" 0 R\n");
        PutDoc(">>");
        writer.endObj(writer.PagesObj);
@@ -11059,8 +11060,8 @@
                QList<PdfDest>::Iterator vt;
                for (vt = NamedDest.begin(); vt != NamedDest.end(); ++vt)
                {
-                       if (PageTree.Kids.contains(vt->PageNr))
-                               PutDoc(Pdf::toName(vt->Name) + " [" + 
Pdf::toObjRef(PageTree.Kids[vt->PageNr])
+                       if (PageTree.KidsMap.contains(vt->PageNr))
+                               PutDoc(Pdf::toName(vt->Name) + " [" + 
Pdf::toObjRef(PageTree.KidsMap[vt->PageNr])
                                       + " /XYZ " + 
Pdf::toPdfDocEncoding(vt->Act) + "]\n");
                }
        }
@@ -11165,12 +11166,12 @@
                        bd.Parent = currentThreadObj;
                        while (tel->nextInChain() != 0)
                        {
-                               if ((tel->OwnPage != -1) && 
PageTree.Kids.contains(tel->OwnPage))
+                               if ((tel->OwnPage != -1) && 
PageTree.KidsMap.contains(tel->OwnPage))
                                {
                                        bd.Next = ccb + 1;
                                        bd.Prev = ccb - 1;
                                        ccb++;
-                                       bd.Page = PageTree.Kids[tel->OwnPage];
+                                       bd.Page = 
PageTree.KidsMap[tel->OwnPage];
                                        bd.Rect = 
QRect(static_cast<int>(tel->xPos() - doc.DocPages.at(tel->OwnPage)->xOffset()),
                                                                
static_cast<int>(doc.DocPages.at(tel->OwnPage)->height() - (tel->yPos()  - 
doc.DocPages.at(tel->OwnPage)->yOffset())),
                                                                
static_cast<int>(tel->width()),
@@ -11182,9 +11183,9 @@
                        }
                        bd.Next = ccb + 1;
                        bd.Prev = ccb - 1;
-                       if ((tel->OwnPage != -1) && 
PageTree.Kids.contains(tel->OwnPage))
-                       {
-                               bd.Page = PageTree.Kids[tel->OwnPage];
+                       if ((tel->OwnPage != -1) && 
PageTree.KidsMap.contains(tel->OwnPage))
+                       {
+                               bd.Page = PageTree.KidsMap[tel->OwnPage];
                                bd.Rect = QRect(static_cast<int>(tel->xPos() - 
doc.DocPages.at(tel->OwnPage)->xOffset()),
                                                        
static_cast<int>(doc.DocPages.at(tel->OwnPage)->height() - (tel->yPos()  - 
doc.DocPages.at(tel->OwnPage)->yOffset())),
                                                        
static_cast<int>(tel->width()),

Modified: trunk/Scribus/scribus/pdflib_core.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22434&path=/trunk/Scribus/scribus/pdflib_core.h
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.h (original)
+++ trunk/Scribus/scribus/pdflib_core.h Wed Mar 14 22:03:14 2018
@@ -118,7 +118,7 @@
        void PDF_Begin_Layers();
        
        void PDF_Begin_Page(const ScPage* pag, QPixmap pm);
-       void PDF_End_Page(int physPage);
+       void PDF_End_Page();
        bool PDF_TemplatePage(const ScPage* pag, bool clip = false);
        bool PDF_ProcessPage(const ScPage* pag, uint PNr, bool clip = false);
        bool PDF_ProcessMasterElements(const ScLayer& layer, const ScPage* 
page, uint PNr);

Modified: trunk/Scribus/scribus/pdfstructs.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22434&path=/trunk/Scribus/scribus/pdfstructs.h
==============================================================================
--- trunk/Scribus/scribus/pdfstructs.h  (original)
+++ trunk/Scribus/scribus/pdfstructs.h  Wed Mar 14 22:03:14 2018
@@ -61,8 +61,8 @@
 
 struct PdfPageTree
 {
-    QMap<int, int> Kids;
-    int Count;
+       QList<PdfId> Kids;
+       QMap<int, PdfId> KidsMap;
 };
 
 


_______________________________________________
scribus-commit mailing list
scribus-commit@lists.scribus.net
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to