[
https://issues.apache.org/jira/browse/FOP-3173?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17832839#comment-17832839
]
Peter Hull edited comment on FOP-3173 at 4/1/24 1:06 PM:
---------------------------------------------------------
I wonder if this is a bug actually, because the constructor for URIAction takes
a URI (in string form) and it has correctly interpreted that as having a scheme
of 'embedded-file', an ssp of 'filename' and a fragment of '1.txt'.
Your test will pass if you modify it a bit
{code:java}
@Test
public void testAddEmbeddedFileDash () throws IFException,
java.net.URISyntaxException {
PDFDocumentHandler docHandler = new PDFDocumentHandler(new
IFContext(ua));
docHandler.setFontInfo(new FontInfo());
ByteArrayOutputStream out = new ByteArrayOutputStream();
docHandler.setResult(new StreamResult(out));
docHandler.startDocument();
docHandler.startPage(0, "", "", new Dimension());
docHandler.handleExtensionObject(new
PDFEmbeddedFileAttachment("filename#1.txt", "src", "desc"));
// ** MODIFY next 2 lines
URI uri = new URI("embedded-file", "filename#1.txt",null);
docHandler.getDocumentNavigationHandler().renderLink(new Link(
new URIAction(uri.toString(), false), new Rectangle()));
docHandler.endDocument();
}
{code}
Specifically the URI constructor will escape the hash in the filename (as
'{{{}embedded-file:filename%231.txt{}}}')
It might be a good idea to add a constructor to URIAction which takes a URI as
the first param, to encourage good behaviour.
was (Author: peterhull90):
I wonder if this is a bug actually, because the constructor for URIAction takes
a URI (in string form) and it has correctly interpreted that as having a scheme
of 'embedded-file', an ssp of 'filename' and a fragment of '1.txt'.
Your test will pass if you modify it a bit
{code:java}
@Test
public void testAddEmbeddedFileDash () throws IFException,
java.net.URISyntaxException {
PDFDocumentHandler docHandler = new PDFDocumentHandler(new
IFContext(ua));
docHandler.setFontInfo(new FontInfo());
ByteArrayOutputStream out = new ByteArrayOutputStream();
docHandler.setResult(new StreamResult(out));
docHandler.startDocument();
docHandler.startPage(0, "", "", new Dimension());
docHandler.handleExtensionObject(new
PDFEmbeddedFileAttachment("filename#1.txt", "src", "desc"));
// ** MODIFY next 2 lines
URI uri = new URI("embedded-file", "filename#1.txt",null);
docHandler.getDocumentNavigationHandler().renderLink(new Link(
new URIAction(uri.toString(), false), new Rectangle()));
docHandler.endDocument();
}
{code}
Specifically the URI constructor will escape the hash in the filename (as
'embedded-file:filename%231.txt')
It might be a good idea to add a constructor to URIAction which takes a URI as
the first param, to encourage good behaviour.
> cannot include attachment whose name contains hash ('#') in the name
> --------------------------------------------------------------------
>
> Key: FOP-3173
> URL: https://issues.apache.org/jira/browse/FOP-3173
> Project: FOP
> Issue Type: Bug
> Components: fo/unqualified
> Affects Versions: 2.9
> Reporter: BlueMountain
> Priority: Major
> Attachments: PDFAttachmentTestCase.java
>
>
> hi,
> we are relying on the fop to generate PDF given data held in database + file
> storage.
> we need to represent some ( file.name, file.data) as a pdf embedded
> attachment.
> some users have encountered issue when the file.name value carries hash sign
> ('#')
> upon generating the pdf, an exception is thrown about missing attachment name.
> I have added a new test to the PDFAttachmentTestCase class (see attachment)
> to reproduce the issue.
> The added test that generates the error is:
> @Test
> public void testAddEmbeddedFileDash () throws IFException {
> PDFDocumentHandler docHandler = new PDFDocumentHandler(new IFContext(ua));
> docHandler.setFontInfo(new FontInfo());
> ByteArrayOutputStream out = new ByteArrayOutputStream();
> docHandler.setResult(new StreamResult(out));
> docHandler.startDocument();
> docHandler.startPage(0, "", "", new Dimension());
> docHandler.handleExtensionObject(new
> PDFEmbeddedFileAttachment("filename#1.txt", "src", "desc"));
> // issue occurs at this line
> *docHandler.getDocumentNavigationHandler().renderLink(new Link(*
> *new URIAction("embedded-file:filename#1.txt", false), new Rectangle()));*
> docHandler.endDocument();
> }
>
> running the command:
> mvn test -pl fop-core -Dtest=PDFAttachmentTestCase
> I get the following output:
> Running org.apache.fop.pdf.PDFAttachmentTestCase
> Tests run: 4, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.15 sec <<<
> FAILURE! - in org.apache.fop.pdf.PDFAttachmentTestCase
> testAddEmbeddedFileDash(org.apache.fop.pdf.PDFAttachmentTestCase) Time
> elapsed: 0.003 sec <<< ERROR!
> {*}java.lang.IllegalStateException: No embedded file with name filename
> present{*}.
> at org.apache.fop.pdf.PDFFactory.getActionForEmbeddedFile(PDFFactory.java:728)
> at org.apache.fop.pdf.PDFFactory.getExternalAction(PDFFactory.java:600)
> at
> org.apache.fop.render.pdf.PDFDocumentNavigationHandler.getAction(PDFDocumentNavigationHandler.java:174)
> at
> org.apache.fop.render.pdf.PDFDocumentNavigationHandler.renderLink(PDFDocumentNavigationHandler.java:108)
> at
> org.apache.fop.pdf.PDFAttachmentTestCase.testAddEmbeddedFileDash(PDFAttachmentTestCase.java:119)
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)