pypdf делает то, что я ожидаю в этой области. Используя следующий сценарий:
#!/usr/bin/python
#
from pyPdf import PdfFileWriter, PdfFileReader
with open("in.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
print "document has %s pages." % numPages
for i in range(numPages):
page = input1.getPage(i)
print page.mediaBox.getUpperRight_x(), page.mediaBox.getUpperRight_y()
page.trimBox.lowerLeft = (25, 25)
page.trimBox.upperRight = (225, 225)
page.cropBox.lowerLeft = (50, 50)
page.cropBox.upperRight = (200, 200)
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
получающийся документ имеет поле для обрезки, которое является 200x200, указывает и запускается в 25,25 точках в поле медиа. Поле обрезки является 25 точками в поле для обрезки.
Вот то, как мой демонстрационный документ смотрит в профессионале акробата после обработки с вышеупомянутым кодом:
Этот документ появится пробел, когда загружено в Acrobat Reader.
Кажется, у PEAR :: Cache_Lite есть какая-то защита для решения проблем параллелизма.
Если вы посмотрите руководство конструктора Cache_Lite :: Cache_Lite
, у вас есть следующие варианты:
fileLocking включить / отключить блокировку файлов. Можно избежать повреждения кеша при плохих обстоятельства.
writeControl включить / выключить контроль записи. Включить контроль записи будет немного медленнее запись в кеш, но не кеш чтение. Контроль записи может обнаружить некоторые поврежденные файлы кеша, но, возможно, это не так идеальный контроль.
readControl включить / выключить контроль чтения. Если включено, контрольный ключ встроен в кеш-файл и этот ключ сравнивается с рассчитанным после чтение
readControlType Тип контроля чтения (только если включен контроль чтения). Должен быть md5 (для хеш-контроля md5 (лучше, но самый медленный)), 'crc32' (для хеша crc32 контроль (немного менее безопасный, но быстрее)) или strlen (для длины only test (самый быстрый))
Какой из них использовать, все еще зависит от вас и будет зависеть от того, какой производительностью вы готовы пожертвовать, а также от риска параллельного доступа, который, вероятно, существует в вашем приложении.
Вы также можете взглянуть на Zend_Cache_Frontend_Output
, чтобы кэшировать страницу, используя что-то вроде Zend_Cache_Backend_File
в качестве бэкэнда.
Кажется, что он также поддерживает некоторую безопасность - - то же самое, что Cache_Lite
уже дал вам (так что я не буду копировать и вставлять второй раз)
В качестве примечания, если ваш веб-сайт работает на общем хосте, я предположим, у него не так много пользователей? Так что риски одновременного доступа, вероятно, не так высоки, не так ли?
В любом случае,
Вы можете кэшировать страницы в базе данных, просто создайте простую таблицу «имя, значение» и сохраните кешированные страницы на нем.
Предполагая, что файловая система с журналированием (большинство файловых систем Linux и NTFS) - тогда файл не должен рассматриваться как "созданный", пока процесс закрывает файл. Он должен отображаться как несуществующий файл!
Нет, он виден сразу после создания, вам нужно заблокировать его. Однако переименование атомарно. Таким образом, вы можете open (), write (), close (), rename (), но это не предотвратит повторное создание одного и того же элемента кэша дважды за одно и то же время.
Кэшированный файл был удален, потому что он устарел . Приходит запрос на этот файл, и файл находится в процессе воссоздания. Во время этого поступает еще один запрос на файл.
Если он не заблокирован, будет обработан полузаполненный файл, или два процесса будут пытаться регенерировать один и тот же файл одновременно, давая "интересные" результаты.
Я бы хотел изменить один из существующих кешей. Кеш Zend Framework должен помочь. Если нет, я бы его изменил.
Вы можете создать действительно примитивную стратегию блокировки. База данных может использоваться для отслеживания всех кэшированных элементов, разрешения блокировки для обновления, предоставления людям возможности ждать завершения чьего-либо обновления, ...
Это решит ваши проблемы с ACID. Вы можете установить блокировку для чьего-либо обновления на очень короткий период или, возможно, полностью пропустить кэш для этого двустороннего цикла, в зависимости от нагрузки / емкости вашего сервера и стоимости создания кэшированного содержимого.
Джейкоб