Generate TCPDF output to a shared drive folder

1.3k views Asked by At

I'm trying to save my PDF file to a "Shared Folder", I'm using a configuration file to set the "Shared Folder" and then I just set the path inside the PHP file.

However it doesn't allow me to save with a "Shared Folder" path, it gives me the error:

Failed to open stream: No such file or directory

It works with "C:/Path name/"and I don't want to do this because I've not got access to the root folder.

Value from the config file to create path name

SharedFolder = //MIA_TEST/htdocs/SharedFolder

My reading of file and Create folder structure:

// Code to get values from config
function GetDictionaryOfUnsignedValues()
{
$fp = fopen("C:/ISOSEC/serverLicense.txt","r");

if ($fp ==  false)
    return null;

$UnsignedDataStarted    = false;
$UnsignedDataFinished = false;

$UnsignedData = "";

// Read the licence file line by line and extract signed data block as well as signature
while (($line = fgets($fp, 4096)) !== FALSE)
{
    if ($line == "ISOSEC NOT SIGNED:\n")
    {
        $UnsignedDataStarted = true;
        continue;
    }

    if ($UnsignedDataStarted and !$UnsignedDataFinished)
    {
        // When we come across an empty line (line length > 2), the signed dat block is finished
        if (strlen($line) > 2)
            $UnsignedData = $UnsignedData . $line;                  
        else
            $UnsignedDataFinished = true;           
    }
}

fclose($fp);

// Split the whole signed data block line by line
$ArrayOfLines = explode ("\n",$UnsignedData);

// Get the signed data into php easily accessible code - dctionary (associative array)
$UnsignedDataDictionary = array();

foreach ($ArrayOfLines as $line) 
{
    // Only lines containing ' = ' are valid lines
    if (strpos($line,' = ') !== false)
    {
        $keyValueArray = explode (" = ",$line);
        $UnsignedDataDictionary[$keyValueArray[0]] = $keyValueArray[1];
    }
}

if (count($UnsignedDataDictionary) < 1)
    return NULL;

return $UnsignedDataDictionary; 
}

// Create folder in folder
function createFolderInFolder($InputFolder, $newFolder)
{
if (!is_dir($InputFolder))
    return NULL;

$CreatedFolder = $InputFolder . '/' .$newFolder;

//we don't want to rewrite the folder with new one if it already exist
if (file_exists ($CreatedFolder))
    return $CreatedFolder;

$oldmask = umask(0);

if (mkdir($CreatedFolder, 0777))
{
    umask($oldmask);
    return $CreatedFolder;
}
else
    return NULL;
}



// Obtain shared folder from config file
// Then create output folder (or check if exist the output folder)

$ServerConfigDictionary = GetDictionaryOfUnsignedValues();
if ($ServerConfigDictionary == NULL)
    LogToLogFileAndFinishExecution("Discharge - Failed to obtain list of server configuration items from the server licence file");
if (!array_key_exists('SharedFolder', $ServerConfigDictionary))
    LogToLogFileAndFinishExecution("Discharge - Failed to obtain Shared folder location item from the server licence file");

// Get the shared folder location from the server config file
$SharedFolder = $ServerConfigDictionary['SharedFolder'];


// Check database connection, if not established, output an error and finish the script
if ($connection == NULL)
    LogToLogFileAndFinishExecution("Unable to establish database conection - unable to generate Postnatals");

if (($OutputFolder = createFolderInFolder($SharedFolder, "MIA - Digital Post Natal Records")) == NULL)
{
    LogMessageToServerLog($connection, 'Failed to create or find folder to store Discharges in shared directory', "ERROR", "Discharge.php");
    exit(0);
}

I'm using TCPDF for the generation of the PDF, here the line of code which generates the PDF

PDF code1:

//PDF Output
$pdf->Output($OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . '_' . $Mother->PatientTableRecord['NHSID'] . ' ' . date('d_m_Y') . '.pdf'),'F');  // $OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . ' ' . date('d_m_Y h_i_s', time() . '.pdf','F');

Response1:

fopen(file:////MIA_TEST/htdocs/SharedFolder/MIA - Digital Post Natal Records/Fiona Appleton_1946546288 09_06_2015.pdf): failed to open stream: No such file or directory

PDF Code 2: (Added realpath)

$pdf->Output(realpath($OutputFolderPath) . ReplaceWindowsFileNameSpecialCharacters($Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . '_' . $Mother->PatientTableRecord['NHSID'] . ' ' . date('d_m_Y') . '.pdf'),'F');  // $OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . ' ' . date('d_m_Y h_i_s', time()) . '.pdf','F');

Response 2:

fopen(): remote host file access not supported, file://\\MIA_TEST\HTDOCS\SharedFolder\MIA - Digital Post Natal RecordsFiona Appleton_1946546288 09_06_2015.pdf

PDF Code 3:

// Worked
fopen($OutputFolderPath."Text.pdf", "w");

// Didn't work
$pdf->Output($OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . '_' . $Mother->PatientTableRecord['NHSID'] . ' ' . date('d_m_Y') . '.pdf','F');  // $OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . ' ' . date('d_m_Y h_i_s', time()) . '.pdf','F'

// Works with no PDF content inside
fopen($OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . '_' . $Mother->PatientTableRecord['NHSID'] . ' ' . date('d_m_Y') . '.pdf','F');  // $OutputFolderPath . $Mother->PatientTableRecord['Forename'] . ' ' . $Mother->PatientTableRecord['Surname']  . ' ' . date('d_m_Y h_i_s', time()) . '.pdf','w');

Response 3:

fopen(file:////MIA_TEST/htdocs/SharedFolder/MIA - Digital Post Natal Records/Fiona Appleton_1946546288 09_06_2015.pdf): failed to open stream: No such file or directory
2

There are 2 answers

0
YaBCK On BEST ANSWER

I found out that I can use this:

$savedOutput = file_get_contents('SavedOutput.pdf');
file_put_contents('newSavedOutput.pdf', $saveOutput);

I save the PDF into a folder, then get the content and save it to the shared folder

13
Arun Saragadam On

If

//MIA_TEST/htdocs/SharedFolder

is a valid path. You should not be having any issues saving the PDF. PHP is not able to find the path you are specifying.

Try to do a simple

fopen("//MIA_TEST/htdocs/SharedFolder/sample.txt", "w");

If this works, your problem is solved. Please make sure the path is right. Also check if you have spaces in your destination path.

Output()

replaces spaces with underscores and removes sepcial characters. You might want to ensure everything is right wrt to these things.

http://www.tcpdf.org/doc/code/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1