2017-05-04 3 views
2

J'ai trouvé l'extrait de code suivant qui fonctionne comme mes attentes, mais le problème est que, lorsqu'un fichier PDF est ouvert et l'utilisateur imprime le fichier PDF avec une autre imprimante du lecteur PDF et non fermer le lecteur PDF et encore imprimer le fichier PDF à partir de mon application, il imprimera avec l'imprimante qui est configurée sur le lecteur PDF pas l'imprimante que j'ai définie comme pour imprimer le fichier PDF.Impression d'un fichier PDF à partir de Qt

Exemple:

  1. Sur demande, je mis Printer_1 à imprimer le fichier PDF.
  2. Imprimez le fichier (il ouvrira le fichier dans le lecteur de PDF et imprime avec l'imprimante Printer_1).
  3. Sur le lecteur PDF, je vais au CTRL + P pour imprimer et là, je sélectionne Imprimante_2 et cliquez sur imprimer.
  4. Je ne ferme pas le lecteur PDF et de nouveau sur l'application (imprimante est sélectionnée pour Printer_1), j'imprime le fichier PDF. La commande d'impression est maintenant envoyée à Printer_2 au lieu de Printer_1.

S'il vous plaît quel est le problème dans l'extrait de code suivant?

#include <QSettings> 
#include <QProcess> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    const QString classesRoot = "HKEY_CLASSES_ROOT"; 

    // get ID of .pdf extension 
    QSettings pdfSettings(classesRoot + "\\.pdf", QSettings::NativeFormat); 
    QString pdfId = pdfSettings.value("Default").toString(); 

    // get path to default program that associated with PDF files 
    QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString(); 
    QString openPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\open\\command", QSettings::NativeFormat).value("Default").toString(); 
    qDebug() << "print path" << printPath; 
    qDebug() << "open path" << openPath; 

    // open .pdf file 
    QProcess::startDetached(openPath.arg("full path to pdf file.pdf")); 

    // print .pdf file 
    QProcess printProcess; 
    printProcess.start(printPath.arg("full path to pdf file.pdf")); 
    printProcess.waitForFinished(-1); 

    return 0; 
} 

Répondre

0

Je suis désolé mais je disais que cela semble raisonnable d'être le comportement attendu: si l'application est déjà ouvert et il est conçu pour ne pas ouvrir des instances distinctes pour le même fichier (autant de téléspectateurs font et comme le fait le vôtre), il est hautement probable que les paramètres actuels (dans votre cas, l'imprimante actuelle) sont également conservés, puisque, fondamentalement, rien n'a changé. Si vous reproduisez vos étapes mais remplacez votre programme par votre propre ouverture manuelle du fichier PDF, je suis assez confiant que vous verrez les mêmes résultats.

Une option serait d'éviter d'ouvrir une visionneuse externe et de charger directement le fichier PDF (actuellement en utilisant une bibliothèque tierce, telle que Poppler) et de l'imprimer en utilisant les modules de Qt. Vous pouvez vérifier this answer pour plus d'informations à ce sujet.

0

au lieu de la ligne

QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString(); 

Utilisez cette page et tous les travaux comme prévu:

QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\printto\\command", QSettings::NativeFormat).value("Default").toString(); 

Dépasser "nom de fichier", "nom de l'imprimante", "pilote d'imprimante" et "port" [conducteur le nom et le port ne sont pas obligatoires]