K
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
что значит "при отправке"?Добрый день.
При отправке .docx вложения на печать, нужно добавить знаки по бокам документа(наподобие водяного знака).
Подскажите, как это можно реализовать и возможно ли?
Во вложении пример.
Спасибо
водяные знаки так накладываются (как на картинке ТС)?конечно можно, в процессе формирования дока наложить на него водяные знаки, а потом уже хоть на печать, хоть на почту
В документе NotesDocument есть поля с вложениями(формата docx, pdf, tiff).что значит "при отправке"?
если на уровне GDI и принтерного контекста - вопрос не по адре
Я тоже так решил, что нужно реализовывать это как водяные знаки, никогда с этим не сталкивался, буду рад услышать советы, ссылки, нюансы.конечно можно, в процессе формирования дока наложить на него водяные знаки, а потом уже хоть на печать, хоть на почту
накладывать можно все что угодно и куда угодно...Нужно сделать action, который будет накладывать определенную информацию из документа по его боковым краям("боковые колонтитулы"), и печатать.
Да, я решил word файлы парсить в pdf и то же использовать itext.@klendathu разговор начинался с ворда ...
и еще вопрос - где itext лежит?
правим notes.inijava.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:4138)
а в ворде такие есть?В нём пока не нашел возможности добавлять водяные знаки повернутые на 90 град
её может не хватать и по причине накопления объектов в памяти, без GCчто ОЗУ не хватало
у меня есть 3-яУ меня есть 2 идеи:
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);
}
}
}
}
}
}
%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
%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
можно, но код, тогда, надо вызывать на сервере (например, в агенте,Теперь поясните, можно ли положить их на сервер, чтобы потом не возится с клиентскими машинами?
А другого варианта нет?можно, но код, тогда, надо вызывать на сервере (например, в агенте,Ссылка скрыта от гостей)
дизайнеру нужно в др. каталог (см. выше), если пытаетесь код в дизайнере обрабатыватьПришлось импортировать в агент.
рассуждайте логически - клиент использует свои пути, сервер своиА другого варианта нет?
у МСО у самого нет поддержки doc вернее онаКоллеги, вариант с Apache POI для файлов Word не подходит:
1. Нарушает документ при вставке в колонтитулы(сдвигает тело вниз).
2. Нет поддержки .doc.
я не понял - что есть изначально?хорошее но почему-то хромает (c)Винипух
прозвучало изначальноПри отправке .docx вложения на печать, нужно добавить знаки по бокам документа(наподобие водяного знака).
Обучение наступательной кибербезопасности в игровой форме. Начать игру!