Sfoglia il codice sorgente

[IMP] windows printing

robert 6 anni fa
parent
commit
cfdb213dd5
9 ha cambiato i file con 167 aggiunte e 11 eliminazioni
  1. 1 0
      .gitignore
  2. 3 0
      app.ini
  3. 75 0
      bin/SumatraPDF-settings.txt
  4. BIN
      bin/SumatraPDF.exe
  5. 2 1
      package.json
  6. 21 3
      src/app/app.vue
  7. 9 5
      src/index.js
  8. 53 2
      src/print.js
  9. 3 0
      src/settings.js

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 node_modules
 out
+*.log

+ 3 - 0
app.ini

@@ -4,3 +4,6 @@ appMode=production
 [server]
 host=127.0.0.1
 port=8070
+
+[print]
+alwaysPdf=true

+ 75 - 0
bin/SumatraPDF-settings.txt

@@ -0,0 +1,75 @@
+# For documentation, see http://www.sumatrapdfreader.org/settings3.2.html
+
+MainWindowBackground = #80fff200
+EscToExit = false
+ReuseInstance = false
+UseSysColors = false
+RestoreSession = true
+
+FixedPageUI [
+	TextColor = #000000
+	BackgroundColor = #ffffff
+	SelectionColor = #f5fc0c
+	WindowMargin = 2 4 2 4
+	PageSpacing = 4 4
+]
+EbookUI [
+	FontName = Georgia
+	FontSize = 12.5
+	TextColor = #5f4b32
+	BackgroundColor = #fbf0d9
+	UseFixedPageUI = false
+]
+ComicBookUI [
+	WindowMargin = 0 0 0 0
+	PageSpacing = 4 4
+	CbxMangaMode = false
+]
+ChmUI [
+	UseFixedPageUI = false
+]
+ExternalViewers [
+]
+ShowMenubar = true
+ReloadModifiedDocuments = true
+FullPathInTitle = false
+ZoomLevels = 8.33 12.5 18 25 33.33 50 66.67 75 100 125 150 200 300 400 600 800 1000 1200 1600 2000 2400 3200 4800 6400
+ZoomIncrement = 0
+
+PrinterDefaults [
+	PrintScale = shrink
+]
+ForwardSearch [
+	HighlightOffset = 0
+	HighlightWidth = 15
+	HighlightColor = #6581ff
+	HighlightPermanent = false
+]
+CustomScreenDPI = 0
+
+RememberStatePerDocument = true
+UiLanguage = es
+ShowToolbar = true
+ShowFavorites = false
+AssociateSilently = false
+CheckForUpdates = true
+RememberOpenedFiles = true
+EnableTeXEnhancements = false
+DefaultDisplayMode = automatic
+DefaultZoom = fit page
+WindowState = 1
+WindowPos = 0 0 0 0
+ShowToc = true
+SidebarDx = 0
+TocDy = 0
+ShowStartPage = true
+UseTabs = true
+
+FileStates [
+]
+SessionData [
+]
+TimeOfLastUpdateCheck = 0 0
+OpenCountWeek = 399
+
+# Settings after this line have not been recognized by the current version

BIN
bin/SumatraPDF.exe


+ 2 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "printers-tray",
   "productName": "PrintersTray",
-  "version": "1.0.4",
+  "version": "1.1.0",
   "description": "Printers Tray",
   "main": "src/index.js",
   "scripts": {
@@ -56,6 +56,7 @@
     "morgan": "^1.9.0",
     "printer": "^0.2.2",
     "socket.io": "^2.1.1",
+    "tmp": "^0.0.33",
     "typeface-roboto": "^0.0.54",
     "uuid": "^3.3.2",
     "vue": "^2.5.16",

+ 21 - 3
src/app/app.vue

@@ -8,6 +8,10 @@
                     <input id="port" type="text" placeholder="Ej.: 8070" :disabled="!edit" v-model.number.lazy="port" required autofocus>
                 </div>
             </div>
+            <!-- <div class="form-item">
+                <input id="pdf-always" type="checkbox" :disabled="!edit" v-model="alwaysPdf">
+                <label for="pdf-always">Siempre imprimir en PDF</label>
+            </div> -->
             <div class="form-item">
                 <button type="submit" @click.self.prevent="handleForm">{{ edit ? 'Guardar' : 'Editar' }}</button>
             </div>
@@ -44,7 +48,11 @@
                 if (this.edit) {
                     this.toggleLoading()
 
-                    ipcRenderer.sendSync('save-port', this.value)
+                    ipcRenderer.sendSync('save-data', {
+                        port: this.value,
+                        alwaysPdf: this.alwaysPdf
+                    })
+
                     ipcRenderer.send('restart-server')
                 }
 
@@ -52,7 +60,11 @@
             },
             readSyncPort() {
                 this.toggleLoading()
-                this.value = ipcRenderer.sendSync('read-port')
+
+                const data = ipcRenderer.sendSync('read-data')
+                this.value = data.port
+                this.alwaysPdf = data.alwaysPdf
+
                 this.toggleLoading()
             },
             handleServerRestarted() {
@@ -70,6 +82,7 @@
                 edit: false,
                 buttonText: 'Editar',
                 value: 8070,
+                alwaysPdf: true,
                 isLoading: false
             }
         },
@@ -138,7 +151,7 @@
         padding: 0 12px;
     }
 
-    .app .form-item .input-group input {
+    .app .form-item .input-group input[type="text"] {
         position: relative;
         display: table-cell;
         width: 90%;
@@ -152,6 +165,11 @@
         color: #424242;
     }
 
+    .app .form-item label[for="pdf-always"] {
+        font-size: 11pt;
+        color: #fff;
+    }
+
     .app .form-item button {
         width: 100%;
         height: 35px;

+ 9 - 5
src/index.js

@@ -144,17 +144,21 @@ app.on('ready', async () => {
     await createServer()
 });
 
-ipcMain.on('read-port', e => {
+ipcMain.on('read-data', e => {
     settings = readSettings()
-    e.returnValue = settings.server.port
+    e.returnValue = {
+        port: settings.server.port,
+        alwaysPdf: settings.print.alwaysPdf
+    }
 })
 
-ipcMain.on('save-port', (e, port) => {
-    settings.server.port = port
+ipcMain.on('save-data', (e, data) => {
+    settings.server.port = data.port
+    settings.print.alwaysPdf = data.alwaysPdf
 
     writeSettings(settings)
     
-    e.returnValue = port
+    e.returnValue = data
 })
 
 ipcMain.on('restart-server', async e => {

+ 53 - 2
src/print.js

@@ -1,11 +1,24 @@
+import { app } from 'electron'
+import { writeFileSync, unlinkSync } from 'fs'
+import { spawnSync } from 'child_process'
+import Path from 'path'
+import { dirSync } from 'tmp'
 import UUID from 'uuid/v4'
-import { printDirect, getPrinters, getDefaultPrinterName, getJob, getSupportedPrintFormats } from 'printer'
+import { 
+    printDirect, 
+    getPrinters, 
+    getDefaultPrinterName, 
+    getJob, 
+    getSupportedPrintFormats
+} from 'printer'
+import { readSettings } from './settings'
 
 const REQUEST_PRINTER_NAME = 'request_printer_name'
 const SHOW_PRINT_STATUS = 'show_print_status'
 const DOWNLOAD_DATA = 'download_data'
 
 const printQueue = []
+const settings = readSettings()
 
 /**
  * 
@@ -56,6 +69,29 @@ const getFormat = mimeType => {
     return 'RAW'
 }
 
+/**
+ * 
+ */
+const redirectToSpawn = (buffer, printer) => {
+    const fileId = UUID()
+    const tmpDir = dirSync()
+    const tmpPath = Path.join(tmpDir.name, `${fileId}.pdf`)
+
+    writeFileSync(tmpPath, buffer)
+
+    const execBin = Path.join(app.getAppPath(), 'bin', 'SumatraPDF.exe');
+
+    spawnSync(execBin, [
+        '-print-to',
+        printer,
+        '-silent',
+        tmpPath
+    ])
+
+    unlinkSync(tmpPath)
+    tmpDir.removeCallback()
+}
+
 /**
  * 
  * @param {*} socket 
@@ -104,8 +140,12 @@ const doPrint = (socket, request) => {
     }
 
     let format = getFormat(mimeTypeRegex[0])
+    let supportedFormats = getSupportedPrintFormats(request.printer)
 
-    const supportedFormats = getSupportedPrintFormats(request.printer)
+    if (settings.print.alwaysPdf) {
+        format = 'PDF'
+        supportedFormats.push('PDF')
+    }
 
     if (!supportedFormats.includes(format)) {
         socket.emit(SHOW_PRINT_STATUS, {
@@ -122,6 +162,17 @@ const doPrint = (socket, request) => {
 
     let buffer = Buffer.from(data, 'base64')
 
+    if (process.platform == 'win32') {
+        redirectToSpawn(buffer, request.printer)
+        
+        socket.emit(SHOW_PRINT_STATUS, {
+            status: 'printing',
+            printer: request.printer
+        })
+
+        return
+    }
+
     printDirect({
         data: buffer,
         printer: request.printer,

+ 3 - 0
src/settings.js

@@ -14,6 +14,9 @@ const createSettings = () => {
         server: {
             host: '127.0.0.1',
             port: '8070'
+        },
+        print: {
+            alwaysPdf: false
         }
     }