2013-06-10 2 views
1

У меня возникла проблема с отображением гиперссылки на документ (изображение/.pdf/.doc/.xls) внутри PDF. Когда пользователь нажимает на гиперссылку, соответствующий документ (изображение/.pdf/.doc/.xls) должен отображаться в новом окне.Как отобразить ссылку на другой документ (изображение/pdf/doc/xls) в формате PDF с помощью Apache FOP?

Books.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
     <Book xmlns="http://book.com/one/1.2/" xmlns:ns2="http://test2.com/one/1.2/" xmlns:ns3="http://test3.com/one/1.2/" > 
      <Title>Java</Title> 
      <ISBN>123</ISBN> 
      <Author>Test</Author> 
      <BookDocument> 
      <ns2:DocumentName>images1.jpeg</ns2:DocumentName> 
      <ns2:DocumentContent>/aN2r9pT8HwKXpmvvmt2ifpz5xvmt2ifpz5xukZHBb9Wn4FL0xwW/VpD=</ns2:DocumentContent> 
      </BookDocument> 
      <BookDocument> 
      <ns2:DocumentName>images2.jpeg</ns2:DocumentName> 
      <ns2:DocumentContent>/aN2r9pT8HwKXpmvvmt2ifpz5xvmt2ifpz5xukZHBb9Wn4FL0x/VpD=</ns2:DocumentContent> 
      </BookDocument> 
     </Book> 

Books.xsl

<xsl:template match="*[local-name() = 'Book']"> 

    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="ex" 
       page-height="29.7cm" page-width="21cm" margin-top="2cm" 
       margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> 
       <fo:region-body /> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="ex"> 
      <fo:flow flow-name="xsl-region-body"> 

       <fo:block space-after="15mm"> 

       </fo:block> 
       <fo:block font-size="16pt" font-weight="bold" space-after="5mm"> 
        Book Details 
       </fo:block> 

       <fo:block font-size="10pt"> 
        <fo:table table-layout="fixed" width="100%" 
         border-collapse="collapse" border="solid 1px black"> 

         <fo:table-body> 
          <fo:table-row> 
           <fo:table-cell border="solid 1px black" padding="1mm"> 
            <fo:block font-weight="bold">Title :</fo:block> 
           </fo:table-cell> 
           <fo:table-cell padding="1mm" border="solid 1px black"> 
            <fo:block> 
             <xsl:value-of select="*[local-name() = 'Title']" /> 
            </fo:block> 
           </fo:table-cell> 
          </fo:table-row> 

          <fo:table-row> 
           <fo:table-cell border="solid 1px black" padding="1mm"> 
            <fo:block font-weight="bold">ISBN : 
            </fo:block> 
           </fo:table-cell> 
           <fo:table-cell padding="1mm" border="solid 1px black"> 
            <fo:block> 
             <xsl:value-of select="*[local-name() = 'ISBN']" /> 
            </fo:block> 
           </fo:table-cell> 
          </fo:table-row> 

          <fo:table-row> 
           <fo:table-cell border="solid 1px black" padding="1mm"> 
            <fo:block font-weight="bold">Author :</fo:block> 
           </fo:table-cell> 
           <fo:table-cell padding="1mm" border="solid 1px black"> 
            <fo:block> 
            <xsl:value-of select="*[local-name() = 'Author']" /> 
            </fo:block> 
           </fo:table-cell> 
          </fo:table-row> 

          <fo:table-row> 
           <fo:table-cell border="solid 1px black" padding="1mm"> 
            <fo:block font-weight="bold">Image Names :</fo:block> 
           </fo:table-cell> 
           <fo:table-cell padding="1mm" border="solid 1px black"> 
            <fo:block> 
             <xsl:for-each select="*[local-name() = 'BookDocument']"> 
             <xsl:value-of select="*[local-name() = 'DocumentName']"/> 
             <xsl:text>&#160;</xsl:text> 
             </xsl:for-each> 
            </fo:block> 
           </fo:table-cell> 
          </fo:table-row> 


         </fo:table-body> 
        </fo:table> 
       </fo:block> 
      </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
</xsl:template> 

Данные внутри <ns2:DocumentContent> в формате кодирования base64. Мне нужно отобразить документ в новом окне, используя содержимое <ns2:DocumentContent>. Пожалуйста, помогите мне в этом.

Это ответ Кевин комментарий на 19/06/2013

Hi Kevin Я новичок в этом и XSLT XSL-FO, как вы сказали, я попытался дать гиперссылку с помощью <fo:basic-link>, но ссылка не открывается, чтобы показать прикрепленный файл. ниже код, который я пытаюсь

<fo:basic-link padding-left="65mm" show-destination="new" text-decoration="underline"> 
                <xsl:attribute name="external-destination"> 
                  <xsl:text>url('data:</xsl:text> 
                  <xsl:value-of select="*[local-name() = 'FileType']" />     
                  <xsl:text>;base64,</xsl:text> 
                  <xsl:value-of select="*[local-name() = 'FileAttachment']" /> 
                  <xsl:text>')</xsl:text> 
                </xsl:attribute> 
                <fo:inline font-family="Arial" font-size="10pt" color="#0000ff" text-decoration="underline"><xsl:value-of select="*[local-name() = 'FileName']"/></fo:inline> 
                </fo:basic-link> 

может у вас, пожалуйста, помогите в этом.

ответ

2

Если вы намерены включить фактический контент в PDF (по существу, используя PDF в качестве контейнера), это можно сделать, только если ваш выбор средств визуализации XSL FO поддерживает вложения PDF. Поскольку вы указываете такие вещи, как Excel и т. Д., Я предполагаю, что это то, что вы имеете в виду.

Если ваш выбор движка XSL FO поддерживает вложения файлов PDF в процессе рендеринга, вам нужно будет записать содержимое потока документов, закодированного в base64, в конструкцию FO вложения PDF. Вы должны передать полный закодированный документ в атрибут «src» для прикрепления файла в документированном расширении. Использование RenderX XEP, вы можете найти в документации для FO, чтобы сделать это здесь:

Support of PDF Annotation and File Attachments

Вы бы использовать шаблон, похожий на это ниже (обратите внимание на «attachmentContentType» в этом примере будет содержать MimeType для содержания вы в том числе вам нужно будет добавить, что в ваш входной XML):

<xsl:attribute name="src"> 
      <xsl:text>url('data:</xsl:text> 
      <xsl:value-of select="attachmentContentType"/>     
      <xsl:text>;base64,</xsl:text> 
      <xsl:value-of select="encodedImageBytes"/> 
      <xsl:text>')</xsl:text> 
</xsl:attribute> 

чтобы пристроить «SRC» атрибут с чем-то вроде (используя «данные:» схему для хранения всего документа в атрибуте SRC .) Это будет атрибут «src» для расширения файла. Это вложит файл в PDF как вложение, которое можно открыть в его собственном редакторе через средство просмотра PDF, которое поддерживает это.

SRC = "" данные: изображение/JPEG; base64,/aN2r9pT8HwKXpmvvmt2ifpz5xvmt2ifpz5xukZHBb9Wn4FL0xwW ..."

+0

Спасибо Кевин Браун за помощь. Я использую приведенный выше фрагмент кода внутри , он отлично работает при отображении изображения внутри pdf. Но нужно показывать только ссылки на изображения, а не изображение в формате pdf. пожалуйста, помогите в этом, если есть какой-либо способ для этого. – RaoPotla

+0

Вопрос - ссылка для изображения на «где».Вы планируете разместить изображение в Интернете где-нибудь в известном и доступном месте? Вы не можете просто думать, что ссылка на что-то будет работать на файловой системе. Если вам нужна ссылка на изображение внутри PDF (или любой другой файл, если на то пошло), используйте fo: basic-link с URL-адресом в атрибуте external-destination. –

+0

У вас также есть закодированные байты Base64 изображения. Единственный способ включить изображение или другой тип файла для открытия в отдельном окне - это то, как я указал выше. Вы вставляете файл внутри PDF в качестве вложения в файл, и вы можете поместить стандартную PDF-маркировку (например, бумажный клип или pushpin) в PDF-файл, чтобы запустить файл во внешнем приложении. Вот почему вам также нужен mimetype, потому что это говорит о том, какую файловую ассоциацию использовать для запуска соответствующего внешнего приложения. –