简体   繁体   English

为什么 pdf 下载的 bij Trinidad fileDownloadActionListener 无法使用 pdf 阅读器打开?

[英]Why pdf downloaded bij Trinidad fileDownloadActionListener can't be open with pdf reader?

I do create PDF from String which this String is in xml format and present to user as a trinidad button with fileDownloadActionListener .我确实从String创建PDF ,该String采用xml format ,并作为带有fileDownloadActionListenertrinidad按钮呈现给用户。

I can download the PDF but can't open it with PDF reader such as adobe reader first I thought it maybe corrupted but it is not the case because I can open it with Visual Studio Code or any other text editor such as notepad .我可以下载 PDF 但无法使用PDF reader (例如 adobe reader)打开它首先我认为它可能已损坏,但事实并非如此,因为我可以使用Visual Studio Code或任何其他文本编辑器(例如notepad )打开它。

1- why I can't open it with adobe reader? 1-为什么我不能用adobe reader打开它?

2- Is there any better why to do this? 2-有更好的理由吗?

Frontend:前端:

<h:commandButton id="mehrpdf" value="Download PDF" styleClass="popupButton">
        <tr:fileDownloadActionListener filename="mehr.pdf"  contentType="application/pdf; charset=utf-8" method="#{bean.downloadMehr}" />
</h:commandButton>

Backend:后端:

public void downloadMehr(FacesContext context, OutputStream out) throws IOException
    {
        String fetchedXmlMessage = getFetchedXmlMessage();
        XmlPrettifier prettifier = XmlPrettifierFactory.getInstance();
        prettyXmlMessage = prettifier.makePretty(fetchedXmlMessage);

        // alternativ way
        File pdfFile = createPdfFromTxt(prettyXmlMessage);

        OutputStreamWriter w = new OutputStreamWriter(out, "UTF-8");
        w.write(prettyXmlMessage);
        w.flush();
    }

pdfcreation: pdf创作:

public File createPdfFromTxt(String content) throws IOException, DocumentException {

        //define the size of the PDF file, version and output file
        File outfile = File.createTempFile("mehr", ".pdf");
        Document pdfDoc = new Document(PageSize.A4);
        PdfWriter.getInstance(pdfDoc, new FileOutputStream(outfile)).setPdfVersion(PdfWriter.PDF_VERSION_1_7);
        pdfDoc.open();

        //define the font and also the command that is used to generate new paragraph
        Font myfont = new Font();
        myfont.setStyle(Font.NORMAL);
        myfont.setSize(11);
        pdfDoc.add(new Paragraph("\n"));

        // add paragraphs into newly created PDF file
        File contentFile = File.createTempFile("content", ".txt");
        FileUtils.writeStringToFile(contentFile, content);

        BufferedReader br = new BufferedReader(new FileReader(contentFile));
        String strLine;
        while ((strLine = br.readLine()) != null) {
            Paragraph para = new Paragraph(strLine + "\n", myfont);
            para.setAlignment(Element.ALIGN_JUSTIFIED);
            pdfDoc.add(para);
        }
        pdfDoc.close();
        br.close();

        return outfile;
    }

I did change the backend as below according to what people mentioned in the command above, now I can read it with PDF reader.我确实根据上面命令中提到的人更改了后端,现在我可以用 PDF 阅读器阅读它。 Thanks to all of you.感谢大家。

public void downloadMehr(FacesContext context, OutputStream out) throws IOException
    {
        String fetchedXmlMessage = getFetchedXmlMessage();
        XmlPrettifier prettifier = XmlPrettifierFactory.getInstance();
        prettyXmlMessage = prettifier.makePretty(fetchedXmlMessage);

        // create pdf from string
        PdfCreator pdfCreator = new PdfCreator( prettyXmlMessage);
        File pdfFile = pdfCreator.create();

        FileInputStream inStream = new FileInputStream(pdfFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;

        while ((bytesRead = inStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }

        inStream.close();
        outputStream.close();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM