Если вы можете печатать один раз, вы можете печатать бесконечное количество раз.
Рассмотрим сетевой принтер: необработанные данные, которые будут напечатаны, должны быть отправлены на удаленное встроенное устройство, которое ваша программа не сможет ограничить, даже если она каким-то образом предполагает владение всей машиной пользователя (что уже будет считаться крайне оскорбительным). см. скандал с руткитом Sony, чтобы узнать реакцию, которую можно ожидать).
Как вы могли бы сказать, что устройство, с которым разговаривает компьютер пользователя, - это настоящий HP LaserJet, а не то, что притворяется единым (или, что еще проще, притворяется удаленным спулером), но которое сохраняет необработанный PCL / PS / что угодно? вместо печати? Поскольку эти данные - это все, что нужно для печати задания, достаточно просто воспроизвести его несколько раз на реальном принтере, чтобы получить несколько копий. Вы также можете использовать сниффер (как упоминалось в @dlamblin) и избавить вас от необходимости эмулировать принтер.
Можно подумать о запрете сетевых принтеров, но наличие в офисе только сетевых принтеров (не простых принтеров, подключенных к ПК общего назначения, но крупных принтеров, подключенных непосредственно к коммутатору Ethernet), не является чем-то необычным. Из-за этого несколько ваших пользователей (сколько будет сильно зависеть от целевой демографии) не смогут печатать, что не является хорошим пиаром.
И даже USB не застрахован (хотя для этого потребуются дополнительные технические знания и, возможно, специальное оборудование); существуют USB-снифферы. И даже без них вполне достаточно «драйвера гаджета» для usb-принтера на встроенном устройстве Linux (однако обратите внимание, что на момент написания этой статьи я не знал ни одного драйвера гаджета для usb-принтера для Linux).
Все это при условии, что программе каким-то образом удалось получить полный контроль над машиной пользователя. Как показывают несколько неудачных попыток защиты от копирования, это легче сказать, чем сделать. Как вы можете знать, что используемый вами драйвер принтера - это просто необычная версия драйвера принтера для популярной марки принтеров, а не взломанная версия для сохранения потока на диск? Как узнать, что где-то в стеке печати нет драйвера, регистрирующего все транзакции USB на диск? И как вы можете отличить обычного пользователя виртуальных машин от того, кто использует их для перехвата связи с USB-устройствами?
Все, что сказал, вам не нужно идти так далеко. Большинство людей, даже если у них есть технические ноу-хау, не будут пытаться обойти даже самые слабые попытки предотвратить повторную печать, которую вы делаете. На самом деле, я бы не удивился, если бы большинство пользователей добровольно не печатали более одного раза, если сказали, что файл должен быть напечатан только один раз (но тогда было бы больше случаев, когда люди случайно печатали дважды). Итак, создайте простую программу, которая печатает один раз, а затем стирает исходные данные. Предупредите пользователя, что данные будут удалены после однократной печати. И примите к сведению, что некоторые люди будут печатать больше раз, чем вы разрешали, и что некоторые люди будут печатать меньше раз, чем вы позволяли (сбои питания, неисправные принтеры, неправильно настроенные системы или страшное письмо о загрузке ПК).может привести к сбою печати). Будьте готовы к этому.
Для людей, которые печатают больше раз, чем разрешено, просто примите убытки, точно так же, как физический магазин должен признать, что часть его запаса будет случайно повреждена или потеряна каким-либо образом. Иметь какой-то способ найти самых крупных злоумышленников и разобраться с ними (правовая система, кажется, является популярным выбором).
Для людей, которые печатают меньше раз, чем это разрешено, вариант поддержки по телефону, где пользователь может запросить новую копию, был бы вариантом (это работает для Microsoft, верно?). Конечно, некоторые люди будут злоупотреблять этим, но смотрите предыдущий абзац.