17

我在使用EVOPdfWebAPI 控制器AngularJS应用程序呈现 PDF 时遇到问题。

到目前为止,这是我的代码:

角度调用:

var url = 'api/form/build/' + id;

$http.get(url, null, { responseType: 'arraybuffer' })
.success(function (data) {
    var file = new Blob([data], { type: 'application/pdf' });

    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(file);
    }
    else {
        var objectUrl = URL.createObjectURL(file);
    window.open(objectUrl);
    }
});

APIController 方法:

var url = "http://localhost/index.html#/form/build/" + id;

#region PDF Document Setup
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();

htmlToPdfConverter.LicenseKey = "4W9+bn19bn5ue2B+bn1/YH98YHd3d3c=";
//htmlToPdfConverter.HtmlViewerWidth = 1024; //default
htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.ConversionDelay = 3;
htmlToPdfConverter.MediaType = "print";

htmlToPdfConverter.PdfDocumentOptions.LeftMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.RightMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.TopMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.BottomMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.TopSpacing = 10;
htmlToPdfConverter.PdfDocumentOptions.BottomSpacing = 10;
htmlToPdfConverter.PdfDocumentOptions.ColorSpace = ColorSpace.RGB;

// Set HTML content destination in PDF page
htmlToPdfConverter.PdfDocumentOptions.Width = 640;

htmlToPdfConverter.PdfDocumentOptions.FitWidth = true;
htmlToPdfConverter.PdfDocumentOptions.StretchToFit = true; 
#endregion

byte[] outPdfBuffer = htmlToPdfConverter.ConvertUrl(url);

string outPdfFile = @"c:\temp\forms\" + id + ".pdf";
System.IO.File.WriteAllBytes(outPdfFile, outPdfBuffer);


HttpResponseMessage result = null;
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new ByteArrayContent(outPdfBuffer.ToArray());
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "filename.pdf";
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

return result;

当我检查我使用 写出的 PDF 时WriteAllBytes,它呈现完美,但是当它通过 Angular 调用返回并在 Adob​​e Reader 中打开时,我收到“无效色彩空间”错误消息,弹出很多次,但文档没有打开。当我将色彩空间更改为灰度时,PDF 会打开,但它是空白的。

我有一种感觉,这ByteArrayContent是导致问题的转换,因为这是在实际创建 PDF 并将其发送回 Angular 调用之间发生的唯一事情,但我已经碰壁了,无法弄清楚找出问题所在。

我真的很感谢你们能提供的任何帮助,因为我已经很接近解决这个问题了,我只需要在从电话返回时正确“转换”文档。

提前感谢您的帮助。

问候,约翰。

4

3 回答 3

0

问题似乎在客户端,响应中的字符没有正确解析。对于任何为此苦苦挣扎的人,我在这里找到了我的解决方案:SO Question

于 2019-05-20T11:05:48.310 回答
0

// 安装 puppeteer-core npm 包 cmd

            npm i puppeteer-core
            # or "yarn add puppeteer-core"
    
           <!-- example.js start-->

       const puppeteer = require('puppeteer');
    
        (async () => {
          const browser = await puppeteer.launch();
          const page = await browser.newPage();
          await page.goto('https://example.com');
          await page.screenshot({ path: 'example.png' });
        
          await browser.close();
        })();
  • 在命令行执行脚本

    节点示例.js

    Puppeteer 将初始页面大小设置为 800×600px,它定义了屏幕截图的大小。可以使用 Page.setViewport() 自定义页面大小。

    示例 - 创建 PDF。

  • 将文件另存为 hn.js

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com', {
    waitUntil: 'networkidle2',
  });
  await page.pdf({ path: 'hn.pdf', format: 'a4' });

  await browser.close();
})();
  • 在命令行执行脚本

    node hn.js 有关创建 pdf 的更多信息,请参阅 Page.pdf()。

    示例 - 在页面上下文中评估脚本

  • 将文件另存为 get-dimensions.js

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  // Get the "viewport" of the page, as reported by the page.
  const dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio,
    };
  });

  console.log('Dimensions:', dimensions);

  await browser.close();
})();
  • 在命令行执行脚本

    节点获取维度.js

    有关评估和相关方法(如 evaluateOnNewDocument 和 ExposeFunction)的更多信息,请参阅 Page.evaluate()。

于 2021-02-20T08:28:34.150 回答
0

你试过无头 Chrome吗?是一篇关于这个主题的好文章。为此,我使用了https://github.com/puppeteer/puppeteer ,它是一个易于集成的解决方案。

于 2020-06-03T17:43:09.937 回答