2015-09-14 2 views
2

Я использую iTextSharp в asp.net (C#), чтобы объединить несколько шаблонов PDf. Существует функция печати, которая печатает только данные шаблона. При слиянии шаблонов поля/элементы управления, доступные в шаблоне, переименовываются с помощью метода RenameField iTextSharp. Эта реализация нарушила функцию печати. Поскольку функция печати была написана в соответствии с полями. Для слияния шаблонов я использую PDFCopy.iTextSharp - Печать объединенных шаблонов PDF

Document document = new Document(); 
bool flag = true; 
using (FileStream fileStream = File.Create(newFile)) 
{ 
    PdfSmartCopy copy = new PdfSmartCopy(document, fileStream); 
    PdfReader reader; 
    MemoryStream baos; 
    for (int i = 0; i < loopCount; i++) 
    { 
     reader = new PdfReader(pdfTemplate); 
     baos = new MemoryStream(); 
     stamper = new PdfStamper(reader, baos); 
     AcroFields pdfDoc = stamper.AcroFields; 
     BuildData(datarow,pdfDoc, obj) 
     renameFields(reader); 
     stamper.FormFlattening = false; 
     stamper.Close(); 
     reader = new PdfReader(baos.ToArray()); 
     copy.AddPage(copy.GetImportedPage(reader, 1)); 
    } 
    document.Close(); 
    strFileName = newFile; 
} 

private static void renameFields(PdfReader pdfReader) 
{ 
    string prepend = String.Format("_{0}", counter++); 
    foreach (KeyValuePair<string, AcroFields.Item> de in pdfReader.AcroFields.Fields) 
    { 
     pdfReader.AcroFields.RenameField(de.Key.ToString(), prepend + de.Key.ToString()); 
    } 
} 

Edit1: Это решение я нашел в itextsharp документа, но это не работает «Использование PdfCopy с документами , которые назвали назначение является одним из этих исключений Всех аннотации, такие как ссылка аннотация, есть. хранятся в PdfCopy, но они больше не работают для ссылок на местные именованные адресаты. Существует обходной путь для этой проблемы ».

PdfReader[] readers = { 
new PdfReader(LinkActions.RESULT2), 
new PdfReader(LinkActions.RESULT1) }; 
Document document = new Document(); 
PdfCopy copy = 
new PdfCopy(document, new FileOutputStream(RESULT1)); 
document.open(); 
int n; 
for (int i = 0; i < readers.length; i++) { 
readers[i].consolidateNamedDestinations(); 
n = readers[i].getNumberOfPages(); 
for (int page = 0; page < n;) { 
copy.addPage(copy.getImportedPage(readers[i], ++page)); 
} 
} 
+0

У вас возникла проблема с объединением двух документов PDF? – thewisegod

+0

Согласно вашему описанию, есть что-то особенное в ваших шаблонах. Их специальная функция печати, похоже, не ладит с переименованными полями AcroForm. К сожалению, переименование их необходимо, если вы хотите объединить несколько шаблонов. Таким образом, вы также должны адаптировать функциональность печати к переименованным полям. Если вы хотите объединиться. – mkl

+0

@thewisegod Нет, у меня нет проблем с слиянием, после слияния кнопок действий не работает, что находится на вершине шаблона. – abcd

ответ

0

формы больше не работают, потому что вы забыли добавить одну строку: copy.setMergeFields();

ВИДЕТЬ MergeForms2 пример:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest)); 
    copy.setMergeFields(); 
    document.open(); 
    List<PdfReader> readers = new ArrayList<PdfReader>(); 
    for (int i = 0; i < 3;) { 
     PdfReader reader = new PdfReader(renameFields(src, ++i)); 
     readers.add(reader); 
     copy.addDocument(reader); 
    } 
    document.close(); 
    for (PdfReader reader : readers) { 
     reader.close(); 
    } 
} 

public byte[] renameFields(String src, int i) throws IOException, DocumentException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PdfReader reader = new PdfReader(src); 
    PdfStamper stamper = new PdfStamper(reader, baos); 
    AcroFields form = stamper.getAcroFields(); 
    Set<String> keys = new HashSet<String>(form.getFields().keySet()); 
    for (String key : keys) { 
     form.renameField(key, String.format("%s_%d", key, i)); 
    } 
    stamper.close(); 
    reader.close(); 
    return baos.toByteArray(); 
} 

кажется, что вы также сделать предположение о том, что ваш шаблон состоит из одной страницы:

copy.addPage(copy.getImportedPage(reader, 1)); 

Это безопаснее, чтобы добавить документ все сразу:

copy.addDocument(reader); 

Важно:

Мои примеры написаны на Java. Вы работаете с iTextSharp в C#. Вам придется адаптировать методы, изменяя специфичные для Java методы в свойства или методы C#.

+0

copy.setMergeFields(); не работает для меня, и да, мой шаблон состоит из одной страницы, и я пытаюсь заполнить его разными данными в цикле. – abcd

+0

Я использую PdfSmartCopy, чтобы объединить его, и при слиянии я переименовываю поля. – abcd

+0

Я тоже в примере ['MergeForms2'] (http://itextpdf.com/sandbox/acroforms/MergeForms2), но у меня нет никакой функции «Печать». Люди в StackOverflow, читающие ваш вопрос, не знают, что вы имеете в виду, когда ссылаетесь на свою функциональность «Печать», поэтому вы не должны ожидать ответа, который решает вашу проблему: [«это не работает»] (http: /lowagie.com/doesntwork) - это единственная обратная связь, которую вы можете дать. Может быть, вы должны показать нам код вашей функции «Печать». –

Смежные вопросы