Author: jghali
Date: Tue Feb 13 22:46:43 2018
New Revision: 22389

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22389
Log:
#15145: Javascript fails to execute on PDF opening when PDF security is enabled

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

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22389&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Tue Feb 13 22:46:43 2018
@@ -1116,7 +1116,8 @@
                        PutDoc("/PageMode /UseOC\n");
        if (!Options.openAction.isEmpty())
        {
-               PutDoc("/OpenAction << /S /JavaScript /JS 
(this."+Pdf::toPdfDocEncoding(Options.openAction)+"\\(\\)) >>\n");
+               writer.OpenActionObj = writer.newObject();
+               PutDoc("/OpenAction << /S /JavaScript /JS " + 
Pdf::toPdf(writer.OpenActionObj) + " 0 R >>\n");
        }
        QDateTime dt = QDateTime::currentDateTimeUtc();
        Datum = Pdf::toDateString(dt);
@@ -1217,28 +1218,6 @@
                PutDoc("/GTS_PDFXVersion (PDF/X-4)\n");
        PutDoc("/Trapped /False\n>>");
        writer.endObj(writer.InfoObj);
-
-       // Encrypt
-       
-//     for (int t = 0; t < 6; ++t)
-//             XRef.append(bytesWritten());
-//     if (((Options.Version == PDFOptions::PDFVersion_15) || (Options.Version 
== PDFOptions::PDFVersion_X4)) && (Options.useLayers))
-//             XRef.append(bytesWritten());
-//     if (PDF_IsPDFX())
-//             XRef.append(bytesWritten());
-//     if (Options.Version == PDFOptions::PDFVersion_X4)
-//             XRef.append(bytesWritten());
-       if (Options.Encrypt)
-       { // now done in writer.setEncrption():
-//             writer.EncryptObj = writer.newObject();
-//             writer.startObj(writer.EncryptObj);
-//             PutDoc("<<\n/Filter /Standard\n");
-//             PutDoc( KeyLen > 5 ? "/R 3\n/V 2\n/Length 128\n" : "/R 2\n/V 
1\n");
-//             PutDoc("/O "+Pdf::toHexString(ok)+"\n");
-//             PutDoc("/U "+Pdf::toHexString(uk)+"\n");
-//             PutDoc("/P "+Pdf::toPdf(Options.Permissions)+"\n>>");
-//             writer.endObj(writer.EncryptObj);
-       }
 }
 
 QMap<QString, QMap<uint, FPointArray> >
@@ -9702,16 +9681,21 @@
 PdfId PDFLibCore::WritePDFStream(const QByteArray& cc)
 {
        PdfId result = writer.newObject();
+       return WritePDFStream(cc, result);
+}
+
+PdfId PDFLibCore::WritePDFStream(const QByteArray& cc, PdfId objId)
+{
        QByteArray tmp(cc);
        if (Options.Compress)
                tmp = CompressArray(tmp);
-       writer.startObj(result);
-       PutDoc("<< /Length "+Pdf::toPdf(tmp.length()));  // moeglicherweise +1
+       writer.startObj(objId);
+       PutDoc("<< /Length " + Pdf::toPdf(tmp.length()));  // moeglicherweise +1
        if (Options.Compress)
                PutDoc("\n/Filter /FlateDecode");
-       PutDoc(" >>\nstream\n"+EncStream(tmp, result)+"\nendstream");
-       writer.endObj(result);
-       return result;
+       PutDoc(" >>\nstream\n" + EncStream(tmp, objId) + "\nendstream");
+       writer.endObj(objId);
+       return objId;
 }
 
 PdfId PDFLibCore::WritePDFString(const QString& cc)
@@ -9730,6 +9714,24 @@
                }
        }
        return WritePDFStream(tmp);
+}
+
+PdfId PDFLibCore::WritePDFString(const QString& cc, PdfId objId)
+{
+       QByteArray tmp;
+       for (int i = 0; i < cc.length(); ++i)
+       {
+               uchar pdfChar = Pdf::toPdfDocEncoding(cc[i]);
+               if ((pdfChar != 0) || cc[i].isNull())
+                       tmp += pdfChar;
+               else
+               {
+                       tmp += "\\u";
+                       tmp += toHex(cc[i].row());
+                       tmp += toHex(cc[i].cell());
+               }
+       }
+       return WritePDFStream(tmp, objId);
 }
 
 void PDFLibCore::PDF_xForm(PdfId objNr, double w, double h, QByteArray im)
@@ -11095,6 +11097,9 @@
 
 void PDFLibCore::PDF_End_JavaScripts()
 {
+       if (writer.OpenActionObj != 0)
+               WritePDFString("this." + Options.openAction + "()", 
writer.OpenActionObj);
+
        if (writer.NamesObj == 0)
                return;
 

Modified: trunk/Scribus/scribus/pdflib_core.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22389&path=/trunk/Scribus/scribus/pdflib_core.h
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.h (original)
+++ trunk/Scribus/scribus/pdflib_core.h Tue Feb 13 22:46:43 2018
@@ -192,7 +192,9 @@
 //     void       StartObj(PdfId nr);
 //     uint       newObject() { return ObjCounter++; }
        uint       WritePDFStream(const QByteArray& cc);
+       uint       WritePDFStream(const QByteArray& cc, PdfId objId);
        uint       WritePDFString(const QString& cc);
+       uint       WritePDFString(const QString& cc, PdfId objId);
        void       writeXObject(uint objNr, QByteArray dictionary, QByteArray 
stream);
        uint       writeObject(QByteArray type, QByteArray dictionary);
        uint       writeGState(QByteArray dictionary) { return 
writeObject("/ExtGState", dictionary); }

Modified: trunk/Scribus/scribus/pdfwriter.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22389&path=/trunk/Scribus/scribus/pdfwriter.cpp
==============================================================================
--- trunk/Scribus/scribus/pdfwriter.cpp (original)
+++ trunk/Scribus/scribus/pdfwriter.cpp Tue Feb 13 22:46:43 2018
@@ -490,6 +490,7 @@
                EncryptObj = 0;
                MetaDataObj = 0;
                ResourcesObj = 0;
+               OpenActionObj = 0;
                
                m_ObjCounter = 0;
                m_CurrentObj = 0;

Modified: trunk/Scribus/scribus/pdfwriter.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22389&path=/trunk/Scribus/scribus/pdfwriter.h
==============================================================================
--- trunk/Scribus/scribus/pdfwriter.h   (original)
+++ trunk/Scribus/scribus/pdfwriter.h   Tue Feb 13 22:46:43 2018
@@ -213,6 +213,7 @@
        PdfId EncryptObj; 
        PdfId MetaDataObj;
        PdfId ResourcesObj;
+       PdfId OpenActionObj;
        
 private:
        PdfId m_ObjCounter;


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

Reply via email to