LINUX.ORG.RU

печать определённой страницы из множества документов

 , ,


2

2

Приветствую, комрады! Появилась сегодня одна проблемка - начальство дало указание напечатать вторые страницы из файлов docx - но этих файлов - около 3000! Даже в либре последовательно открывать и нажимать print не вариант. Думаю как решить проблему - первый вариант - конвертить в pdf (опять же засада, насколько правильно сконвертится), выдирать вторые страницы, объединять в один или несколько файлов и посылать на печать. Или воспользоваться какой-то утилитой/библиотекой как Apache POI - Java API for Microsoft Documents - даже не знаю, есть ли возможность у неё напрямую делать выборку и печатать. Языков программирования не разумею, даже bash в зачаточном состоянии (простенькие скрипты на несколько строк, без сложных манипуляций данными).

★★

Последнее исправление: beastie (всего исправлений: 1)

Microsoft Word + vbs или макрос, word.application + FileSystemObject, пишется за 5 минут. Готово.

И не надо говорить, что «офтоп», нужно использовать подходящие инструменты для каждой конкретной ситуации.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

Apache POI это не утилита, а именно java-библиотека, просто так ее нельзя взять и использовать (без написания кода)

Самый простой путь - конвертить в pdf.

alchemist
()
Последнее исправление: alchemist (всего исправлений: 1)

Я бы взял программку, управляющую мышью и клавиатурой и написал бы простой макрос, который в цикле открывал бы по очереди документы, открывал бы диалог печати, выставлял нужные опции и слал бы документ на печать.

Legioner ★★★★★
()

unoconv + pdfseparate завернуть в bash, соль и сахар по вкусу.
pdfmerge можно присовокупить для особого эстетства

novitchok ★★★★★
()
Последнее исправление: novitchok (всего исправлений: 1)
Ответ на: комментарий от kostik87

А что через API нельзя? Зачем извращаться через графический интерфейс?

Я не знаю API и не собираюсь учить ради одной задачи. Если каждый день такие задачи ставят — другое дело.

Legioner ★★★★★
()

ставишь cups-pdf, настраиваешь pdf принтер (Virtual_PDF_Printer)

mkdir print
lpoptions -p Virtual_PDF_Printer/2 -o page-ranges=2
ls *.docx | xargs -n 1 libreoffice --headless --print-to-file --printer-name Virtual_PDF_Printer --outdir print
cd print
lpr -P Virtual_PDF_Printer/2 *
Ищешь в домашней директории (в общем, зависит от настроек cups-pdf) свой pdf файл со вторыми страницами.

arson ★★★★★
()
Ответ на: комментарий от kostik87

наш виндоадмин так и сделал - работает в wine очень шустро - но комп в это время неюзабелен из-за бешено окрывающихся и закрывающихся окон

vspider ★★
() автор топика
Ответ на: комментарий от Legioner

жесть, даже я до такого не дошёл

vspider ★★
() автор топика
Ответ на: комментарий от arson

спасибо, изящное решение! Я сам дошёл только до

 libreoffice --convert-to pdf:writer_pdf_Export *.docx
+
#!/bin/sh
# remove first page
for fname in *.pdf; do echo $fname; pdfjam -o "out/$fname" "$fname" 2-; done

потом собираем pdf в один файл PDF Chain (я даже не стал заморачиваться со скриптом - гуй Chain прост и легковесен) - выбрал в диалоге все файлы ^A и сохранил в выходной файл, позже открыл в pdf-просмотрщике по вкусу (у меня быстрее всего отображает и печатает Adobe 9 reader) и отправили на печать. Единственный косяк - libreoffice не запускал конверсию при открытых графических своих экземплярах и обрабатывал только половину файлов из папки - около 300 штук за раз, при перемещении обработанных исходников docx и повторном запуске докушивал всё оставшееся.

vspider ★★
() автор топика
Ответ на: комментарий от vspider

изящное решение

Изящным оно было бы, если бы не было промежуточных pdf файлов.
Но, к сожалению, libreoffice при печати не смотрит на опции lpr.

arson ★★★★★
()
Ответ на: комментарий от vspider

Ну так вы ему скажите, что бы он предварительно сделал

objword.visible=false
а потом пусть открывает документ, отправляет на печать, закрывает документ и открывает следующий.

Все требуемое можно сделать вообще без графического интерфейса и какого-либо взаимодействия пользователя, в том числе и не требуется нажимать какие-либо кнопки в диалогах. Достаточно только почитать документацию, MSDN и всё.

Как бы, инструменты нужно использовать правильно и если ваш админ не умеет их использовать, то это не значит что инструменты плохие.

Так что вперёд тыкать его носом.

kostik87 ★★★★★
()
Ответ на: комментарий от vspider

И ты дашь гарантию, что сконвертированные таким образом документы выглядят именно так, как должны? Сомневаюсь.

kostik87 ★★★★★
()
Ответ на: комментарий от arson

libreoffice при печати не смотрит на опции lpr

Заставить уважать lpr удалось по такому рецепту.
Единственное, пятерка DisableCUPS=true не понимает, зато понимает переменную окружения SAL_DISABLE_CUPS.

В общем, не стоит оно того.
Время обработки не уменьшается, а если начальство потом захочет третьи страницы...

arson ★★★★★
()
Ответ на: комментарий от kostik87
Sub PrintWhithoutFirstPages()
    Dim sFileNames As Variant
    Dim i As Integer
    Dim nPagesCount As Long



    'Получение путей выбранных файлов
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Выберите файлы для печати"
        .Filters.Clear
        .Filters.Add "Все документы", "*.doc;*.docx"
        .AllowMultiSelect = True
        If .Show Then
            ReDim sFileNames(.SelectedItems.Count - 1)
            For i = 1 To .SelectedItems.Count
                Debug.Print .SelectedItems(i)
                sFileNames(i - 1) = .SelectedItems(i)
            Next i
        Else: Exit Sub
        End If
    End With
    'Печать первой страницы
    For i = 0 To UBound(sFileNames)
        With Documents.Open(sFileNames(i), AddToRecentFiles:=False, ReadOnly:=True)
            nPagesCount = .Range.ComputeStatistics(wdStatisticPages)
            .PrintOut Background:=False, Range:=wdPrintRangeOfPages, Pages:="2-" & Str(nPagesCount)
            .Close False
        End With
    Next i
End Sub

Вот такой вот говнокод на VBS выцепил у нашего виндоадмина

vspider ★★
() автор топика
Ответ на: комментарий от vspider

Это кусок из макроса, выполняемого прямо в ms word, добавь перед циклом For строку:

Application.Visible=False
а в конце true, что бы было вот так:
    Application.Visible=False
    For i = 0 To UBound(sFileNames)
        With Documents.Open(sFileNames(i), AddToRecentFiles:=False, ReadOnly:=True)
            nPagesCount = .Range.ComputeStatistics(wdStatisticPages)
            .PrintOut Background:=False, Range:=wdPrintRangeOfPages, Pages:="2-" & Str(nPagesCount)
            .Close False
        End With
    Next i
    Application.Visible=True

kostik87 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.