XSL-FO를 사용하여 PDF 파일에 대한 동적 링크를 게시하고 싶습니다. StackOverflow 및 정적 URL이있는 많은 예제가 있지만 동적 URL이없는 예제는 여기에서 찾을 수 있습니다. 그것이 내가이 질문을 게시하는 이유입니다. 나는 XML 파일에서 링크를 생성 할 (링크는 속성 요소 'topicref'에서 'HREF'의 값입니다) :XSL-FO (Apache FOP)로 XML 파일에서 PDF 파일로 동적 링크 게시
<fo:basic-link external-destination="url(<xsl:value-of select="map/topicref/@href"/>)" color="blue" text-
decoration="underline"><xsl:value-of select="map/topicref/@href"/></fo:basic-link>
: 나는 XSL-FO에 사용
<?xml version="1.0" encoding="utf-8"?>
<map outputclass="DTVMap">
<title>Testdocument DTVmap</title>
<topicref format="dita" scope="local" href="ObjSt/bla/DTV/Testdocument_14.06.dita" navtitle="Testdocument 14.06" />
</map>
그리고 다음 메시지가 나타납니다. "요소 유형"null "과 연결된"external-destination "속성 값에 '<'문자가 없어야합니다."
위의 '기본 링크 외부 대상'대신 xsl-fo에서 아래 코드를 추가하여 링크를 가져 오려고했습니다.
<xsl:value-of select="map/topicref/@href"/>
<xsl:param name="link" select="map/topicref/@href" />
<fo:basic-link color="blue" text-decoration="underline">
<xsl:attribute name="external-destination">
<xsl:value-of select="$link" />
</xsl:attribute>
<xsl:value-of select="$link" />
</fo:basic-link>
이제 생성 된 PDF의 링크가 있지만 링크입니다 : '파일 : ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita'대신에 : 'ObjSt/bla/DTV/Testdocument_14.06.dita'.
질문은; 어떻게하면 'ObjSt/bla/DTV/Testdocument 14.06.dita'와 같은 링크를 얻을 수 있습니까? 'file : /// C/ws/fo_xslt'없이? 'C :/ws/fo_xslt'는 생성 된 PDF를 저장하는 디렉토리입니다. 또는 : href 속성 값만 포함하는 링크는 어떻게 얻을 수 있습니까? 감사
PS : 나는 PDF 파일이 생성하기 위해 사용하는 자바 클래스 (단지 좀 더 배경을 제공하기 위해) :
package foXslt;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.fop.apps.*;
public class FopPdf {
public static void main(String[] args) {
FopPdf fOPPdfDemo = new FopPdf();
try {
fOPPdfDemo.convertToPDF();
} catch (FOPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Method that will convert the given XML to PDF
* @throws IOException
* @throws FOPException
* @throws TransformerException
*/
public void convertToPDF() throws IOException, FOPException, TransformerException {
// the XSL FO file
File xsltFile = new File("C:\\ws\\fo_xslt\\foxslt.xsl");
// the XML file which provides the input
StreamSource xmlSource = new StreamSource(new File("C:\\ws\\fo_xslt\\xmlDTVMapMetLink.xml"));
// create an instance of fop factory
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
// a user agent is needed for transformation
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Setup output
OutputStream out;
out = new java.io.FileOutputStream("C:\\ws\\fo_xslt\\foxslt.pdf");
try {
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
// That's where the XML is first transformed to XSL-FO and then
// PDF is created
transformer.transform(xmlSource, res);
} finally {
out.close();
}
}
생성 된 링크가 'file : ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita'임을 어떻게 확인 했습니까? Adobe Reader의 표시 결과입니까? Reader는 보통 PDF 기존 폴더를 기반으로 상대 경로를 인식한다고 생각합니다. – tmakita
'ObjSt/bla/DTV/Testdocument 14.06.dita'는 상대 경로 표기법입니다. 이걸로 절대 경로를 생성하고 싶습니까? – tmakita