Hi,
I suggest you open an issue in JIRA. Attach your source code there. The
best would be to create your source code like a test that fails. For the
PDF you could create the PDF on the fly like this:
PDDocument doc = new PDDocument();
doc.addPage(new PDPage());
doc.save(....);
Tilman
Am 16.12.2016 um 09:54 schrieb Kai Keggenhoff:
Hello,
I'm experiencing a problem when I'm merging PDFs with freetext annotations read
from XFDF strings.
Whenever there's a "freetext" annotation with a "&" in the text (submitted as
"&" by Adobe Reader in the XFDF), merging this annotation will lead to a corrupted display in the
resulting PDF.
This corruption manifests itself in the way that instead of the actual text, it shows
"<body ..." from the XML.
However, if I crudely replace the "&" with "&amp;" in the XFDF prior to
merging, the annotation is displayed correctly.
I have tried to read the XFDF via FDFDocument.loadXFDF(new
ByteArrayInputStream(xfdf.getBytes("UTF-8"))) instead of parsing it to a
document, but this did not change anything.
Tested against PDFBox 2.0.3 and 2.0.4 as of this morning.
My sample code is at the end of the mail, for the input file "demo.pdf" any
portrait A4/letter format PDF should work.
Kind regards,
Kai Keggenhoff
import java.io.File;
import java.io.StringReader;
import java.util.List;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.fdf.FDFAnnotation;
import org.apache.pdfbox.pdmodel.fdf.FDFDocument;
import org.xml.sax.InputSource;
public class MergeTest {
public MergeTest() {
}
public void mergePDFandXFDF(File pdf, String xfdf, String outputfilename) {
FDFDocument fdf_doc = null;
PDDocument pdf_doc = null;
try {
org.w3c.dom.Document xfdf_doc =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new
InputSource(new StringReader(xfdf)));
fdf_doc = new FDFDocument(xfdf_doc);
pdf_doc = PDDocument.load(pdf);
List<FDFAnnotation> xfdfAnnotations =
fdf_doc.getCatalog().getFDF().getAnnotations();
for (FDFAnnotation xfdfAnnotation : xfdfAnnotations) {
PDAnnotation a =
PDAnnotation.createAnnotation(xfdfAnnotation.getCOSObject());
a.setReadOnly(true);
PDPage page = pdf_doc.getPage(xfdfAnnotation.getPage());
List<PDAnnotation> pageAnnotations = page.getAnnotations();
pageAnnotations.add(a);
}
File resultFile = new File(outputfilename);
pdf_doc.save(resultFile);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (fdf_doc!=null) try { fdf_doc.close(); } catch (Exception e) { }
if (pdf_doc!=null) try { pdf_doc.close(); } catch (Exception e) { }
}
}
public static void main(String argv[]) {
String xfdf = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xfdf xmlns=\"http://ns.adobe.com/xfdf/\" xml:space=\"preserve\"><annots><freetext color=\"#FFFFFF\" creationdate=\"D:20161216082154+01'00'\" flags=\"print\" date=\"D:20161216082219+01'00'\" page=\"0\" rect=\"342.148376,763.152039,402.267456,807.962036\" subject=\"Textfeld\"
title=\"keggenhoff\"><contents-richtext><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:15.20.0\" xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:Helvetica,sans-serif;font-stretch:normal\"><p dir=\"ltr\"><span
style=\"font-family:Helvetica\">A & B
1 & 2 & 3
4 & 5 & 6</span></p></body></contents-richtext><defaultappearance>0.898 0.1333 0.2157 rg /Helv 12 Tf</defaultappearance><defaultstyle>font: Helvetica,sans-serif 12.0pt; text-align:left; color:#E52237 </defaultstyle></freetext></annots><f
href=\"/C/Users/kegg/AppData/Local/Temp/demo.pdf\"/><fields><field name=\"submit\"/></fields><ids original=\"F285D06ECA30C5579E72B6B7AE07BC0B\" modified=\"EA76360AC37EFC04A7716DA16651675E\"/></xfdf>";
File pdf = new File("demo.pdf");
MergeTest mt = new MergeTest();
mt.mergePDFandXFDF(pdf, xfdf, "demo_1.pdf");
mt.mergePDFandXFDF(pdf, xfdf.replace("&", "&amp;"),
"demo_2.pdf");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]