Добавить символы в Word вложение перед печатью

K

klendathu

Добрый день.
При отправке .docx вложения на печать, нужно добавить знаки по бокам документа(наподобие водяного знака).
Подскажите, как это можно реализовать и возможно ли?
Во вложении пример.
Спасибо
 

Вложения

  • Пример.jpg
    Пример.jpg
    59,9 КБ · Просмотры: 617

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
Добрый день.
При отправке .docx вложения на печать, нужно добавить знаки по бокам документа(наподобие водяного знака).
Подскажите, как это можно реализовать и возможно ли?
Во вложении пример.
Спасибо
что значит "при отправке"?
если на уровне GDI и принтерного контекста - вопрос не по адресу
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
конечно можно, в процессе формирования дока наложить на него водяные знаки, а потом уже хоть на печать, хоть на почту
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
конечно можно, в процессе формирования дока наложить на него водяные знаки, а потом уже хоть на печать, хоть на почту
водяные знаки так накладываются (как на картинке ТС)?
 
K

klendathu

что значит "при отправке"?
если на уровне GDI и принтерного контекста - вопрос не по адре
В документе NotesDocument есть поля с вложениями(формата docx, pdf, tiff).
Нужно сделать action, который будет накладывать определенную информацию из документа по его боковым краям("боковые колонтитулы"), и печатать. Вложения при этом не менять.

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

Спасибо всем.
 

Marlen

Green Team
11.03.2017
122
69
BIT
0
самый простой способ, напечатать сперва знаки какие нужны, а потом загрузить бумагу в лоток и печатать поверх с ворда.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
Нужно сделать action, который будет накладывать определенную информацию из документа по его боковым краям("боковые колонтитулы"), и печатать.
накладывать можно все что угодно и куда угодно...
непонятно - что хотите вы, без конкретики обсуждать нечего
Сформировать вордятину, например, через https://github.com/opensagres/xdocreport/wiki/DocxReporting
это работа с шаблонами и подстановкой, если умудритесь сделать вертикальный текст, как на ваших картинках - его можно сделать шаблоном
по ссылке есть и наложение изображений
еще есть
основным будут ваши компетенции
с xdocreport делал заполнение шаблона из домины, сложного ничего (если знать java)
здесь же выкладывал простую замену через POI...
 
  • Нравится
Реакции: Vertigo
K

klendathu

Добрый день.
Решил использовать библиотеку itextPDF.
Скачал библиотеку [URL='https://github.com/itext/itextpdf/releases/download/5.5.12/itext5-5.5.12.zip']itext5-5.5.12.zip отсюда - https://github.com/itext/itextpdf/releases/tag/5.5.12, создал скриптовую библиотеку Java на её основе.
[/URL]
Теперь, при любой попытке обратится к классам itextPDF получаю такую ошибку(во вложении).
Сам Java код я вызываю из агента на Lotusscript:

Декларации:
UseLSX "*javacon"
Use "WatermarkPDF"


Класс для работы с Java кодом:
Public Class AddRotatedTemplate
Private javaClass As JavaClass
Private javaObject As JavaObject
Private javaSession As JavaSession
Public Sub New()
'On Error GoTo errorhandler
Set javaSession = New JavaSession()
Set javaClass = javaSession.GetClass("AddRotatedTemplate")
Set javaObject = javaClass.CreateObject
End Sub

Public Sub PrintDoc(FileName As String)
Call javaObject.manipulatePdf(FileName)
End Sub
End Class


Вызов метода Java кода:
toPdf.PrintDoc(FileNamePDF)


Скриптовая библиотека на Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;


public class AddRotatedTemplate{
private String dir;
public AddRotatedTemplate(){
dir = System.getProperty("java.io.tmpdir");
}

public void manipulatePdf(String filename) throws IOException, DocumentException {
filename = "1.pdf";
String SRC = dir + filename;
String DEST = dir + "new_" + filename;

File file = new File(DEST);
file.getParentFile().mkdirs();

PdfReader reader = new PdfReader(SRC);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));
PdfContentByte under = stamper.getUnderContent(1);
Font f = new Font(FontFamily.HELVETICA, 15);
Phrase p = new Phrase("This watermark is added UNDER the existing content", f);
ColumnText.showTextAligned(under, Element.ALIGN_CENTER, p, 297, 550, 0);
PdfContentByte over = stamper.getOverContent(1);
p = new Phrase("This watermark is added ON TOP OF the existing content", f);
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 500, 0);
p = new Phrase("This TRANSPARENT watermark is added ON TOP OF the existing content", f);
over.saveState();
PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.5f);
over.setGState(gs1);
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 450, 0);
over.restoreState();
stamper.close();
reader.close();
}
}


Уже пытался подставлять библиотеку itextpdf-5.5.12-sources.jar отсюда - http://central.maven.org/maven2/com/itextpdf/itextpdf/5.5.12/.

В интернетах пишут, что это ошибка возникает вследствие того, что нехватает lng файла для ошибок, шрифта Helvetica и т.д., но в библиотеке они есть.
Я думаю, может что-то не так с JVM? Или настройкой проекта?
Версия Lotus - 8.5.3.
На 9-ке тоже не работает.
https://github.com/itext/itextpdf/releases/download/5.5.12/itext5-5.5.12.zip
https://github.com/itext/itextpdf/releases/download/5.5.12/itext5-5.5.12.zip
[doublepost=1512735518,1512732918][/doublepost]В общем, эта ошибка вылетает при первом же обращении к классам itextPDF, то есть начиная со строки:
Font f = new Font(FontFamily.HELVETICA, 15);

Как фиксить?
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    6,3 КБ · Просмотры: 375

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
@klendathu разговор начинался с ворда ;) ...
я давно не работал с itext, помню - надо было конфиги для него гондыбать, с подгрузкой шрифтов (для FOP - тоже)
может сюда почитать
и еще вопрос - где itext лежит?
 
K

klendathu

@klendathu разговор начинался с ворда ;) ...
и еще вопрос - где itext лежит?
Да, я решил word файлы парсить в pdf и то же использовать itext.
Насчет того, где лежит itext не совсем понял) Импортнул его в скриптовую библиотеку

Из ветки стаковерфлоу что Вы скинули все перепробовал, ничего не меняется.
Может, JVM обновить? Как это сделать?
[doublepost=1512740596,1512737543][/doublepost]Разобрался - импортировал .javadoc файлы.
Теперь наконец-то вижу ошибку:
java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:4138)
at java.util.Arrays.copyOf(Arrays.java:3870)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:119)
at lotus.domino.ClassHashtable.explodeArchive(Unknown Source)
at lotus.domino.ClassHashtable.addAttachment(Unknown Source)
at lotus.domino.JavaConnectLoader.addAttachment(Unknown Sourc

Что-то с JRE?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:4138)
правим notes.ini
типа JavaMaxHeapSize=512mb (если памяти 4+Гб)
[doublepost=1512744329,1512743848][/doublepost]@klendathu спрошу еще раз - где лежит либа?
нужно класть в <NotesProgrammDirectory>/jvm/lib/ext
 
  • Нравится
Реакции: klendathu
K

klendathu

Спасибо, оказалось, что ОЗУ не хватало.
Разобрался с PDF, вот код, если кому понадобится тоже:

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class AddRotatedTemplate{
private String dir;

public AddRotatedTemplate(){
dir = System.getProperty("java.io.tmpdir");
}

public void initProcessPdf(String filename, String p1, String p2, String p3, String p4){
try {
processPdf(filename,p1, p2, p3, p4);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}

public void processPdf(String filename, String p1, String p2, String p3, String p4) throws IOException, DocumentException {
String src = dir + filename;
String dest = dir + "signPrint.pdf";
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PdfContentByte canvas;
Rectangle pageSize;
float x, y, z;
pageSize = reader.getPageSizeWithRotation(1);
// left&right of the page
x = pageSize.getLeft();
z = pageSize.getRight();
// middle of the height
y = (pageSize.getTop() + pageSize.getBottom()) / 2;
// getting the canvas covering the existing content
canvas = stamper.getOverContent(1);

BaseFont times = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// adding some lines to the left
ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
new Phrase("ФИО подписывающего: " + p1, new Font(times,8)),
x + 18, y, 90);
ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
new Phrase("Дата создания бумажной копии: " + p2, new Font(times,8)),
x + 34, y, 90);

ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
new Phrase("Результат проверки подписи ЭЦП: " + p3, new Font(times,8)),
z - 18, y, 270);
ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
new Phrase("Система: " + p4, new Font(times,8)),
z - 24, y, 270);
stamper.close();
reader.close();
System.gc();

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + new File(dest));
}

Теперь нужно то же самое сделать с .doc и .docx документами.
У меня есть 2 идеи:
1. переконвертировать в PDF и добавлять уже наработанным путем.
2. использовать библиотеку Apache POI. В нём пока не нашел возможности добавлять водяные знаки повернутые на 90 град., по краям документа. В документации есть только добавление в нижние и верхние колонтитулы
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
В нём пока не нашел возможности добавлять водяные знаки повернутые на 90 град
а в ворде такие есть?
что ОЗУ не хватало
её может не хватать и по причине накопления объектов в памяти, без GC
такой сценарий возможен, при размещении либы в агенте или java либе, поэтому - размещать нужно "где" упомянул выше
для того, чтобы код видел и дизайнер (это после очередного ФП) - еще продублировать и в <тот же путь>/jvm1.6 (вместо jvm)

иначе будут утечеки памяти
[doublepost=1513000755,1513000514][/doublepost]
У меня есть 2 идеи:
у меня есть 3-я ;)
сделать шаблон таблицы, с вертикальным положением текста, в крайних ячейках, среднюю заполнять
есть еще 4-ая - сделать фоновый рисунок страницы, на кот. нужный текст

ссылку уже давал
[doublepost=1513001518][/doublepost]если на чистом POI - простой пример замены некоего шаблона:
Java:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
//http://stackoverflow.com/questions/22268898/replacing-a-text-in-apache-poi-xwpf
public class XWPFUtils {
    public static final Map<String,String> map=new HashMap<String, String>();
    public static final List<String> tags=new ArrayList<String>();
    public String[] getStringArray(int cnt) {
        List<String> arr= new ArrayList<String>(Collections.nCopies(cnt, ""));
        return (String[]) arr.toArray(new String[] {});
//        return new String[cnt];
    }
    public static void clear() {
        map.clear();
    }
    public static String add(String key, String value) {
        return map.put(key,value);
    }
    public String[] getTags(String fnameIN, String ptn) {
        XWPFDocument doc=null;
        FileInputStream fis=null;
        tags.clear();
        Pattern pattern=Pattern.compile(ptn);
        try {
            fis=new FileInputStream(fnameIN);
            doc = new XWPFDocument(OPCPackage.open(fis));
        } catch (InvalidFormatException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        for (XWPFParagraph p : doc.getParagraphs()) {
            List<XWPFRun> runs = p.getRuns();
            if (runs != null) {
                for (XWPFRun r : runs) {
                    String s=paragraphMatch(r,pattern);
                    if (s!=null) {tags.add(s);}
                }
            }
            for (XWPFTable tbl : doc.getTables()) {
                for (XWPFTableRow row : tbl.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        for (XWPFParagraph p1 : cell.getParagraphs()) {
                            for (XWPFRun r : p1.getRuns()) {
                                String s=paragraphMatch(r,pattern);
                                if (s!=null) {tags.add(s);}
                            }
                        }
                    }
                }
            }
        }
        try {
            System.out.println("Closing input doc and stream...");
            if (fis!= null)fis.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return tags.toArray(new String[tags.size()]);
    }
    /**
     * @param fnameIN: file name for source Word doc
     * @param fnameOUT: file name for result Word doc
     * uses map for word replacing
     */
    public void replaceFromArray(String fnameIN, String fnameOUT) {
        XWPFDocument doc=null;
        FileInputStream fis=null;
        try {
            fis=new FileInputStream(fnameIN);
            doc = new XWPFDocument(OPCPackage.open(fis));
        } catch (InvalidFormatException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        for (XWPFParagraph p : doc.getParagraphs()) {
            List<XWPFRun> runs = p.getRuns();
            if (runs != null) {
                for (XWPFRun r : runs) {
                    paragraphReplace(r);
                }
            }
            for (XWPFTable tbl : doc.getTables()) {
                for (XWPFTableRow row : tbl.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        for (XWPFParagraph p1 : cell.getParagraphs()) {
                            for (XWPFRun r : p1.getRuns()) {
                                paragraphReplace(r);
                            }
                        }
                    }
                }
            }
        }
        try {
            doc.write(new FileOutputStream(fnameOUT));
            System.out.println("Done");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try {
                System.out.println("Closing input doc and stream...");
                //if (doc!=null)doc.close();
                if (fis!= null)fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public void replaceFromArray(String []arrFrom, String[] arrTo, String fnameIN, String fnameOUT) {
        XWPFDocument doc=null;
        FileInputStream fis=null;
        try {
            fis=new FileInputStream(fnameIN);
            doc = new XWPFDocument(OPCPackage.open(fis));
        } catch (InvalidFormatException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        for (XWPFParagraph p : doc.getParagraphs()) {
            List<XWPFRun> runs = p.getRuns();
            if (runs != null) {
                for (XWPFRun r : runs) {
                    paragraphReplace(arrFrom,arrTo,r);
                }
            }
            for (XWPFTable tbl : doc.getTables()) {
                for (XWPFTableRow row : tbl.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        for (XWPFParagraph p1 : cell.getParagraphs()) {
                            for (XWPFRun r : p1.getRuns()) {
                                paragraphReplace(arrFrom,arrTo,r);
                            }
                        }
                    }
                }
            }
        }
        try {
            doc.write(new FileOutputStream(fnameOUT));
            System.out.println("Done");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try {
                System.out.println("Closing input doc and stream...");
                //if (doc!=null)doc.close();
                if (fis!= null)fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            /*                if (pkg!=null)
                try {
                    pkg.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             */            }

    }
    private String paragraphMatch(XWPFRun r, Pattern pattern) {
        String text = r.getText(0);
        if (text != null) {
            //Pattern ptn = Pattern.compile(pattern);
            Matcher matcher = pattern.matcher(text);
            if (matcher.find()) {
                System.out.println(matcher.group(0));
                return matcher.group(0);
            }
        }
        return null;
    }

    private void paragraphReplace( String[] arrFrom, String[] arrTo, XWPFRun r) {
        String text = r.getText(0);
        if (text != null) {
            for(int i=0; i<arrFrom.length;i++) {
                if (arrFrom[i].length()>0) {
                    if (text.contains(arrFrom[i])) {
                        text = text.replace(arrFrom[i], arrTo[i]);
                        System.out.println("Replacement:"+arrFrom[i]+"|"+arrTo[i]);
                        r.setText(text, 0);
                    }
                }
            }
        }
    }
    private void paragraphReplace(XWPFRun r) {
        String text = r.getText(0);
        if (text != null) {
            for(Map.Entry<String, String> entry : map.entrySet()) {
                if(entry.getKey().length()>0) {
                    if (text.contains(entry.getKey())) {
                        text=text.replace(entry.getKey(), entry.getValue());
                        System.out.println("Replacement:"+entry.getKey()+"|"+entry.getValue());
                        //r.setBold(true);
                        r.setText(text, 0);
                    }
                }
            }
        }
    }
}
[doublepost=1513001621][/doublepost]LS2J часть
Код:
%REM
*********************************************
    Library XPFUtils.LS2J
    Created Feb 11, 2016 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Library
%END REM
Option Public
Option Declare
Use "Files.LS2J"
Use "XWPFUtils"

%REM
*********************************************
    Class XWPFUtils
    Description: Comments for Class
%END REM
Class XWPFUtils As ErrorHandlerWJ
    Private XWPFClass As Javaclass
    Private XWPFobj As Javaobject

    Sub New()
        On Error GoTo ErrH
        Set me.XWPFClass=jSession.Getclass({XWPFUtils})
        Set me.XWPFobj=me.XWPFClass.Createobject()
Quit:
        Exit Sub
ErrH:
        Error Err, Me.RaiseError
    End Sub
    Sub Delete()
        If Not me.XWPFobj Is Nothing Then Delete me.XWPFobj
    End Sub
    %REM
    *--------------------------------------------
        Function FindAndReplace
        Description: fFrom, fTo - file path
    %END REM
    Function FindAndReplace(arrFrom, arrTo, fFrom As String, fTo As String)As String
        Dim routineName As String
        routineName="FindAndReplace"
        On Error GoTo ErrH
        'your code here
        Print {Replacing From String arrays...}
        Call me.XWPFobj.replaceFromArray(arrFrom, arrTo, fFrom, fTo)
        FindAndReplace=fTo
Quit:
        Exit Function
ErrH:
        Error Err, Chr(10) &{path From>}&fFrom &Chr(10) _
        &{path To>}&fFrom &Chr(10) _
        &RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
        Function FindAndReplaceList
        Description:  fFrom, fTo - file path
    %END REM
    Function FindAndReplaceList(lst List As String, fFrom As String, fTo As String) As String
        Dim routineName As String
        routineName="FindAndReplaceList"
        On Error GoTo ErrH
        'your code here
        Print {Replacing From list...}
        'Dim arrFrom() As String, arrTo() As String':arrFrom=Split({},{}):arrTo=Split({},{})
        Dim cnt As Long
        Call me.XWPFobj.clear()
        ForAll m In lst
            Call me.XWPFobj.add(ListTag(m),CStr(m))
        End ForAll
'        Dim arrFrom, arrTo
'        arrFrom=me.XWPFobj.getStringArray(cnt)
'        arrTo=me.XWPFobj.getStringArray(cnt)
        '        cnt=0
        '        ForAll m In lst
'            arrFrom(cnt)=ListTag(m)
'            arrTo(cnt)=CStr(m)
'            cnt=cnt+1
'        End ForAll
'        FindAndReplaceList=FindAndReplace(arrFrom, arrTo, fFrom, fTo)
        Call me.XWPFobj.replaceFromArray(fFrom, fTo)
        FindAndReplaceList=fTo
Quit:
        Exit Function
ErrH:
        Error Err, Me.RaiseError
        Resume Quit
    End Function
End Class
[doublepost=1513001780][/doublepost]агент (код остальных либ здесь выкладывал не раз, но там ничего хитрого)
Код:
%REM
*********************************************
    Agent test\XWPF
    Created Feb 11, 2016 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Agent
%END REM
Option Public
Option Declare
Use "XWPFUtils.LS2J"
Sub Initialize
    On Error GoTo ErrH
    Dim xwpf As New XWPFUtils()
    Dim doc As NotesDocument, ses As New NotesSession
    Set doc=ses.Documentcontext
    Dim fname As String, fList List As String
    fname=DetachDocFiles(doc, "*.docx", fList)
    Dim arrFrom, arrTo, lst List As String
    arrFrom=Split({SPA_POSITION;SPA_WHOM},{;})
    arrTo=Split({Генерал;Кузнецов},{;})
    lst({SPA_POSITION})={Генерал}
    lst({SPA_WHOM})={Кузнецов}
    If Len(fname)<1 Then Error 1024, Chr(10)&{файл не выгружен из документа:} &doc.Universalid &Chr(10)
    Print {File:} fname
    'Call xwpf.FindAndReplace(Arrfrom, Arrto, fname, fname & {.docx})
    Call xwpf.FindAndReplaceList(lst, fname, fname & {.docx})
    Dim run As String
    run={cmd.exe /c ""}&fname &{.docx""}'for long path suppport - double quotes
    Print {Executing>} run
    Dim status As Integer:status=Shell(run)
Quit:
    Exit Sub
ErrH:
    Error Err, RaiseError
End Sub
 
  • Нравится
Реакции: klendathu
K

klendathu

Добрый день.
Спасибо.
Но, все что Вы скинули - я не осилил.
Для .docx использовал Apache POI 3.17.

Такой код:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;

public class AddWord{

private String dir;

public AddWord(){
dir = System.getProperty("java.io.tmpdir");
}

public void processWord(String filename, String p1, String p2, String p3, String p4) throws FileNotFoundException, IOException{
String path = dir + filename;
File file = new File(path);
XWPFDocument docx = new XWPFDocument(new FileInputStream(file));

CTSectPr sectPr = docx.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);
//write header content
CTP ctpHeader = CTP.Factory.newInstance();
CTText ctHeader = ctpHeader.addNewR().addNewT();
ctHeader.setStringValue("ФИО подписывающего: " + p1);
XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, docx);
XWPFParagraph[] parsHeader = new XWPFParagraph[1];
parsHeader[0] = headerParagraph;

policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);
//write footer content
CTP ctpFooter = CTP.Factory.newInstance();
CTText ctFooter = ctpFooter.addNewR().addNewT();
ctFooter.setStringValue("Дата создания бумажной копии: " + p2);
XWPFParagraph footerParagraph = new XWPFParagraph(ctpFooter, docx);
XWPFParagraph[] parsFooter = new XWPFParagraph[1];
parsFooter[0] = footerParagraph;

policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter);
FileOutputStream out = new FileOutputStream(path);
docx.write(out);
out.close();
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + file);
}
}

Работает, если запускать из Java агента.
Но, не работает при вызове из этого кода:

Public Class AddWatermark
Private javaClass As JavaClass
Private javaObject As JavaObject
Private javaSession As JavaSession

Public Sub New()
On Error GoTo errorhandler
Set javaSession = New JavaSession()
Set javaClass = javaSession.GetClass("Main")
Set javaObject = javaClass.CreateObject
done:
Exit Sub
errorhandler:
Dim javaError As JavaError
Set javaError = javaSession.Getlastjavaerror()
javaSession.ClearJavaError
Resume done
End Sub

Public Sub Run(FileName As String, p As Variant)
On Error GoTo errorhandler
Call javaObject.init(FileName, p(0), p(1), p(2), p(3))
done:
Exit Sub
errorhandler:
Dim javaError As JavaError
Set javaError = javaSession.GetLastJavaError()
javaSession.ClearJavaError
Resume done
End Sub
End Class

Выдает ошибку JAVA error:java.lang.ExceptionInInitializerError.

Уже не знаю куда копать. Не работает именно при вызове из lotusscript.
При этом, схожее я уже реализовал для PDF на itextPDF библиотеке - там все работает и при вызове из lotusscript.

[doublepost=1513595931,1513594053][/doublepost]Ошибка возникает на этой строке:
XWPFDocument docx = new XWPFDocument(new FileInputStream(file));

Выкидывает ее LS2J.

[doublepost=1513596175][/doublepost]Как правильно проложить библиотеки в '\jvm\lib\ext' ? Это на сервере? Как потом подключить их в коде?
[doublepost=1513596906][/doublepost]Решил проблему - положил все библиотеки в "\jvm\lib\ext".
Теперь поясните, можно ли положить их на сервер, чтобы потом не возится с клиентскими машинами?
Спасибо
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
Теперь поясните, можно ли положить их на сервер, чтобы потом не возится с клиентскими машинами?
можно, но код, тогда, надо вызывать на сервере (например, в агенте, )
 
  • Нравится
Реакции: klendathu
K

klendathu

можно, но код, тогда, надо вызывать на сервере (например, в агенте, )
А другого варианта нет?
И еще вопрос вдогонку - библиотеки itext я так же переложил в папку jvm. Но, при выполнении вылетает ошибка о том, что библиотеки не найдены. Пришлось импортировать в агент.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
Пришлось импортировать в агент.
дизайнеру нужно в др. каталог (см. выше), если пытаетесь код в дизайнере обрабатывать
исключений нет - либа лежит, значит будет видна...
НО - никаких архивов, никаких вложенных каталогов, только jar, только "сплошняком" в каталог
[doublepost=1513604162,1513604105][/doublepost]
А другого варианта нет?
рассуждайте логически - клиент использует свои пути, сервер свои
[doublepost=1513609389][/doublepost]можете создать сервис, на сервере, пойти по пути xPages и ODA, но мне кажется - вам будет еще мудренее с этим разбираться
для xPages есть готовый , но ЕМНИП - он OSGI и стало-быть только сервер, хотя делоймент будет "проще" ;)
 
  • Нравится
Реакции: klendathu
K

klendathu

Коллеги, вариант с Apache POI для файлов Word не подходит:
1. Нарушает документ при вставке в колонтитулы(сдвигает тело вниз).
2. Нет поддержки .doc.

Ищу вариант вставки фонового текста, на этапе отправки на печать в принтер. Чтобы решение было универсальным и не зависело от формата файлов. Подскажите, как это работает и как реализовать?
p.s.: вижу, скидывали выше docxReporting, jasrepport - не осилил, можно вводный курс?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
454
Коллеги, вариант с Apache POI для файлов Word не подходит:
1. Нарушает документ при вставке в колонтитулы(сдвигает тело вниз).
2. Нет поддержки .doc.
у МСО у самого нет поддержки doc ;) вернее она
хорошее но почему-то хромает (c)Винипух
я не понял - что есть изначально?
Ибо
При отправке .docx вложения на печать, нужно добавить знаки по бокам документа(наподобие водяного знака).
прозвучало изначально
и зачем нужен уже отживший свое doc? если нужна конвертация - макрос, на VBA, для доков, кот. сделает docx (единоразово)
Ни один софт не будет правильно отображать doc (да и docx, с огрехами) без правил форматирования, искл. сам МСО (с оговорками)
Можно пытаться рендерить в LO (Libre Office) 5.4, если результат устроит - использовать jodconverter + комбинировать ПДФ (получившийся)
 
K

klendathu

Хотелось бы "водяные знаки по бокам документа" вставить как подложку, чтобы не вмешиваться в документ.
В общем, все сложно)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!