Example #1
0
int PDFWriter::saveJpegImage(const QString &jpegFileName, const QSize &sizePixels, Types::ColorTypes colorType)
{
    int err = 0;

    err = addImageResourcesAndXObject();
    QFile jpegFile(jpegFileName);
    if (!jpegFile.open(QIODevice::ReadOnly))
        return 2;

    const int jpegFileSize = jpegFile.size();
    if (jpegFileSize == 0)
        return 3;

    const QString colorSpace =
        colorType == Types::ColorTypeCMYK ? QLatin1String("/DeviceCMYK")
        : colorType == Types::ColorTypeRGB ? QLatin1String("/DeviceRGB")
        : QLatin1String("/DeviceGray");

    // Yes. Cmyk jpegs in PDFs need reverse decoding, somehow
    const QString decodeArray =
        colorType == Types::ColorTypeCMYK ? QLatin1String("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]" LINEFEED)
                                          : QString();

    addOffsetToXref();
    m_outStream << QString::fromLatin1(
        LINEFEED "%1 0 obj" LINEFEED
        "<</ColorSpace %2" LINEFEED
        "/Subtype /Image" LINEFEED
        "/Length %3" LINEFEED
        "/Width %4" LINEFEED
        "/Type /XObject" LINEFEED
        "/Height %5" LINEFEED
        "/BitsPerComponent 8" LINEFEED
        "/Filter /DCTDecode" LINEFEED
        "%6"
        ">>" LINEFEED
        "stream" LINEFEED)
        .arg(m_pdfObjectCount)
        .arg(colorSpace)
        .arg(jpegFileSize)
        .arg(sizePixels.width())
        .arg(sizePixels.height())
        .arg(decodeArray);

    m_outStream.flush();
    while (!jpegFile.atEnd())
        m_outStream.device()->write(jpegFile.read(200000));

    m_outStream <<
        LINEFEED "endstream" LINEFEED
        "endobj";

    return err;
}
Example #2
0
void JPEGFileWriter::handleJPEG(const char *theJPEG, size_t theSize)
{
  ++myCount;
  std::ostringstream fileName;
  fileName << myDirectory << "/" << myFileBase << std::setw(9)
           << std::setfill('0') << myCount << ".jpg";
  std::ofstream jpegFile(fileName.str(), std::ios::binary);
  auto thisErrno = errno;
  if (! jpegFile.is_open())
  {
    throw std::logic_error("Failed to open " + fileName.str() + ": " +
                           std::strerror(thisErrno));
  }

  jpegFile.write(theJPEG, theSize);
  jpegFile.close();
}